summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormurilo ijanc2026-03-24 21:45:05 -0300
committermurilo ijanc2026-03-24 21:45:05 -0300
commit01c17c68277ff88fab812920732d9bbe9e6bb571 (patch)
tree035398ae34263b981b621c6275835d2cc6847d57
parentf186b71ca51e83837db60de13322394bb5e6d348 (diff)
downloadwebsite-01c17c68277ff88fab812920732d9bbe9e6bb571.tar.gz
Simplify website to single-pageHEADmain
Remove old Zola-generated content, keep only the essential landing page with about, contact, and license sections.
-rw-r--r--404.html.gzbin77 -> 0 bytes
-rw-r--r--about/index.html184
-rw-r--r--about/index.html.gzbin4350 -> 0 bytes
-rw-r--r--atom.xml1991
-rw-r--r--atom.xml.gzbin39589 -> 0 bytes
-rw-r--r--book/en/.nojekyll1
-rw-r--r--book/en/404.html228
-rw-r--r--book/en/404.html.gzbin5584 -> 0 bytes
-rw-r--r--book/en/ayu-highlight-3fdfc3ac.css77
-rw-r--r--book/en/ayu-highlight-3fdfc3ac.css.gzbin450 -> 0 bytes
-rw-r--r--book/en/book-a0b12cfe.js843
-rw-r--r--book/en/book-a0b12cfe.js.gzbin6624 -> 0 bytes
-rw-r--r--book/en/clipboard-1626706a.min.js7
-rw-r--r--book/en/clipboard-1626706a.min.js.gzbin3378 -> 0 bytes
-rw-r--r--book/en/commands/create.html329
-rw-r--r--book/en/commands/create.html.gzbin7137 -> 0 bytes
-rw-r--r--book/en/commands/export.html307
-rw-r--r--book/en/commands/export.html.gzbin7007 -> 0 bytes
-rw-r--r--book/en/commands/init.html288
-rw-r--r--book/en/commands/init.html.gzbin6556 -> 0 bytes
-rw-r--r--book/en/commands/list.html283
-rw-r--r--book/en/commands/list.html.gzbin6400 -> 0 bytes
-rw-r--r--book/en/commands/verify.html307
-rw-r--r--book/en/commands/verify.html.gzbin6697 -> 0 bytes
-rw-r--r--book/en/configuration.html390
-rw-r--r--book/en/configuration.html.gzbin7861 -> 0 bytes
-rw-r--r--book/en/css/chrome-ae938929.css756
-rw-r--r--book/en/css/chrome-ae938929.css.gzbin4616 -> 0 bytes
-rw-r--r--book/en/css/general-2459343d.css408
-rw-r--r--book/en/css/general-2459343d.css.gzbin3178 -> 0 bytes
-rw-r--r--book/en/css/print-9e4910d8.css50
-rw-r--r--book/en/css/print-9e4910d8.css.gzbin364 -> 0 bytes
-rw-r--r--book/en/css/variables-8adf115d.css383
-rw-r--r--book/en/css/variables-8adf115d.css.gzbin1951 -> 0 bytes
-rw-r--r--book/en/docker.html303
-rw-r--r--book/en/docker.html.gzbin6681 -> 0 bytes
-rw-r--r--book/en/elasticlunr-ef4e11c1.min.js10
-rw-r--r--book/en/elasticlunr-ef4e11c1.min.js.gzbin5522 -> 0 bytes
-rw-r--r--book/en/encryption.html294
-rw-r--r--book/en/encryption.html.gzbin7705 -> 0 bytes
-rw-r--r--book/en/favicon-bfbdfe47.pngbin6580 -> 0 bytes
-rw-r--r--book/en/fonts/OPEN-SANS-LICENSE.txt202
-rw-r--r--book/en/fonts/OPEN-SANS-LICENSE.txt.gzbin3990 -> 0 bytes
-rw-r--r--book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt93
-rw-r--r--book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt.gzbin2037 -> 0 bytes
-rw-r--r--book/en/fonts/fonts-9644e21d.css100
-rw-r--r--book/en/fonts/fonts-9644e21d.css.gzbin671 -> 0 bytes
-rw-r--r--book/en/fonts/open-sans-v17-all-charsets-300-7736aa35.woff2bin44352 -> 0 bytes
-rw-r--r--book/en/fonts/open-sans-v17-all-charsets-300italic-2c7b95c0.woff2bin40656 -> 0 bytes
-rw-r--r--book/en/fonts/open-sans-v17-all-charsets-600-486c6759.woff2bin44936 -> 0 bytes
-rw-r--r--book/en/fonts/open-sans-v17-all-charsets-600italic-1a3e8659.woff2bin42120 -> 0 bytes
-rw-r--r--book/en/fonts/open-sans-v17-all-charsets-700-c22fe8c7.woff2bin44988 -> 0 bytes
-rw-r--r--book/en/fonts/open-sans-v17-all-charsets-700italic-238ae959.woff2bin40800 -> 0 bytes
-rw-r--r--book/en/fonts/open-sans-v17-all-charsets-800-3d2c812a.woff2bin44536 -> 0 bytes
-rw-r--r--book/en/fonts/open-sans-v17-all-charsets-800italic-ba1521ec.woff2bin40812 -> 0 bytes
-rw-r--r--book/en/fonts/open-sans-v17-all-charsets-italic-6c9463f7.woff2bin41076 -> 0 bytes
-rw-r--r--book/en/fonts/open-sans-v17-all-charsets-regular-2e3b1d34.woff2bin43236 -> 0 bytes
-rw-r--r--book/en/fonts/source-code-pro-v11-all-charsets-500-2bdd9410.woff2bin59140 -> 0 bytes
-rw-r--r--book/en/heir-recovery.html314
-rw-r--r--book/en/heir-recovery.html.gzbin7852 -> 0 bytes
-rw-r--r--book/en/highlight-493f70e1.css83
-rw-r--r--book/en/highlight-493f70e1.css.gzbin589 -> 0 bytes
-rw-r--r--book/en/highlight-abc7f01d.js54
-rw-r--r--book/en/highlight-abc7f01d.js.gzbin46266 -> 0 bytes
-rw-r--r--book/en/images/logo.pngbin493569 -> 0 bytes
-rw-r--r--book/en/index.html288
-rw-r--r--book/en/index.html.gzbin7433 -> 0 bytes
-rw-r--r--book/en/installation.html397
-rw-r--r--book/en/installation.html.gzbin8165 -> 0 bytes
-rw-r--r--book/en/introduction.html288
-rw-r--r--book/en/introduction.html.gzbin7440 -> 0 bytes
-rw-r--r--book/en/mark-09e88c2c.min.js7
-rw-r--r--book/en/mark-09e88c2c.min.js.gzbin5978 -> 0 bytes
-rw-r--r--book/en/nat-traversal.html334
-rw-r--r--book/en/nat-traversal.html.gzbin8428 -> 0 bytes
-rw-r--r--book/en/network-concepts.html285
-rw-r--r--book/en/network-concepts.html.gzbin8046 -> 0 bytes
-rw-r--r--book/en/print.html1532
-rw-r--r--book/en/print.html.gzbin27509 -> 0 bytes
-rw-r--r--book/en/quick-start.html314
-rw-r--r--book/en/quick-start.html.gzbin7259 -> 0 bytes
-rw-r--r--book/en/replication.html319
-rw-r--r--book/en/replication.html.gzbin8620 -> 0 bytes
-rw-r--r--book/en/running-a-node.html314
-rw-r--r--book/en/running-a-node.html.gzbin7476 -> 0 bytes
-rw-r--r--book/en/searcher-c2a407aa.js555
-rw-r--r--book/en/searcher-c2a407aa.js.gzbin5292 -> 0 bytes
-rw-r--r--book/en/searchindex-ee09cfdc.js1
-rw-r--r--book/en/searchindex-ee09cfdc.js.gzbin57626 -> 0 bytes
-rw-r--r--book/en/theme/custom-eff59930.css44
-rw-r--r--book/en/theme/custom-eff59930.css.gzbin501 -> 0 bytes
-rw-r--r--book/en/toc-9150d087.js454
-rw-r--r--book/en/toc-9150d087.js.gzbin5453 -> 0 bytes
-rw-r--r--book/en/toc.html32
-rw-r--r--book/en/toc.html.gzbin1136 -> 0 bytes
-rw-r--r--book/en/tomorrow-night-4c0ae647.css104
-rw-r--r--book/en/tomorrow-night-4c0ae647.css.gzbin668 -> 0 bytes
-rw-r--r--book/pt-br/.nojekyll1
-rw-r--r--book/pt-br/404.html228
-rw-r--r--book/pt-br/404.html.gzbin5603 -> 0 bytes
-rw-r--r--book/pt-br/ayu-highlight-3fdfc3ac.css77
-rw-r--r--book/pt-br/ayu-highlight-3fdfc3ac.css.gzbin450 -> 0 bytes
-rw-r--r--book/pt-br/book-a0b12cfe.js843
-rw-r--r--book/pt-br/book-a0b12cfe.js.gzbin6624 -> 0 bytes
-rw-r--r--book/pt-br/clipboard-1626706a.min.js7
-rw-r--r--book/pt-br/clipboard-1626706a.min.js.gzbin3378 -> 0 bytes
-rw-r--r--book/pt-br/commands/create.html329
-rw-r--r--book/pt-br/commands/create.html.gzbin7281 -> 0 bytes
-rw-r--r--book/pt-br/commands/export.html307
-rw-r--r--book/pt-br/commands/export.html.gzbin7162 -> 0 bytes
-rw-r--r--book/pt-br/commands/init.html288
-rw-r--r--book/pt-br/commands/init.html.gzbin6653 -> 0 bytes
-rw-r--r--book/pt-br/commands/list.html283
-rw-r--r--book/pt-br/commands/list.html.gzbin6480 -> 0 bytes
-rw-r--r--book/pt-br/commands/verify.html307
-rw-r--r--book/pt-br/commands/verify.html.gzbin6795 -> 0 bytes
-rw-r--r--book/pt-br/configuration.html390
-rw-r--r--book/pt-br/configuration.html.gzbin8006 -> 0 bytes
-rw-r--r--book/pt-br/css/chrome-ae938929.css756
-rw-r--r--book/pt-br/css/chrome-ae938929.css.gzbin4616 -> 0 bytes
-rw-r--r--book/pt-br/css/general-2459343d.css408
-rw-r--r--book/pt-br/css/general-2459343d.css.gzbin3178 -> 0 bytes
-rw-r--r--book/pt-br/css/print-9e4910d8.css50
-rw-r--r--book/pt-br/css/print-9e4910d8.css.gzbin364 -> 0 bytes
-rw-r--r--book/pt-br/css/variables-8adf115d.css383
-rw-r--r--book/pt-br/css/variables-8adf115d.css.gzbin1951 -> 0 bytes
-rw-r--r--book/pt-br/docker.html303
-rw-r--r--book/pt-br/docker.html.gzbin6749 -> 0 bytes
-rw-r--r--book/pt-br/elasticlunr-ef4e11c1.min.js10
-rw-r--r--book/pt-br/elasticlunr-ef4e11c1.min.js.gzbin5522 -> 0 bytes
-rw-r--r--book/pt-br/encryption.html294
-rw-r--r--book/pt-br/encryption.html.gzbin7943 -> 0 bytes
-rw-r--r--book/pt-br/favicon-bfbdfe47.pngbin6580 -> 0 bytes
-rw-r--r--book/pt-br/fonts/OPEN-SANS-LICENSE.txt202
-rw-r--r--book/pt-br/fonts/OPEN-SANS-LICENSE.txt.gzbin3990 -> 0 bytes
-rw-r--r--book/pt-br/fonts/SOURCE-CODE-PRO-LICENSE.txt93
-rw-r--r--book/pt-br/fonts/SOURCE-CODE-PRO-LICENSE.txt.gzbin2037 -> 0 bytes
-rw-r--r--book/pt-br/fonts/fonts-9644e21d.css100
-rw-r--r--book/pt-br/fonts/fonts-9644e21d.css.gzbin671 -> 0 bytes
-rw-r--r--book/pt-br/fonts/open-sans-v17-all-charsets-300-7736aa35.woff2bin44352 -> 0 bytes
-rw-r--r--book/pt-br/fonts/open-sans-v17-all-charsets-300italic-2c7b95c0.woff2bin40656 -> 0 bytes
-rw-r--r--book/pt-br/fonts/open-sans-v17-all-charsets-600-486c6759.woff2bin44936 -> 0 bytes
-rw-r--r--book/pt-br/fonts/open-sans-v17-all-charsets-600italic-1a3e8659.woff2bin42120 -> 0 bytes
-rw-r--r--book/pt-br/fonts/open-sans-v17-all-charsets-700-c22fe8c7.woff2bin44988 -> 0 bytes
-rw-r--r--book/pt-br/fonts/open-sans-v17-all-charsets-700italic-238ae959.woff2bin40800 -> 0 bytes
-rw-r--r--book/pt-br/fonts/open-sans-v17-all-charsets-800-3d2c812a.woff2bin44536 -> 0 bytes
-rw-r--r--book/pt-br/fonts/open-sans-v17-all-charsets-800italic-ba1521ec.woff2bin40812 -> 0 bytes
-rw-r--r--book/pt-br/fonts/open-sans-v17-all-charsets-italic-6c9463f7.woff2bin41076 -> 0 bytes
-rw-r--r--book/pt-br/fonts/open-sans-v17-all-charsets-regular-2e3b1d34.woff2bin43236 -> 0 bytes
-rw-r--r--book/pt-br/fonts/source-code-pro-v11-all-charsets-500-2bdd9410.woff2bin59140 -> 0 bytes
-rw-r--r--book/pt-br/heir-recovery.html314
-rw-r--r--book/pt-br/heir-recovery.html.gzbin8118 -> 0 bytes
-rw-r--r--book/pt-br/highlight-493f70e1.css83
-rw-r--r--book/pt-br/highlight-493f70e1.css.gzbin589 -> 0 bytes
-rw-r--r--book/pt-br/highlight-abc7f01d.js54
-rw-r--r--book/pt-br/highlight-abc7f01d.js.gzbin46266 -> 0 bytes
-rw-r--r--book/pt-br/images/logo.pngbin493569 -> 0 bytes
-rw-r--r--book/pt-br/index.html288
-rw-r--r--book/pt-br/index.html.gzbin7613 -> 0 bytes
-rw-r--r--book/pt-br/installation.html397
-rw-r--r--book/pt-br/installation.html.gzbin8400 -> 0 bytes
-rw-r--r--book/pt-br/introduction.html288
-rw-r--r--book/pt-br/introduction.html.gzbin7620 -> 0 bytes
-rw-r--r--book/pt-br/mark-09e88c2c.min.js7
-rw-r--r--book/pt-br/mark-09e88c2c.min.js.gzbin5978 -> 0 bytes
-rw-r--r--book/pt-br/nat-traversal.html334
-rw-r--r--book/pt-br/nat-traversal.html.gzbin8590 -> 0 bytes
-rw-r--r--book/pt-br/network-concepts.html285
-rw-r--r--book/pt-br/network-concepts.html.gzbin8173 -> 0 bytes
-rw-r--r--book/pt-br/print.html1532
-rw-r--r--book/pt-br/print.html.gzbin29075 -> 0 bytes
-rw-r--r--book/pt-br/quick-start.html314
-rw-r--r--book/pt-br/quick-start.html.gzbin7433 -> 0 bytes
-rw-r--r--book/pt-br/replication.html319
-rw-r--r--book/pt-br/replication.html.gzbin8935 -> 0 bytes
-rw-r--r--book/pt-br/running-a-node.html314
-rw-r--r--book/pt-br/running-a-node.html.gzbin7573 -> 0 bytes
-rw-r--r--book/pt-br/searcher-c2a407aa.js555
-rw-r--r--book/pt-br/searcher-c2a407aa.js.gzbin5294 -> 0 bytes
-rw-r--r--book/pt-br/searchindex-3eaa3696.js1
-rw-r--r--book/pt-br/searchindex-3eaa3696.js.gzbin72565 -> 0 bytes
-rw-r--r--book/pt-br/theme/custom-eff59930.css44
-rw-r--r--book/pt-br/theme/custom-eff59930.css.gzbin501 -> 0 bytes
-rw-r--r--book/pt-br/toc-25102ebc.js454
-rw-r--r--book/pt-br/toc-25102ebc.js.gzbin5510 -> 0 bytes
-rw-r--r--book/pt-br/toc.html32
-rw-r--r--book/pt-br/toc.html.gzbin1192 -> 0 bytes
-rw-r--r--book/pt-br/tomorrow-night-4c0ae647.css104
-rw-r--r--book/pt-br/tomorrow-night-4c0ae647.css.gzbin668 -> 0 bytes
-rw-r--r--contact/index.html99
-rw-r--r--contact/index.html.gzbin1383 -> 0 bytes
-rw-r--r--faq/index.html120
-rw-r--r--faq/index.html.gzbin2410 -> 0 bytes
-rw-r--r--images/favicon.pngbin3207 -> 0 bytes
-rw-r--r--images/logo-128.pngbin32363 -> 0 bytes
-rw-r--r--images/logo-64.pngbin10381 -> 0 bytes
-rw-r--r--images/social.jpgbin155898 -> 0 bytes
-rw-r--r--index.html.gzbin1783 -> 0 bytes
-rw-r--r--news/atom.xml1991
-rw-r--r--news/atom.xml.gzbin39593 -> 0 bytes
-rw-r--r--news/cli-daemon-rpc/index.html142
-rw-r--r--news/cli-daemon-rpc/index.html.gzbin3219 -> 0 bytes
-rw-r--r--news/hello-world/index.html80
-rw-r--r--news/hello-world/index.html.gzbin1316 -> 0 bytes
-rw-r--r--news/index.html198
-rw-r--r--news/index.html.gzbin2530 -> 0 bytes
-rw-r--r--news/packaging-archlinux/index.html123
-rw-r--r--news/packaging-archlinux/index.html.gzbin2143 -> 0 bytes
-rw-r--r--news/packaging-debian/index.html157
-rw-r--r--news/packaging-debian/index.html.gzbin2548 -> 0 bytes
-rw-r--r--news/phase0-foundation/index.html125
-rw-r--r--news/phase0-foundation/index.html.gzbin2680 -> 0 bytes
-rw-r--r--news/phase1-basic-network/index.html173
-rw-r--r--news/phase1-basic-network/index.html.gzbin4056 -> 0 bytes
-rw-r--r--news/phase2-replication/index.html201
-rw-r--r--news/phase2-replication/index.html.gzbin4319 -> 0 bytes
-rw-r--r--news/phase3-api-and-apps/index.html163
-rw-r--r--news/phase3-api-and-apps/index.html.gzbin3930 -> 0 bytes
-rw-r--r--news/phase4-encryption-sealed/index.html178
-rw-r--r--news/phase4-encryption-sealed/index.html.gzbin4246 -> 0 bytes
-rw-r--r--news/phase4-institutional-onboarding/index.html239
-rw-r--r--news/phase4-institutional-onboarding/index.html.gzbin5539 -> 0 bytes
-rw-r--r--news/phase4-nat-traversal/index.html228
-rw-r--r--news/phase4-nat-traversal/index.html.gzbin5328 -> 0 bytes
-rw-r--r--news/phase4-performance-tuning/index.html164
-rw-r--r--news/phase4-performance-tuning/index.html.gzbin3854 -> 0 bytes
-rw-r--r--news/phase4-shamir-heir-recovery/index.html199
-rw-r--r--news/phase4-shamir-heir-recovery/index.html.gzbin4586 -> 0 bytes
-rw-r--r--news/phase4-storage-deduplication/index.html217
-rw-r--r--news/phase4-storage-deduplication/index.html.gzbin4807 -> 0 bytes
-rw-r--r--news/phase4-wasm-browser-verification/index.html192
-rw-r--r--news/phase4-wasm-browser-verification/index.html.gzbin4765 -> 0 bytes
-rw-r--r--news/reed-solomon/index.html200
-rw-r--r--news/reed-solomon/index.html.gzbin4736 -> 0 bytes
-rw-r--r--og-image.pngbin39629 -> 0 bytes
-rw-r--r--pt-br/about/index.html192
-rw-r--r--pt-br/about/index.html.gzbin4742 -> 0 bytes
-rw-r--r--pt-br/atom.xml2101
-rw-r--r--pt-br/atom.xml.gzbin42777 -> 0 bytes
-rw-r--r--pt-br/contact/index.html100
-rw-r--r--pt-br/contact/index.html.gzbin1463 -> 0 bytes
-rw-r--r--pt-br/faq/index.html121
-rw-r--r--pt-br/faq/index.html.gzbin2549 -> 0 bytes
-rw-r--r--pt-br/index.html101
-rw-r--r--pt-br/index.html.gzbin1944 -> 0 bytes
-rw-r--r--pt-br/news/atom.xml2101
-rw-r--r--pt-br/news/atom.xml.gzbin42802 -> 0 bytes
-rw-r--r--pt-br/news/cli-daemon-rpc/index.html147
-rw-r--r--pt-br/news/cli-daemon-rpc/index.html.gzbin3452 -> 0 bytes
-rw-r--r--pt-br/news/hello-world/index.html81
-rw-r--r--pt-br/news/hello-world/index.html.gzbin1398 -> 0 bytes
-rw-r--r--pt-br/news/index.html198
-rw-r--r--pt-br/news/index.html.gzbin2732 -> 0 bytes
-rw-r--r--pt-br/news/packaging-archlinux/index.html124
-rw-r--r--pt-br/news/packaging-archlinux/index.html.gzbin2262 -> 0 bytes
-rw-r--r--pt-br/news/packaging-debian/index.html159
-rw-r--r--pt-br/news/packaging-debian/index.html.gzbin2677 -> 0 bytes
-rw-r--r--pt-br/news/phase0-foundation/index.html130
-rw-r--r--pt-br/news/phase0-foundation/index.html.gzbin2885 -> 0 bytes
-rw-r--r--pt-br/news/phase1-basic-network/index.html177
-rw-r--r--pt-br/news/phase1-basic-network/index.html.gzbin4349 -> 0 bytes
-rw-r--r--pt-br/news/phase2-replication/index.html213
-rw-r--r--pt-br/news/phase2-replication/index.html.gzbin4668 -> 0 bytes
-rw-r--r--pt-br/news/phase3-api-and-apps/index.html167
-rw-r--r--pt-br/news/phase3-api-and-apps/index.html.gzbin4248 -> 0 bytes
-rw-r--r--pt-br/news/phase4-encryption-sealed/index.html187
-rw-r--r--pt-br/news/phase4-encryption-sealed/index.html.gzbin4633 -> 0 bytes
-rw-r--r--pt-br/news/phase4-institutional-onboarding/index.html252
-rw-r--r--pt-br/news/phase4-institutional-onboarding/index.html.gzbin5866 -> 0 bytes
-rw-r--r--pt-br/news/phase4-nat-traversal/index.html238
-rw-r--r--pt-br/news/phase4-nat-traversal/index.html.gzbin5590 -> 0 bytes
-rw-r--r--pt-br/news/phase4-performance-tuning/index.html169
-rw-r--r--pt-br/news/phase4-performance-tuning/index.html.gzbin4039 -> 0 bytes
-rw-r--r--pt-br/news/phase4-shamir-heir-recovery/index.html209
-rw-r--r--pt-br/news/phase4-shamir-heir-recovery/index.html.gzbin4927 -> 0 bytes
-rw-r--r--pt-br/news/phase4-storage-deduplication/index.html229
-rw-r--r--pt-br/news/phase4-storage-deduplication/index.html.gzbin5097 -> 0 bytes
-rw-r--r--pt-br/news/phase4-wasm-browser-verification/index.html199
-rw-r--r--pt-br/news/phase4-wasm-browser-verification/index.html.gzbin5122 -> 0 bytes
-rw-r--r--pt-br/news/reed-solomon/index.html210
-rw-r--r--pt-br/news/reed-solomon/index.html.gzbin5034 -> 0 bytes
-rw-r--r--pt-br/releases/index.html83
-rw-r--r--pt-br/releases/index.html.gzbin1342 -> 0 bytes
-rw-r--r--pt-br/subscriptions/index.html112
-rw-r--r--pt-br/subscriptions/index.html.gzbin1621 -> 0 bytes
-rw-r--r--releases/index.html83
-rw-r--r--releases/index.html.gzbin1264 -> 0 bytes
-rw-r--r--robots.txt4
-rw-r--r--robots.txt.gzbin97 -> 0 bytes
-rw-r--r--sitemap.xml173
-rw-r--r--sitemap.xml.gzbin608 -> 0 bytes
-rw-r--r--style.css182
-rw-r--r--style.css.gzbin904 -> 0 bytes
-rw-r--r--subscriptions/index.html111
-rw-r--r--subscriptions/index.html.gzbin1499 -> 0 bytes
295 files changed, 0 insertions, 38673 deletions
diff --git a/404.html.gz b/404.html.gz
deleted file mode 100644
index 700cfaa..0000000
--- a/404.html.gz
+++ /dev/null
Binary files differ
diff --git a/about/index.html b/about/index.html
deleted file mode 100644
index eb0c34e..0000000
--- a/about/index.html
+++ /dev/null
@@ -1,184 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>About — Tesseras</title>
- <meta name="description" content="Tesseras is a peer-to-peer network for preserving human memories across millennia — because your story deserves to outlive every platform.">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="About">
- <meta property="og:description" content="Tesseras is a peer-to-peer network for preserving human memories across millennia — because your story deserves to outlive every platform.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="About">
- <meta name="twitter:description" content="Tesseras is a peer-to-peer network for preserving human memories across millennia — because your story deserves to outlive every platform.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;about&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>About</h2>
- <p>Somewhere right now, a grandmother's photo album is dissolving in a flooded
-basement. A soldier's letters home exist only on a shuttered email service. A
-child's first words, recorded on a phone, will vanish when the cloud
-subscription lapses.</p>
-<p>We are the first generation in history that produces more memories than any
-civilization before us — and loses them faster than any civilization before us.</p>
-<h2 id="the-problem-no-one-talks-about">The Problem No One Talks About</h2>
-<p>Every platform you trust with your memories is temporary. Every company that
-promises "forever" is one quarterly report away from pivoting, selling, or
-shutting down. Every proprietary format is a ticking clock.</p>
-<ul>
-<li><strong>Google Photos, iCloud, OneDrive</strong> — your memories live on someone else's
-server, under someone else's terms of service, behind someone else's paywall</li>
-<li><strong>Social media</strong> — your life story is scattered across platforms that treat
-your memories as advertising inventory</li>
-<li><strong>Hard drives and USB sticks</strong> — they fail silently, with no warning and no
-backup</li>
-<li><strong>DVDs and CDs</strong> — already unreadable for most people</li>
-</ul>
-<p>The pattern is always the same: a format becomes popular, a company makes it
-easy, people pour their lives into it, and then it disappears. GeoCities. Vine.
-MySpace. Google+. The list grows every year.</p>
-<p>This is not a technology problem. It is a design problem. We keep building
-systems where memory preservation is a side effect of someone's business model,
-not the purpose.</p>
-<h2 id="what-tesseras-does-differently">What Tesseras Does Differently</h2>
-<p>Tesseras starts from a radical premise: <strong>your memories belong to you, and they
-should outlast every company, platform, and format that exists today.</strong></p>
-<p>A tessera is a self-contained time capsule — photos, audio, video, and text —
-packaged in a format designed to be understood centuries from now, without any
-special software.</p>
-<h3 id="no-servers-no-subscriptions-no-company">No Servers. No Subscriptions. No Company.</h3>
-<p>Tesseras is a peer-to-peer network built on mutual aid. You store fragments of
-other people's memories, and they store yours. No tokens, no blockchain, no
-monthly fees. The incentive is simple and human: I help preserve your story, you
-help preserve mine.</p>
-<h3 id="survives-anything">Survives Anything</h3>
-<p>Your tessera is protected by erasure coding — the same mathematics that keeps
-deep-space probes talking to Earth. Your data is split into redundant fragments
-and distributed across the network. Nodes can go offline, hard drives can fail,
-entire regions can lose connectivity — and your memories survive.</p>
-<h3 id="self-describing-format">Self-Describing Format</h3>
-<p>Every tessera carries within itself the instructions to be decoded. In plain
-text. In multiple languages. Even if every copy of the Tesseras software
-disappeared tomorrow, anyone with a basic understanding of computing could read
-your tessera. It is a file format designed for archaeologists, not just
-programmers.</p>
-<h3 id="post-quantum-cryptography">Post-Quantum Cryptography</h3>
-<p>Tesseras uses dual signatures — classical Ed25519 and post-quantum ML-DSA — so
-that the authenticity of your memories can be verified even after quantum
-computers render today's cryptography obsolete. We protect the future, today.</p>
-<h3 id="built-for-the-long-arc">Built for the Long Arc</h3>
-<p>Every decision in Tesseras is made with centuries in mind:</p>
-<ul>
-<li><strong>Simplest media formats</strong> — JPEG for photos, WAV for audio, WebM for video,
-plain text for writing. Not because they're the best, but because they'll be
-readable the longest.</li>
-<li><strong>No encryption by default</strong> — availability over secrecy. A memory that can't
-be decrypted is a memory that's lost. Private memories can be encrypted, but
-the default is survival.</li>
-<li><strong>No dependency on the internet</strong> — tesseras can be stored on USB drives,
-optical media, Raspberry Pis on a shelf, even low-power IoT devices. Any copy
-is a valid copy.</li>
-</ul>
-<h2 id="the-human-need">The Human Need</h2>
-<p>Humans have always preserved memories. Cave paintings in Lascaux. Clay tablets
-in Mesopotamia. Letters folded into books. Photo albums passed from parent to
-child.</p>
-<p>The desire to be remembered — to leave proof that we were here, that we loved,
-that we lived — is among the deepest human impulses. Every culture, in every
-era, has found ways to inscribe its existence into something more durable than a
-single lifetime.</p>
-<p>The digital age promised to make this easier. Instead, it made it fragile. We
-traded durability for convenience, and the cost is measured in lost childhoods,
-forgotten faces, and stories that no one will ever hear.</p>
-<p>Tesseras is an attempt to restore the ancient contract: <strong>what you choose to
-remember should endure.</strong></p>
-<h2 id="why-tesseras">Why "Tesseras"?</h2>
-<p>A <em>tessera</em> (plural <em>tesserae</em>) is a small piece of stone, glass, or ceramic
-used to compose a mosaic. The word comes from Latin, borrowed from the Greek
-<em>τέσσερα</em> — the tiny squares that, piece by piece, built the grand mosaics of
-Rome, Pompeii, and Byzantium.</p>
-<p>Some of those mosaics are still intact after two thousand years.</p>
-<p>The metaphor is the project: each tessera in our network is a small,
-self-contained fragment — individually simple, individually durable. But
-together, they compose something larger: a mosaic of human memory, distributed
-across thousands of nodes, resilient enough to outlast any single point of
-failure.</p>
-<p>Just as ancient tesserae needed no manual to be understood — a shard of colored
-stone speaks for itself — each digital tessera carries within it everything
-needed to be read, in plain formats, in plain language.</p>
-<p>The name is also a reminder of scale. A mosaic is not made in a day. It is
-assembled piece by piece, with patience, by many hands. That is how we intend to
-build a network that lasts.</p>
-<h2 id="open-source-open-protocol-open-future">Open Source, Open Protocol, Open Future</h2>
-<p>Tesseras is free software under the ISC license. The protocol is open. The
-format is documented. Anyone can run a node, build a client, or fork the entire
-project.</p>
-<p>There is no venture capital behind Tesseras. No growth metrics to hit. No exit
-strategy. Just a simple conviction: the technology to preserve human memory
-should not be owned by anyone.</p>
-<h2 id="current-status">Current Status</h2>
-<p>Tesseras is in Phase 4 — Resilience and Scale. The core format, cryptographic
-foundations, peer-to-peer network, active replication with erasure coding,
-GraphQL API, and Flutter app are built. We are now working on Shamir's Secret
-Sharing for heir key recovery, advanced NAT traversal, and performance tuning.</p>
-<p>This is a long-term project. We measure progress in decades, not quarters.</p>
-<h2 id="join-us">Join Us</h2>
-<p>If you believe that human memory is worth preserving — not as a product, not as
-a service, but as a fundamental right — we'd love your help.</p>
-<ul>
-<li>Read the <a href="/faq/">FAQ</a> to learn more</li>
-<li>Join the <a href="/subscriptions/">mailing lists</a> for updates</li>
-<li>Browse the <a rel="external" href="https://git.sr.ht/~ijanc/tesseras">source code</a></li>
-<li><a href="/contact/">Contact us</a> directly</li>
-</ul>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/about/index.html.gz b/about/index.html.gz
deleted file mode 100644
index 2250c11..0000000
--- a/about/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/atom.xml b/atom.xml
deleted file mode 100644
index 16042ba..0000000
--- a/atom.xml
+++ /dev/null
@@ -1,1991 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
- <title>Tesseras</title>
- <subtitle>P2P network for preserving human memories across millennia</subtitle>
- <link rel="self" type="application/atom+xml" href="https://tesseras.net/atom.xml"/>
- <link rel="alternate" type="text/html" href="https://tesseras.net"/>
- <generator uri="https://www.getzola.org/">Zola</generator>
- <updated>2026-02-16T10:00:00+00:00</updated>
- <id>https://tesseras.net/atom.xml</id>
- <entry xml:lang="en">
- <title>Packaging Tesseras for Debian</title>
- <published>2026-02-16T10:00:00+00:00</published>
- <updated>2026-02-16T10:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/packaging-debian/"/>
- <id>https://tesseras.net/news/packaging-debian/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/packaging-debian/">&lt;p&gt;Tesseras now ships a &lt;code&gt;.deb&lt;&#x2F;code&gt; package for Debian and Ubuntu. This post walks
-through building and installing the package from source using &lt;code&gt;cargo-deb&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;&#x2F;h2&gt;
-&lt;p&gt;You need a working Rust toolchain and the required system libraries:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo apt install build-essential pkg-config libsqlite3-dev
-rustup toolchain install stable
-cargo install cargo-deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;building&quot;&gt;Building&lt;&#x2F;h2&gt;
-&lt;p&gt;Clone the repository and run the &lt;code&gt;just deb&lt;&#x2F;code&gt; recipe:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git clone https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras
-cd tesseras
-just deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;This recipe does three things:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Compiles&lt;&#x2F;strong&gt; &lt;code&gt;tesd&lt;&#x2F;code&gt; (the daemon) and &lt;code&gt;tes&lt;&#x2F;code&gt; (the CLI) in release mode with
-&lt;code&gt;cargo build --release&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Generates shell completions&lt;&#x2F;strong&gt; for bash, zsh, and fish from the &lt;code&gt;tes&lt;&#x2F;code&gt; binary&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Packages&lt;&#x2F;strong&gt; everything into a &lt;code&gt;.deb&lt;&#x2F;code&gt; file with
-&lt;code&gt;cargo deb -p tesseras-daemon --no-build&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;The result is a &lt;code&gt;.deb&lt;&#x2F;code&gt; file in &lt;code&gt;target&#x2F;debian&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;installing&quot;&gt;Installing&lt;&#x2F;h2&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo dpkg -i target&#x2F;debian&#x2F;tesseras-daemon_*.deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;If there are missing dependencies, fix them with:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo apt install -f
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;post-install-setup&quot;&gt;Post-install setup&lt;&#x2F;h2&gt;
-&lt;p&gt;The &lt;code&gt;postinst&lt;&#x2F;code&gt; script automatically creates a &lt;code&gt;tesseras&lt;&#x2F;code&gt; system user and the
-data directory &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;. To use the CLI without sudo, add yourself to
-the group:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo usermod -aG tesseras $USER
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Log out and back in, then start the daemon:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo systemctl enable --now tesd
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;what-the-package-includes&quot;&gt;What the package includes&lt;&#x2F;h2&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Path&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tesd&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Full node daemon&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tes&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;CLI client&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;etc&#x2F;tesseras&#x2F;config.toml&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Default configuration (marked as conffile)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;lib&#x2F;systemd&#x2F;system&#x2F;tesd.service&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Systemd unit with security hardening&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Shell completions&lt;&#x2F;td&gt;&lt;td&gt;bash, zsh, and fish&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;h2 id=&quot;how-cargo-deb-works&quot;&gt;How cargo-deb works&lt;&#x2F;h2&gt;
-&lt;p&gt;The packaging metadata lives in &lt;code&gt;crates&#x2F;tesseras-daemon&#x2F;Cargo.toml&lt;&#x2F;code&gt; under
-&lt;code&gt;[package.metadata.deb]&lt;&#x2F;code&gt;. This section defines:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;depends&lt;&#x2F;strong&gt; — runtime dependencies: &lt;code&gt;libc6&lt;&#x2F;code&gt; and &lt;code&gt;libsqlite3-0&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;assets&lt;&#x2F;strong&gt; — files to include in the package (binaries, config, systemd unit,
-shell completions)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;conf-files&lt;&#x2F;strong&gt; — files treated as configuration (preserved on upgrade)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;maintainer-scripts&lt;&#x2F;strong&gt; — &lt;code&gt;postinst&lt;&#x2F;code&gt; and &lt;code&gt;postrm&lt;&#x2F;code&gt; scripts in
-&lt;code&gt;packaging&#x2F;debian&#x2F;scripts&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;systemd-units&lt;&#x2F;strong&gt; — automatic systemd integration&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;The &lt;code&gt;postinst&lt;&#x2F;code&gt; script creates the &lt;code&gt;tesseras&lt;&#x2F;code&gt; system user and data directory on
-install. The &lt;code&gt;postrm&lt;&#x2F;code&gt; script cleans up the user, group, and data directory only
-on &lt;code&gt;purge&lt;&#x2F;code&gt; (not on simple removal).&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;systemd-hardening&quot;&gt;Systemd hardening&lt;&#x2F;h2&gt;
-&lt;p&gt;The &lt;code&gt;tesd.service&lt;&#x2F;code&gt; unit includes security hardening directives:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;ini&quot;&gt;NoNewPrivileges=true
-ProtectSystem=strict
-ProtectHome=true
-ReadWritePaths=&#x2F;var&#x2F;lib&#x2F;tesseras
-PrivateTmp=true
-PrivateDevices=true
-ProtectKernelTunables=true
-ProtectControlGroups=true
-RestrictSUIDSGID=true
-MemoryDenyWriteExecute=true
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;The daemon runs as the unprivileged &lt;code&gt;tesseras&lt;&#x2F;code&gt; user and can only write to
-&lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;deploying-to-a-remote-server&quot;&gt;Deploying to a remote server&lt;&#x2F;h2&gt;
-&lt;p&gt;The justfile includes a &lt;code&gt;deploy&lt;&#x2F;code&gt; recipe for pushing the &lt;code&gt;.deb&lt;&#x2F;code&gt; to a remote host:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;just deploy bootstrap1.tesseras.net
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;This builds the &lt;code&gt;.deb&lt;&#x2F;code&gt;, copies it via &lt;code&gt;scp&lt;&#x2F;code&gt;, installs it with &lt;code&gt;dpkg -i&lt;&#x2F;code&gt;, and
-restarts the &lt;code&gt;tesd&lt;&#x2F;code&gt; service.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;
-&lt;p&gt;After pulling new changes, simply run &lt;code&gt;just deb&lt;&#x2F;code&gt; again and reinstall:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git pull
-just deb
-sudo dpkg -i target&#x2F;debian&#x2F;tesseras-daemon_*.deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Packaging Tesseras for Arch Linux</title>
- <published>2026-02-16T09:00:00+00:00</published>
- <updated>2026-02-16T09:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/packaging-archlinux/"/>
- <id>https://tesseras.net/news/packaging-archlinux/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/packaging-archlinux/">&lt;p&gt;Tesseras now ships a PKGBUILD for Arch Linux. This post walks through building
-and installing the package from source.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;&#x2F;h2&gt;
-&lt;p&gt;You need a working Rust toolchain and the base-devel group:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo pacman -S --needed base-devel sqlite
-rustup toolchain install stable
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;building&quot;&gt;Building&lt;&#x2F;h2&gt;
-&lt;p&gt;Clone the repository and run the &lt;code&gt;just arch&lt;&#x2F;code&gt; recipe:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git clone https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras
-cd tesseras
-just arch
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;This runs &lt;code&gt;makepkg -sf&lt;&#x2F;code&gt; inside &lt;code&gt;packaging&#x2F;archlinux&#x2F;&lt;&#x2F;code&gt;, which:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;prepare&lt;&#x2F;strong&gt; — fetches Cargo dependencies with &lt;code&gt;cargo fetch --locked&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;build&lt;&#x2F;strong&gt; — compiles &lt;code&gt;tesd&lt;&#x2F;code&gt; and &lt;code&gt;tes&lt;&#x2F;code&gt; (the CLI) in release mode&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;package&lt;&#x2F;strong&gt; — installs binaries, systemd service, sysusers&#x2F;tmpfiles configs,
-shell completions (bash, zsh, fish), and a default config file&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;The result is a &lt;code&gt;.pkg.tar.zst&lt;&#x2F;code&gt; file in &lt;code&gt;packaging&#x2F;archlinux&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;installing&quot;&gt;Installing&lt;&#x2F;h2&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo pacman -U packaging&#x2F;archlinux&#x2F;tesseras-*.pkg.tar.zst
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;post-install-setup&quot;&gt;Post-install setup&lt;&#x2F;h2&gt;
-&lt;p&gt;The package creates a &lt;code&gt;tesseras&lt;&#x2F;code&gt; system user and group automatically via
-systemd-sysusers. To use the CLI without sudo, add yourself to the group:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo usermod -aG tesseras $USER
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Log out and back in, then start the daemon:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo systemctl enable --now tesd
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;what-the-package-includes&quot;&gt;What the package includes&lt;&#x2F;h2&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Path&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tesd&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Full node daemon&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tes&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;CLI client&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;etc&#x2F;tesseras&#x2F;config.toml&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Default configuration (marked as backup)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;systemd&#x2F;system&#x2F;tesd.service&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Systemd unit with security hardening&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;sysusers.d&#x2F;tesseras.conf&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;System user definition&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;tmpfiles.d&#x2F;tesseras.conf&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Data directory &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Shell completions&lt;&#x2F;td&gt;&lt;td&gt;bash, zsh, and fish&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;h2 id=&quot;pkgbuild-details&quot;&gt;PKGBUILD details&lt;&#x2F;h2&gt;
-&lt;p&gt;The PKGBUILD builds directly from the local git checkout rather than downloading
-a source tarball. The &lt;code&gt;TESSERAS_ROOT&lt;&#x2F;code&gt; environment variable points makepkg to the
-workspace root. Cargo&#x27;s target directory is set to &lt;code&gt;$srcdir&#x2F;target&lt;&#x2F;code&gt; to keep
-build artifacts inside the makepkg sandbox.&lt;&#x2F;p&gt;
-&lt;p&gt;The package depends only on &lt;code&gt;sqlite&lt;&#x2F;code&gt; at runtime and &lt;code&gt;cargo&lt;&#x2F;code&gt; at build time.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;
-&lt;p&gt;After pulling new changes, simply run &lt;code&gt;just arch&lt;&#x2F;code&gt; again and reinstall:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git pull
-just arch
-sudo pacman -U packaging&#x2F;archlinux&#x2F;tesseras-*.pkg.tar.zst
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Storage Deduplication</title>
- <published>2026-02-15T23:00:00+00:00</published>
- <updated>2026-02-15T23:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-storage-deduplication/"/>
- <id>https://tesseras.net/news/phase4-storage-deduplication/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-storage-deduplication/">&lt;p&gt;When multiple tesseras share the same photo, the same audio clip, or the same
-fragment data, the old storage layer kept separate copies of each. On a node
-storing thousands of tesseras for the network, this duplication adds up fast.
-Phase 4 continues with storage deduplication: a content-addressable store (CAS)
-that ensures every unique piece of data is stored exactly once on disk,
-regardless of how many tesseras reference it.&lt;&#x2F;p&gt;
-&lt;p&gt;The design is simple and proven: hash the content with BLAKE3, use the hash as
-the filename, and maintain a reference count in SQLite. When two tesseras
-include the same 5 MB photo, one file exists on disk with a refcount of 2. When
-one tessera is deleted, the refcount drops to 1 and the file stays. When the
-last reference is released, a periodic sweep cleans up the orphan.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;CAS schema migration&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;migrations&#x2F;004_dedup.sql&lt;&#x2F;code&gt;) — Three
-new tables:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;cas_objects&lt;&#x2F;code&gt; — tracks every object in the store: BLAKE3 hash (primary key),
-byte size, reference count, and creation timestamp&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;blob_refs&lt;&#x2F;code&gt; — maps logical blob identifiers (tessera hash + memory hash +
-filename) to CAS hashes, replacing the old filesystem path convention&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;fragment_refs&lt;&#x2F;code&gt; — maps logical fragment identifiers (tessera hash + fragment
-index) to CAS hashes, replacing the old &lt;code&gt;fragments&#x2F;&lt;&#x2F;code&gt; directory layout&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Indexes on the hash columns ensure O(1) lookups during reads and reference
-counting.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CasStore&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;cas.rs&lt;&#x2F;code&gt;) — The core content-addressable
-storage engine. Files are stored under a two-level prefix directory:
-&lt;code&gt;&amp;lt;root&amp;gt;&#x2F;&amp;lt;2-char-hex-prefix&amp;gt;&#x2F;&amp;lt;full-hash&amp;gt;.blob&lt;&#x2F;code&gt;. The store provides five
-operations:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;put(hash, data)&lt;&#x2F;code&gt; — writes data to disk if not already present, increments
-refcount. Returns whether a dedup hit occurred.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;get(hash)&lt;&#x2F;code&gt; — reads data from disk by hash&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;release(hash)&lt;&#x2F;code&gt; — decrements refcount. If it reaches zero, the on-disk file is
-deleted immediately.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;contains(hash)&lt;&#x2F;code&gt; — checks existence without reading&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;ref_count(hash)&lt;&#x2F;code&gt; — returns the current reference count&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;All operations are atomic within a single SQLite transaction. The refcount is
-the source of truth — if the refcount says the object exists, the file must be
-on disk.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CAS-backed FsBlobStore&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;blob.rs&lt;&#x2F;code&gt;) — Rewritten to
-delegate all storage to the CAS. When a blob is written, its BLAKE3 hash is
-computed and passed to &lt;code&gt;cas.put()&lt;&#x2F;code&gt;. A row in &lt;code&gt;blob_refs&lt;&#x2F;code&gt; maps the logical path
-(tessera + memory + filename) to the CAS hash. Reads look up the CAS hash via
-&lt;code&gt;blob_refs&lt;&#x2F;code&gt; and fetch from &lt;code&gt;cas.get()&lt;&#x2F;code&gt;. Deleting a tessera releases all its blob
-references in a single transaction.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CAS-backed FsFragmentStore&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;fragment.rs&lt;&#x2F;code&gt;) — Same
-pattern for erasure-coded fragments. Each fragment&#x27;s BLAKE3 checksum is already
-computed during Reed-Solomon encoding, so it&#x27;s used directly as the CAS key.
-Fragment verification now checks the CAS hash instead of recomputing from
-scratch — if the CAS says the data is intact, it is.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Sweep garbage collector&lt;&#x2F;strong&gt; (&lt;code&gt;cas.rs:sweep()&lt;&#x2F;code&gt;) — A periodic GC pass that handles
-three edge cases the normal refcount path can&#x27;t:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Orphan files&lt;&#x2F;strong&gt; — files on disk with no corresponding row in &lt;code&gt;cas_objects&lt;&#x2F;code&gt;.
-Can happen after a crash mid-write. Files younger than 1 hour are skipped
-(grace period for in-flight writes); older orphans are deleted.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Leaked refcounts&lt;&#x2F;strong&gt; — rows in &lt;code&gt;cas_objects&lt;&#x2F;code&gt; with refcount zero that weren&#x27;t
-cleaned up (e.g., if the process died between decrementing and deleting).
-These rows are removed.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Idempotent&lt;&#x2F;strong&gt; — running sweep twice produces the same result.&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;The sweep is wired into the existing repair loop in &lt;code&gt;tesseras-replication&lt;&#x2F;code&gt;, so
-it runs automatically every 24 hours alongside fragment health checks.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Migration from old layout&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;migration.rs&lt;&#x2F;code&gt;) — A
-copy-first migration strategy that moves data from the old directory-based
-layout (&lt;code&gt;blobs&#x2F;&amp;lt;tessera&amp;gt;&#x2F;&amp;lt;memory&amp;gt;&#x2F;&amp;lt;file&amp;gt;&lt;&#x2F;code&gt; and
-&lt;code&gt;fragments&#x2F;&amp;lt;tessera&amp;gt;&#x2F;&amp;lt;index&amp;gt;.shard&lt;&#x2F;code&gt;) into the CAS. The migration:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;Checks the storage version in &lt;code&gt;storage_meta&lt;&#x2F;code&gt; (version 1 = old layout, version
-2 = CAS)&lt;&#x2F;li&gt;
-&lt;li&gt;Walks the old &lt;code&gt;blobs&#x2F;&lt;&#x2F;code&gt; and &lt;code&gt;fragments&#x2F;&lt;&#x2F;code&gt; directories&lt;&#x2F;li&gt;
-&lt;li&gt;Computes BLAKE3 hashes and inserts into CAS via &lt;code&gt;put()&lt;&#x2F;code&gt; — duplicates are
-automatically deduplicated&lt;&#x2F;li&gt;
-&lt;li&gt;Creates corresponding &lt;code&gt;blob_refs&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;fragment_refs&lt;&#x2F;code&gt; entries&lt;&#x2F;li&gt;
-&lt;li&gt;Removes old directories only after all data is safely in CAS&lt;&#x2F;li&gt;
-&lt;li&gt;Updates the storage version to 2&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;The migration runs on daemon startup, is idempotent (safe to re-run), and
-reports statistics: files migrated, duplicates found, bytes saved.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Prometheus metrics&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — Ten new metrics for
-observability:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metric&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_objects_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Total unique objects in the CAS&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_bytes_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Total bytes stored&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_dedup_hits_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Number of writes that found an existing object&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_bytes_saved_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bytes saved by deduplication&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_refcount_deletions_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Objects deleted when refcount reached zero&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_orphans_cleaned_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Orphan files removed by sweep&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_leaked_refs_cleaned_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Leaked refcount rows cleaned&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_skipped_young_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Young orphans skipped (grace period)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_duration_seconds&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Time spent in sweep GC&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;&lt;strong&gt;Property-based tests&lt;&#x2F;strong&gt; — Two proptest tests verify CAS invariants under random
-inputs:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;refcount_matches_actual_refs&lt;&#x2F;code&gt; — after N random put&#x2F;release operations, the
-refcount always matches the actual number of outstanding references&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;cas_path_is_deterministic&lt;&#x2F;code&gt; — the same hash always produces the same
-filesystem path&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Integration test updates&lt;&#x2F;strong&gt; — All integration tests across &lt;code&gt;tesseras-core&lt;&#x2F;code&gt;,
-&lt;code&gt;tesseras-replication&lt;&#x2F;code&gt;, &lt;code&gt;tesseras-embedded&lt;&#x2F;code&gt;, and &lt;code&gt;tesseras-cli&lt;&#x2F;code&gt; updated for the
-new CAS-backed constructors. Tamper-detection tests updated to work with the CAS
-directory layout.&lt;&#x2F;p&gt;
-&lt;p&gt;347 tests pass across the workspace. Clippy clean with &lt;code&gt;-D warnings&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 as CAS key&lt;&#x2F;strong&gt;: the content hash we already compute for integrity
-verification doubles as the deduplication key. No additional hashing step —
-the hash computed during &lt;code&gt;create&lt;&#x2F;code&gt; or &lt;code&gt;replicate&lt;&#x2F;code&gt; is reused as the CAS address.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;SQLite refcount over filesystem reflinks&lt;&#x2F;strong&gt;: we considered using
-filesystem-level copy-on-write (reflinks on btrfs&#x2F;XFS), but that would tie
-Tesseras to specific filesystems. SQLite refcounting works on any filesystem,
-including FAT32 on cheap USB drives and ext4 on Raspberry Pis.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Two-level hex prefix directories&lt;&#x2F;strong&gt;: storing all CAS objects in a flat
-directory would slow down filesystems with millions of entries. The
-&lt;code&gt;&amp;lt;2-char prefix&amp;gt;&#x2F;&lt;&#x2F;code&gt; split limits any single directory to ~65k entries before a
-second prefix level is needed. This matches the approach used by Git&#x27;s object
-store.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Grace period for orphan files&lt;&#x2F;strong&gt;: the sweep GC skips files younger than 1
-hour to avoid deleting objects that are being written by a concurrent
-operation. This is a pragmatic choice — it trades a small window of potential
-orphans for crash safety without requiring fsync or two-phase commit.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Copy-first migration&lt;&#x2F;strong&gt;: the migration copies data to CAS before removing old
-directories. If the process is interrupted, the old data is still intact and
-migration can be re-run. This is slower than moving files but guarantees no
-data loss.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Sweep in repair loop&lt;&#x2F;strong&gt;: rather than adding a separate GC timer, the CAS
-sweep piggybacks on the existing 24-hour repair loop. This keeps the daemon
-simple — one background maintenance cycle handles both fragment health and
-storage cleanup.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued&lt;&#x2F;strong&gt; — security audits, OS packaging (Alpine, Arch, Debian,
-OpenBSD, FreeBSD)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration
-(FamilySearch, Ancestry), physical media export (M-DISC, microfilm, acid-free
-paper with QR), AI-assisted context&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Storage deduplication completes the storage efficiency story for Tesseras. A
-node that stores fragments for thousands of users — common for institutional
-nodes and always-on full nodes — now pays the disk cost of unique data only.
-Combined with Reed-Solomon erasure coding (which already minimizes redundancy at
-the network level), the system achieves efficient storage at both the local and
-distributed layers.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Institutional Node Onboarding</title>
- <published>2026-02-15T22:00:00+00:00</published>
- <updated>2026-02-15T22:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-institutional-onboarding/"/>
- <id>https://tesseras.net/news/phase4-institutional-onboarding/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-institutional-onboarding/">&lt;p&gt;A P2P network of individuals is fragile. Hard drives die, phones get lost,
-people lose interest. The long-term survival of humanity&#x27;s memories depends on
-institutions — libraries, archives, museums, universities — that measure their
-lifetimes in centuries. Phase 4 continues with institutional node onboarding:
-verified organizations can now pledge storage, run searchable indexes, and
-participate in the network with a distinct identity.&lt;&#x2F;p&gt;
-&lt;p&gt;The design follows a principle of trust but verify: institutions identify
-themselves via DNS TXT records (the same mechanism used by SPF, DKIM, and DMARC
-for email), pledge a storage budget, and receive reciprocity exemptions so they
-can store fragments for others without expecting anything in return. In
-exchange, the network treats their fragments as higher-quality replicas and
-limits over-reliance on any single institution through diversity constraints.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Capability bits&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;network.rs&lt;&#x2F;code&gt;) — Two new flags added to
-the &lt;code&gt;Capabilities&lt;&#x2F;code&gt; bitfield: &lt;code&gt;INSTITUTIONAL&lt;&#x2F;code&gt; (bit 7) and &lt;code&gt;SEARCH_INDEX&lt;&#x2F;code&gt; (bit 8).
-A new &lt;code&gt;institutional_default()&lt;&#x2F;code&gt; constructor returns the full Phase 2 capability
-set plus these two bits and &lt;code&gt;RELAY&lt;&#x2F;code&gt;. Normal nodes advertise &lt;code&gt;phase2_default()&lt;&#x2F;code&gt;
-which lacks institutional flags. Serialization roundtrip tests verify the new
-bits survive MessagePack encoding.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Search types&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;search.rs&lt;&#x2F;code&gt;) — Three new domain types for
-the search subsystem:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;SearchFilters&lt;&#x2F;code&gt; — query parameters: &lt;code&gt;memory_type&lt;&#x2F;code&gt;, &lt;code&gt;visibility&lt;&#x2F;code&gt;, &lt;code&gt;language&lt;&#x2F;code&gt;,
-&lt;code&gt;date_range&lt;&#x2F;code&gt;, &lt;code&gt;geo&lt;&#x2F;code&gt; (bounding box), &lt;code&gt;page&lt;&#x2F;code&gt;, &lt;code&gt;page_size&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;SearchHit&lt;&#x2F;code&gt; — a single result: content hash plus a &lt;code&gt;MetadataExcerpt&lt;&#x2F;code&gt; (title,
-description, memory type, creation date, visibility, language, tags)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;GeoFilter&lt;&#x2F;code&gt; — bounding box with &lt;code&gt;min_lat&lt;&#x2F;code&gt;, &lt;code&gt;max_lat&lt;&#x2F;code&gt;, &lt;code&gt;min_lon&lt;&#x2F;code&gt;, &lt;code&gt;max_lon&lt;&#x2F;code&gt; for
-spatial queries&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;All types derive &lt;code&gt;Serialize&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Deserialize&lt;&#x2F;code&gt; for wire transport and
-&lt;code&gt;Clone&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Debug&lt;&#x2F;code&gt; for diagnostics.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Institutional daemon config&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;) — A new &lt;code&gt;[institutional]&lt;&#x2F;code&gt;
-TOML section with &lt;code&gt;domain&lt;&#x2F;code&gt; (the DNS domain to verify), &lt;code&gt;pledge_bytes&lt;&#x2F;code&gt; (storage
-commitment in bytes), and &lt;code&gt;search_enabled&lt;&#x2F;code&gt; (toggle for the FTS5 index). The
-&lt;code&gt;to_dht_config()&lt;&#x2F;code&gt; method now sets &lt;code&gt;Capabilities::institutional_default()&lt;&#x2F;code&gt; when
-institutional config is present, so institutional nodes advertise the right
-capability bits in Pong responses.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;DNS TXT verification&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;institutional.rs&lt;&#x2F;code&gt;) — Async DNS resolution
-using &lt;code&gt;hickory-resolver&lt;&#x2F;code&gt; to verify institutional identity. The daemon looks up
-&lt;code&gt;_tesseras.&amp;lt;domain&amp;gt;&lt;&#x2F;code&gt; TXT records and parses key-value fields: &lt;code&gt;v&lt;&#x2F;code&gt; (version),
-&lt;code&gt;node&lt;&#x2F;code&gt; (hex-encoded node ID), and &lt;code&gt;pledge&lt;&#x2F;code&gt; (storage pledge in bytes).
-Verification checks:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;A TXT record exists at &lt;code&gt;_tesseras.&amp;lt;domain&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;The &lt;code&gt;node&lt;&#x2F;code&gt; field matches the daemon&#x27;s own node ID&lt;&#x2F;li&gt;
-&lt;li&gt;The &lt;code&gt;pledge&lt;&#x2F;code&gt; field is present and valid&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;On startup, the daemon attempts DNS verification. If it succeeds, the node runs
-with institutional capabilities. If it fails, the node logs a warning and
-downgrades to a normal full node — no crash, no manual intervention.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CLI setup command&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;institutional.rs&lt;&#x2F;code&gt;) — A new
-&lt;code&gt;institutional setup&lt;&#x2F;code&gt; subcommand that guides operators through onboarding:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;Reads the node&#x27;s identity from the data directory&lt;&#x2F;li&gt;
-&lt;li&gt;Prompts for domain name and pledge size&lt;&#x2F;li&gt;
-&lt;li&gt;Generates the exact DNS TXT record to add:
-&lt;code&gt;v=tesseras1 node=&amp;lt;hex&amp;gt; pledge=&amp;lt;bytes&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;Writes the institutional section to the daemon&#x27;s config file&lt;&#x2F;li&gt;
-&lt;li&gt;Prints next steps: add the TXT record, restart the daemon&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;&lt;strong&gt;SQLite search index&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&lt;&#x2F;code&gt;) — A migration
-(&lt;code&gt;003_institutional.sql&lt;&#x2F;code&gt;) that creates three structures:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;search_content&lt;&#x2F;code&gt; — an FTS5 virtual table for full-text search over tessera
-metadata (title, description, creator, tags, language)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;geo_index&lt;&#x2F;code&gt; — an R-tree virtual table for spatial bounding-box queries over
-latitude&#x2F;longitude&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;geo_map&lt;&#x2F;code&gt; — a mapping table linking R-tree row IDs to content hashes&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;The &lt;code&gt;SqliteSearchIndex&lt;&#x2F;code&gt; adapter implements the &lt;code&gt;SearchIndex&lt;&#x2F;code&gt; port trait with
-&lt;code&gt;index_tessera()&lt;&#x2F;code&gt; (insert&#x2F;update) and &lt;code&gt;search()&lt;&#x2F;code&gt; (query with filters). FTS5
-queries support natural language search; geo queries use R-tree &lt;code&gt;INTERSECT&lt;&#x2F;code&gt; for
-bounding box lookups. Results are ranked by FTS5 relevance score.&lt;&#x2F;p&gt;
-&lt;p&gt;The migration also adds an &lt;code&gt;is_institutional&lt;&#x2F;code&gt; column to the &lt;code&gt;reciprocity&lt;&#x2F;code&gt; table,
-handled idempotently via &lt;code&gt;pragma_table_info&lt;&#x2F;code&gt; checks (SQLite&#x27;s
-&lt;code&gt;ALTER TABLE ADD COLUMN&lt;&#x2F;code&gt; lacks &lt;code&gt;IF NOT EXISTS&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Reciprocity bypass&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-replication&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) — Institutional
-nodes are exempt from reciprocity checks. When &lt;code&gt;receive_fragment()&lt;&#x2F;code&gt; is called,
-if the sender&#x27;s node ID is marked as institutional in the reciprocity ledger,
-the balance check is skipped entirely. This means institutions can store
-fragments for the entire network without needing to &quot;earn&quot; credits first — their
-DNS-verified identity and storage pledge serve as their credential.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Node-type diversity constraint&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-replication&#x2F;src&#x2F;distributor.rs&lt;&#x2F;code&gt;) —
-A new &lt;code&gt;apply_institutional_diversity()&lt;&#x2F;code&gt; function limits how many replicas of a
-single tessera can land on institutional nodes. The cap is
-&lt;code&gt;ceil(replication_factor &#x2F; 3.5)&lt;&#x2F;code&gt; — with the default &lt;code&gt;r=7&lt;&#x2F;code&gt;, at most 2 of 7
-replicas go to institutions. This prevents the network from becoming dependent
-on a small number of large institutions: if a university&#x27;s servers go down, at
-least 5 replicas remain on independent nodes.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;DHT message extensions&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;message.rs&lt;&#x2F;code&gt;) — Two new message
-variants:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Message&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;Search&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Client sends query string, filters, and page number&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;SearchResult&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Institutional node responds with hits and total count&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;The &lt;code&gt;encode()&lt;&#x2F;code&gt; function was switched from positional to named MessagePack
-serialization (&lt;code&gt;rmp_serde::to_vec_named&lt;&#x2F;code&gt;) to handle &lt;code&gt;SearchFilters&lt;&#x2F;code&gt;&#x27; optional
-fields correctly — positional encoding breaks when &lt;code&gt;skip_serializing_if&lt;&#x2F;code&gt; omits
-fields.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Prometheus metrics&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — Eight institutional-specific
-metrics:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_pledge_bytes&lt;&#x2F;code&gt; — configured storage pledge&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_stored_bytes&lt;&#x2F;code&gt; — actual bytes stored&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_pledge_utilization_ratio&lt;&#x2F;code&gt; — stored&#x2F;pledged ratio&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_peers_served&lt;&#x2F;code&gt; — unique peers served fragments&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_search_index_total&lt;&#x2F;code&gt; — tesseras in the search index&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_search_queries_total&lt;&#x2F;code&gt; — search queries received&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_dns_verification_status&lt;&#x2F;code&gt; — 1 if DNS verified, 0
-otherwise&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_dns_verification_last&lt;&#x2F;code&gt; — Unix timestamp of last
-verification&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Integration tests&lt;&#x2F;strong&gt; — Two tests in
-&lt;code&gt;tesseras-replication&#x2F;tests&#x2F;integration.rs&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;institutional_peer_bypasses_reciprocity&lt;&#x2F;code&gt; — verifies that an institutional
-peer with a massive deficit (-999,999 balance) is still allowed to store
-fragments, while a non-institutional peer with the same deficit is rejected&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;institutional_node_accepts_fragment_despite_deficit&lt;&#x2F;code&gt; — full async test using
-&lt;code&gt;ReplicationService&lt;&#x2F;code&gt; with mocked DHT, fragment store, reciprocity ledger, and
-blob store: sends a fragment from an institutional sender and verifies it&#x27;s
-accepted&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;322 tests pass across the workspace. Clippy clean with &lt;code&gt;-D warnings&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;DNS TXT over PKI or blockchain&lt;&#x2F;strong&gt;: DNS is universally deployed, universally
-understood, and already used for domain verification (SPF, DKIM, Let&#x27;s
-Encrypt). Institutions already manage DNS. No certificate authority, no token,
-no on-chain transaction — just a TXT record. If an institution loses control
-of their domain, the verification naturally fails on the next check.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Graceful degradation on DNS failure&lt;&#x2F;strong&gt;: if DNS verification fails at startup,
-the daemon downgrades to a normal full node instead of refusing to start. This
-prevents operational incidents — a DNS misconfiguration shouldn&#x27;t take a node
-offline.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Diversity cap at &lt;code&gt;ceil(r &#x2F; 3.5)&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: with &lt;code&gt;r=7&lt;&#x2F;code&gt;, at most 2 replicas go to
-institutions. This is conservative — it ensures the network never depends on
-institutions for majority quorum, while still benefiting from their storage
-capacity and uptime.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Named MessagePack encoding&lt;&#x2F;strong&gt;: switching from positional to named encoding
-adds ~15% overhead per message but eliminates a class of serialization bugs
-when optional fields are present. The DHT is not bandwidth-constrained at the
-message level, so the tradeoff is worth it.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reciprocity exemption over credit grants&lt;&#x2F;strong&gt;: rather than giving institutions
-a large initial credit balance (which is arbitrary and needs tuning), we
-exempt them entirely. Their DNS-verified identity and public storage pledge
-replace the bilateral reciprocity mechanism.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;FTS5 + R-tree in SQLite&lt;&#x2F;strong&gt;: full-text search and spatial indexing are built
-into SQLite as loadable extensions. No external search engine (Elasticsearch,
-Meilisearch) needed. This keeps the deployment a single binary with a single
-database file — critical for institutional operators who may not have a DevOps
-team.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued&lt;&#x2F;strong&gt; — storage deduplication (content-addressable store with
-BLAKE3 keying), security audits, OS packaging (Alpine, Arch, Debian, OpenBSD,
-FreeBSD)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration
-(FamilySearch, Ancestry), physical media export (M-DISC, microfilm, acid-free
-paper with QR), AI-assisted context&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Institutional onboarding closes a critical gap in Tesseras&#x27; preservation model.
-Individual nodes provide grassroots resilience — thousands of devices across the
-globe, each storing a few fragments. Institutional nodes provide anchoring —
-organizations with professional infrastructure, redundant storage, and
-multi-decade operational horizons. Together, they form a network where memories
-can outlast both individual devices and individual institutions.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Performance Tuning</title>
- <published>2026-02-15T20:00:00+00:00</published>
- <updated>2026-02-15T20:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-performance-tuning/"/>
- <id>https://tesseras.net/news/phase4-performance-tuning/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-performance-tuning/">&lt;p&gt;A P2P network that can traverse NATs but chokes on its own I&#x2F;O is not much use.
-Phase 4 continues with performance tuning: centralizing database configuration,
-caching fragment blobs in memory, managing QUIC connection lifecycles, and
-eliminating unnecessary disk reads from the attestation hot path.&lt;&#x2F;p&gt;
-&lt;p&gt;The guiding principle was the same as the rest of Tesseras: do the simplest
-thing that actually works. No custom allocators, no lock-free data structures,
-no premature complexity. A centralized &lt;code&gt;StorageConfig&lt;&#x2F;code&gt;, an LRU cache, a
-connection reaper, and a targeted fix to avoid re-reading blobs that were
-already checksummed.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Centralized SQLite configuration&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;database.rs&lt;&#x2F;code&gt;) — A
-new &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; struct and &lt;code&gt;open_database()&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;open_in_memory()&lt;&#x2F;code&gt; functions
-that apply all SQLite pragmas in one place: WAL journal mode, foreign keys,
-synchronous mode (NORMAL by default, FULL for unstable hardware like RPi + SD
-card), busy timeout, page cache size, and WAL autocheckpoint interval.
-Previously, each call site opened a connection and applied pragmas ad hoc. Now
-the daemon, CLI, and tests all go through the same path. 7 tests covering
-foreign keys, busy timeout, journal mode, migrations, synchronous modes, and
-on-disk WAL file creation.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;LRU fragment cache&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;cache.rs&lt;&#x2F;code&gt;) — A
-&lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt; that wraps any &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; with a byte-aware LRU
-cache. Fragment blobs are cached on read and invalidated on write or delete.
-When the cache exceeds its configured byte limit, the least recently used
-entries are evicted. The cache is transparent: it implements &lt;code&gt;FragmentStore&lt;&#x2F;code&gt;
-itself, so the rest of the stack doesn&#x27;t know it&#x27;s there. Optional Prometheus
-metrics track hits, misses, and current byte usage. 3 tests: cache hit avoids
-inner read, store invalidates cache, eviction when over max bytes.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Prometheus storage metrics&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — A
-&lt;code&gt;StorageMetrics&lt;&#x2F;code&gt; struct with three counters&#x2F;gauges: &lt;code&gt;fragment_cache_hits&lt;&#x2F;code&gt;,
-&lt;code&gt;fragment_cache_misses&lt;&#x2F;code&gt;, and &lt;code&gt;fragment_cache_bytes&lt;&#x2F;code&gt;. Registered with the
-Prometheus registry and wired into the fragment cache via &lt;code&gt;with_metrics()&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Attestation hot path fix&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-replication&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) — The
-attestation flow previously read every fragment blob from disk and recomputed
-its BLAKE3 checksum. Since &lt;code&gt;list_fragments()&lt;&#x2F;code&gt; already returns &lt;code&gt;FragmentId&lt;&#x2F;code&gt; with
-a stored checksum, the fix is trivial: use &lt;code&gt;frag.checksum&lt;&#x2F;code&gt; instead of
-&lt;code&gt;blake3::hash(&amp;amp;data)&lt;&#x2F;code&gt;. This eliminates one disk read per fragment during
-attestation — for a tessera with 100 fragments, that&#x27;s 100 fewer reads. A test
-with &lt;code&gt;expect_read_fragment().never()&lt;&#x2F;code&gt; verifies no blob reads happen during
-attestation.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;QUIC connection pool lifecycle&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;quinn_transport.rs&lt;&#x2F;code&gt;) — A
-&lt;code&gt;PoolConfig&lt;&#x2F;code&gt; struct controlling max connections, idle timeout, and reaper
-interval. &lt;code&gt;PooledConnection&lt;&#x2F;code&gt; wraps each &lt;code&gt;quinn::Connection&lt;&#x2F;code&gt; with a &lt;code&gt;last_used&lt;&#x2F;code&gt;
-timestamp. When the pool reaches capacity, the oldest idle connection is evicted
-before opening a new one. A background reaper task (Tokio spawn) periodically
-closes connections that have been idle beyond the timeout. 4 new pool metrics:
-&lt;code&gt;tesseras_conn_pool_size&lt;&#x2F;code&gt;, &lt;code&gt;pool_hits_total&lt;&#x2F;code&gt;, &lt;code&gt;pool_misses_total&lt;&#x2F;code&gt;,
-&lt;code&gt;pool_evictions_total&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Daemon integration&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;, &lt;code&gt;main.rs&lt;&#x2F;code&gt;) — A new &lt;code&gt;[performance]&lt;&#x2F;code&gt;
-section in the TOML config with fields for SQLite cache size, synchronous mode,
-busy timeout, fragment cache size, max connections, idle timeout, and reaper
-interval. The daemon&#x27;s &lt;code&gt;main()&lt;&#x2F;code&gt; now calls &lt;code&gt;open_database()&lt;&#x2F;code&gt; with the configured
-&lt;code&gt;StorageConfig&lt;&#x2F;code&gt;, wraps &lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt; with &lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt;, and binds
-QUIC with the configured &lt;code&gt;PoolConfig&lt;&#x2F;code&gt;. The direct &lt;code&gt;rusqlite&lt;&#x2F;code&gt; dependency was
-removed from the daemon crate.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CLI migration&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;commands&#x2F;init.rs&lt;&#x2F;code&gt;, &lt;code&gt;create.rs&lt;&#x2F;code&gt;) — Both
-&lt;code&gt;init&lt;&#x2F;code&gt; and &lt;code&gt;create&lt;&#x2F;code&gt; commands now use &lt;code&gt;tesseras_storage::open_database()&lt;&#x2F;code&gt; with
-the default &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; instead of opening raw &lt;code&gt;rusqlite&lt;&#x2F;code&gt; connections. The
-&lt;code&gt;rusqlite&lt;&#x2F;code&gt; dependency was removed from the CLI crate.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Decorator pattern for caching&lt;&#x2F;strong&gt;: &lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt; wraps
-&lt;code&gt;Box&amp;lt;dyn FragmentStore&amp;gt;&lt;&#x2F;code&gt; and implements &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; itself. This means
-caching is opt-in, composable, and invisible to consumers. The daemon enables
-it; tests can skip it.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Byte-aware eviction&lt;&#x2F;strong&gt;: the LRU cache tracks total bytes, not entry count.
-Fragment blobs vary wildly in size (a 4KB text fragment vs a 2MB photo shard),
-so counting entries would give a misleading picture of memory usage.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;No connection pool crate&lt;&#x2F;strong&gt;: instead of pulling in a generic pool library,
-the connection pool is a thin wrapper around
-&lt;code&gt;DashMap&amp;lt;SocketAddr, PooledConnection&amp;gt;&lt;&#x2F;code&gt; with a Tokio reaper. QUIC connections
-are multiplexed, so the &quot;pool&quot; is really about lifecycle management (idle
-cleanup, max connections) rather than borrowing&#x2F;returning.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Stored checksums over re-reads&lt;&#x2F;strong&gt;: the attestation fix is intentionally
-minimal — one line changed, one disk read removed per fragment. The checksums
-were already stored in SQLite by &lt;code&gt;store_fragment()&lt;&#x2F;code&gt;, they just weren&#x27;t being
-used.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Centralized pragma configuration&lt;&#x2F;strong&gt;: a single &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; struct replaces
-scattered &lt;code&gt;PRAGMA&lt;&#x2F;code&gt; calls. The &lt;code&gt;sqlite_synchronous_full&lt;&#x2F;code&gt; flag exists
-specifically for Raspberry Pi deployments where the kernel can crash and lose
-un-checkpointed WAL transactions.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued&lt;&#x2F;strong&gt; — Shamir&#x27;s Secret Sharing for heirs, sealed tesseras
-(time-lock encryption), security audits, institutional node onboarding,
-storage deduplication, OS packaging&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;With performance tuning in place, Tesseras handles the common case efficiently:
-fragment reads hit the LRU cache, attestation skips disk I&#x2F;O, idle QUIC
-connections are reaped automatically, and SQLite is configured consistently
-across the entire stack. The next steps focus on cryptographic features (Shamir,
-time-lock) and hardening for production deployment.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Verify Without Installing Anything</title>
- <published>2026-02-15T20:00:00+00:00</published>
- <updated>2026-02-15T20:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-wasm-browser-verification/"/>
- <id>https://tesseras.net/news/phase4-wasm-browser-verification/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-wasm-browser-verification/">&lt;p&gt;Trust shouldn&#x27;t require installing software. If someone sends you a tessera — a
-bundle of preserved memories — you should be able to verify it&#x27;s genuine and
-unmodified without downloading an app, creating an account, or trusting a
-server. That&#x27;s what &lt;code&gt;tesseras-wasm&lt;&#x2F;code&gt; delivers: drag a tessera archive into a web
-page, and cryptographic verification happens entirely in your browser.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-wasm&lt;&#x2F;strong&gt; — A Rust crate that compiles to WebAssembly via wasm-pack,
-exposing four stateless functions to JavaScript. The crate depends on
-&lt;code&gt;tesseras-core&lt;&#x2F;code&gt; for manifest parsing and calls cryptographic primitives directly
-(blake3, ed25519-dalek) rather than depending on &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt;, which pulls
-in C-based post-quantum libraries that don&#x27;t compile to
-&lt;code&gt;wasm32-unknown-unknown&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;parse_manifest&lt;&#x2F;code&gt; takes raw MANIFEST bytes (UTF-8 plain text, not MessagePack),
-delegates to &lt;code&gt;tesseras_core::manifest::Manifest::parse()&lt;&#x2F;code&gt;, and returns a JSON
-string with the creator&#x27;s Ed25519 public key, signature file paths, and a list
-of files with their expected BLAKE3 hashes, sizes, and MIME types. Internal
-structs (&lt;code&gt;ManifestJson&lt;&#x2F;code&gt;, &lt;code&gt;CreatorPubkey&lt;&#x2F;code&gt;, &lt;code&gt;SignatureFiles&lt;&#x2F;code&gt;, &lt;code&gt;FileEntry&lt;&#x2F;code&gt;) are
-serialized with serde_json. The ML-DSA public key and signature file fields are
-present in the JSON contract but set to &lt;code&gt;null&lt;&#x2F;code&gt; — ready for when post-quantum
-signing is implemented on the native side.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;hash_blake3&lt;&#x2F;code&gt; computes a BLAKE3 hash of arbitrary bytes and returns a
-64-character hex string. It&#x27;s called once per file in the tessera to verify
-integrity against the MANIFEST.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;verify_ed25519&lt;&#x2F;code&gt; takes a message, a 64-byte signature, and a 32-byte public key,
-constructs an &lt;code&gt;ed25519_dalek::VerifyingKey&lt;&#x2F;code&gt;, and returns whether the signature
-is valid. Length validation returns descriptive errors (&quot;Ed25519 public key must
-be 32 bytes&quot;) rather than panicking.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;verify_ml_dsa&lt;&#x2F;code&gt; is a stub that returns an error explaining ML-DSA verification
-is not yet available. This is deliberate: the &lt;code&gt;ml-dsa&lt;&#x2F;code&gt; crate on crates.io is
-v0.1.0-rc.7 (pre-release), and &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt; uses &lt;code&gt;pqcrypto-dilithium&lt;&#x2F;code&gt;
-(C-based CRYSTALS-Dilithium) which is byte-incompatible with FIPS 204 ML-DSA.
-Both sides need to use the same pure Rust implementation before
-cross-verification works. Ed25519 verification is sufficient — every tessera is
-Ed25519-signed.&lt;&#x2F;p&gt;
-&lt;p&gt;All four functions use a two-layer pattern for testability: inner functions
-return &lt;code&gt;Result&amp;lt;T, String&amp;gt;&lt;&#x2F;code&gt; and are tested natively, while thin &lt;code&gt;#[wasm_bindgen]&lt;&#x2F;code&gt;
-wrappers convert errors to &lt;code&gt;JsError&lt;&#x2F;code&gt;. This avoids &lt;code&gt;JsError::new()&lt;&#x2F;code&gt; panicking on
-non-WASM targets during testing.&lt;&#x2F;p&gt;
-&lt;p&gt;The compiled WASM binary is 109 KB raw and 44 KB gzipped — well under the 200 KB
-budget. wasm-opt applies &lt;code&gt;-Oz&lt;&#x2F;code&gt; optimization after wasm-pack builds with
-&lt;code&gt;opt-level = &quot;z&quot;&lt;&#x2F;code&gt;, LTO, and single codegen unit.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;@tesseras&#x2F;verify&lt;&#x2F;strong&gt; — A TypeScript npm package (&lt;code&gt;crates&#x2F;tesseras-wasm&#x2F;js&#x2F;&lt;&#x2F;code&gt;)
-that orchestrates browser-side verification. The public API is a single
-function:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;typescript&quot;&gt;async function verifyTessera(
- archive: Uint8Array,
- onProgress?: (current: number, total: number, file: string) =&amp;gt; void
-): Promise&amp;lt;VerificationResult&amp;gt;
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;The &lt;code&gt;VerificationResult&lt;&#x2F;code&gt; type provides everything a UI needs: overall validity,
-tessera hash, creator public keys, signature status (valid&#x2F;invalid&#x2F;missing for
-both Ed25519 and ML-DSA), per-file integrity results with expected and actual
-hashes, a list of unexpected files not in the MANIFEST, and an errors array.&lt;&#x2F;p&gt;
-&lt;p&gt;Archive unpacking (&lt;code&gt;unpack.ts&lt;&#x2F;code&gt;) handles three formats: gzip-compressed tar
-(detected by &lt;code&gt;\x1f\x8b&lt;&#x2F;code&gt; magic bytes, decompressed with fflate then parsed as
-tar), ZIP (&lt;code&gt;PK\x03\x04&lt;&#x2F;code&gt; magic, unpacked with fflate&#x27;s &lt;code&gt;unzipSync&lt;&#x2F;code&gt;), and raw tar
-(&lt;code&gt;ustar&lt;&#x2F;code&gt; at offset 257). A &lt;code&gt;normalizePath&lt;&#x2F;code&gt; function strips the leading
-&lt;code&gt;tessera-&amp;lt;hash&amp;gt;&#x2F;&lt;&#x2F;code&gt; prefix so internal paths match MANIFEST entries.&lt;&#x2F;p&gt;
-&lt;p&gt;Verification runs in a Web Worker (&lt;code&gt;worker.ts&lt;&#x2F;code&gt;) to keep the UI thread
-responsive. The worker initializes the WASM module, unpacks the archive, parses
-the MANIFEST, verifies the Ed25519 signature against the creator&#x27;s public key,
-then hashes each file with BLAKE3 and compares against expected values. Progress
-messages stream back to the main thread after each file. If any signature is
-invalid, verification stops early without hashing files — failing fast on the
-most critical check.&lt;&#x2F;p&gt;
-&lt;p&gt;The archive is transferred to the worker with zero-copy
-(&lt;code&gt;worker.postMessage({ type: &quot;verify&quot;, archive }, [archive.buffer])&lt;&#x2F;code&gt;) to avoid
-duplicating potentially large tessera files in memory.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Build pipeline&lt;&#x2F;strong&gt; — Three new justfile targets: &lt;code&gt;wasm-build&lt;&#x2F;code&gt; runs wasm-pack
-with &lt;code&gt;--target web --release&lt;&#x2F;code&gt; and optimizes with wasm-opt; &lt;code&gt;wasm-size&lt;&#x2F;code&gt; reports
-raw and gzipped binary size; &lt;code&gt;test-wasm&lt;&#x2F;code&gt; runs the native test suite.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Tests&lt;&#x2F;strong&gt; — 9 native unit tests cover BLAKE3 hashing (empty input, known value),
-Ed25519 verification (valid signature, invalid signature, wrong key, bad key
-length), and MANIFEST parsing (valid manifest, invalid UTF-8, garbage input). 3
-WASM integration tests run in headless Chrome via
-&lt;code&gt;wasm-pack test --headless --chrome&lt;&#x2F;code&gt;, verifying that &lt;code&gt;hash_blake3&lt;&#x2F;code&gt;,
-&lt;code&gt;verify_ed25519&lt;&#x2F;code&gt;, and &lt;code&gt;parse_manifest&lt;&#x2F;code&gt; work correctly when compiled to
-&lt;code&gt;wasm32-unknown-unknown&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;No tesseras-crypto dependency&lt;&#x2F;strong&gt;: the WASM crate calls blake3 and
-ed25519-dalek directly. &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt; depends on &lt;code&gt;pqcrypto-kyber&lt;&#x2F;code&gt; (C-based
-ML-KEM via pqcrypto-traits) which requires a C compiler toolchain and doesn&#x27;t
-target wasm32. By depending only on pure Rust crates, the WASM build has zero
-C dependencies and compiles cleanly to WebAssembly.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ML-DSA deferred, not faked&lt;&#x2F;strong&gt;: rather than silently skipping post-quantum
-verification, the stub returns an explicit error. This ensures that if a
-tessera contains an ML-DSA signature, the verification result will report
-&lt;code&gt;ml_dsa: &quot;missing&quot;&lt;&#x2F;code&gt; rather than pretending it was checked. The JS orchestrator
-handles this gracefully — a tessera is valid if Ed25519 passes and ML-DSA is
-missing (not yet implemented on either side).&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Inner function pattern&lt;&#x2F;strong&gt;: &lt;code&gt;JsError&lt;&#x2F;code&gt; cannot be constructed on non-WASM
-targets (it panics). Splitting each function into
-&lt;code&gt;foo_inner() -&amp;gt; Result&amp;lt;T, String&amp;gt;&lt;&#x2F;code&gt; and &lt;code&gt;foo() -&amp;gt; Result&amp;lt;T, JsError&amp;gt;&lt;&#x2F;code&gt; lets the
-native test suite exercise all logic without touching JavaScript types. The
-WASM integration tests in headless Chrome test the full &lt;code&gt;#[wasm_bindgen]&lt;&#x2F;code&gt;
-surface.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Web Worker isolation&lt;&#x2F;strong&gt;: cryptographic operations (especially BLAKE3 over
-large media files) can take hundreds of milliseconds. Running in a Worker
-prevents UI jank. The streaming progress protocol
-(&lt;code&gt;{ type: &quot;progress&quot;, current, total, file }&lt;&#x2F;code&gt;) lets the UI show a progress bar
-during verification of tesseras with many files.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Zero-copy transfer&lt;&#x2F;strong&gt;: &lt;code&gt;archive.buffer&lt;&#x2F;code&gt; is transferred to the Worker, not
-copied. For a 50 MB tessera archive, this avoids doubling memory usage during
-verification.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Plain text MANIFEST, not MessagePack&lt;&#x2F;strong&gt;: the WASM crate parses the same
-plain-text MANIFEST format as the CLI. This is by design — the MANIFEST is the
-tessera&#x27;s Rosetta Stone, readable by anyone with a text editor. The
-&lt;code&gt;rmp-serde&lt;&#x2F;code&gt; dependency in the Cargo.toml is not used and will be removed.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4: Resilience and Scale&lt;&#x2F;strong&gt; — OS packaging (Alpine, Arch, Debian,
-FreeBSD, OpenBSD), CI on SourceHut and GitHub Actions, security audits,
-browser-based tessera explorer at tesseras.net using @tesseras&#x2F;verify&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — Public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Verification no longer requires trust in software. A tessera archive dropped
-into a browser is verified with the same cryptographic rigor as the CLI — same
-BLAKE3 hashes, same Ed25519 signatures, same MANIFEST parser. The difference is
-that now anyone can do it.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Punching Through NATs</title>
- <published>2026-02-15T18:00:00+00:00</published>
- <updated>2026-02-15T18:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-nat-traversal/"/>
- <id>https://tesseras.net/news/phase4-nat-traversal/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-nat-traversal/">&lt;p&gt;Most people&#x27;s devices sit behind a NAT — a network address translator that lets
-them reach the internet but prevents incoming connections. For a P2P network,
-this is an existential problem: if two nodes behind NATs can&#x27;t talk to each
-other, the network fragments. Phase 4 continues with a full NAT traversal stack:
-STUN-based discovery, coordinated hole punching, and relay fallback.&lt;&#x2F;p&gt;
-&lt;p&gt;The approach follows the same pattern as most battle-tested P2P systems (WebRTC,
-BitTorrent, IPFS): try the cheapest option first, escalate only when necessary.
-Direct connectivity costs nothing. Hole punching costs a few coordinated
-packets. Relaying costs sustained bandwidth from a third party. Tesseras tries
-them in that order.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;NatType classification&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;network.rs&lt;&#x2F;code&gt;) — A new &lt;code&gt;NatType&lt;&#x2F;code&gt;
-enum (Public, Cone, Symmetric, Unknown) added to the core domain layer. This
-type is shared across the entire stack: the STUN client writes it, the DHT
-advertises it in Pong messages, and the punch coordinator reads it to decide
-whether hole punching is even worth attempting (Cone-to-Cone works ~80% of the
-time; Symmetric-to-Symmetric almost never works).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;STUN client&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;stun.rs&lt;&#x2F;code&gt;) — A minimal STUN implementation
-(RFC 5389 Binding Request&#x2F;Response) that discovers a node&#x27;s external address.
-The codec encodes 20-byte binding requests with a random transaction ID and
-decodes XOR-MAPPED-ADDRESS responses. The &lt;code&gt;discover_nat()&lt;&#x2F;code&gt; function queries
-multiple STUN servers in parallel (Google, Cloudflare by default), compares the
-mapped addresses, and classifies the NAT type:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Same IP and port from all servers → &lt;strong&gt;Public&lt;&#x2F;strong&gt; (no NAT)&lt;&#x2F;li&gt;
-&lt;li&gt;Same mapped address from all servers → &lt;strong&gt;Cone&lt;&#x2F;strong&gt; (hole punching works)&lt;&#x2F;li&gt;
-&lt;li&gt;Different mapped addresses → &lt;strong&gt;Symmetric&lt;&#x2F;strong&gt; (hole punching unreliable)&lt;&#x2F;li&gt;
-&lt;li&gt;No responses → &lt;strong&gt;Unknown&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Retries with exponential backoff and configurable timeouts. 12 tests covering
-codec roundtrips, all classification paths, and async loopback queries.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Signed punch coordination&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;punch.rs&lt;&#x2F;code&gt;) — Ed25519 signing
-and verification for &lt;code&gt;PunchIntro&lt;&#x2F;code&gt;, &lt;code&gt;RelayRequest&lt;&#x2F;code&gt;, and &lt;code&gt;RelayMigrate&lt;&#x2F;code&gt; messages.
-Every introduction is signed by the initiator with a 30-second timestamp window,
-preventing reflection attacks (where an attacker replays an old introduction to
-redirect traffic). The payload format is &lt;code&gt;target || external_addr || timestamp&lt;&#x2F;code&gt;
-— changing any field invalidates the signature. 6 unit tests plus 3
-property-based tests with proptest (arbitrary node IDs, ports, and session
-tokens).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Relay session manager&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;relay.rs&lt;&#x2F;code&gt;) — Manages transparent
-UDP relay sessions between NATed peers. Each session has a random 16-byte token;
-peers prefix their packets with the token, the relay strips it and forwards.
-Features:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Bidirectional forwarding (A→R→B and B→R→A)&lt;&#x2F;li&gt;
-&lt;li&gt;Rate limiting: 256 KB&#x2F;s for reciprocal peers, 64 KB&#x2F;s for non-reciprocal&lt;&#x2F;li&gt;
-&lt;li&gt;10-minute maximum duration for bootstrap (non-reciprocal) sessions&lt;&#x2F;li&gt;
-&lt;li&gt;Address migration: when a peer&#x27;s IP changes (Wi-Fi to cellular), a signed
-&lt;code&gt;RelayMigrate&lt;&#x2F;code&gt; updates the session without tearing it down&lt;&#x2F;li&gt;
-&lt;li&gt;Idle cleanup with configurable timeout&lt;&#x2F;li&gt;
-&lt;li&gt;8 unit tests plus 2 property-based tests&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;DHT message extensions&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;message.rs&lt;&#x2F;code&gt;) — Seven new message
-variants added to the DHT protocol:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Message&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchIntro&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&quot;I want to connect to node X, here&#x27;s my signed external address&quot;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchRequest&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Introducer forwards the request to the target&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchReady&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Target confirms readiness, sends its external address&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayRequest&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&quot;Create a relay session to node X&quot;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayOffer&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Relay responds with its address and session token&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayClose&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Tear down a relay session&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayMigrate&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Update session after network change&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;The &lt;code&gt;Pong&lt;&#x2F;code&gt; message was extended with NAT metadata: &lt;code&gt;nat_type&lt;&#x2F;code&gt;,
-&lt;code&gt;relay_slots_available&lt;&#x2F;code&gt;, and &lt;code&gt;relay_bandwidth_used_kbps&lt;&#x2F;code&gt;. All new fields use
-&lt;code&gt;#[serde(default)]&lt;&#x2F;code&gt; for backward compatibility — old nodes ignore what they
-don&#x27;t recognize, new nodes fall back to defaults. 9 new serialization roundtrip
-tests.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;NatHandler trait and dispatch&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;engine.rs&lt;&#x2F;code&gt;) — A new
-&lt;code&gt;NatHandler&lt;&#x2F;code&gt; async trait (5 methods) injected into the DHT engine, following the
-same dependency injection pattern as the existing &lt;code&gt;ReplicationHandler&lt;&#x2F;code&gt;. The
-engine&#x27;s message dispatch loop now routes all punch&#x2F;relay messages to the
-handler. This keeps the DHT engine protocol-agnostic while allowing the NAT
-traversal logic to live in &lt;code&gt;tesseras-net&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Mobile reconnection types&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-embedded&#x2F;src&#x2F;reconnect.rs&lt;&#x2F;code&gt;) — A
-three-phase reconnection state machine for mobile devices:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;QuicMigration&lt;&#x2F;strong&gt; (0-2s) — try QUIC connection migration for all active peers&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ReStun&lt;&#x2F;strong&gt; (2-5s) — re-discover external address via STUN&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ReEstablish&lt;&#x2F;strong&gt; (5-10s) — reconnect peers that migration couldn&#x27;t save&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;Peers are reconnected in priority order: bootstrap nodes first, then nodes
-holding our fragments, then nodes whose fragments we hold, then general DHT
-neighbors. A new &lt;code&gt;NetworkChanged&lt;&#x2F;code&gt; event variant was added to the FFI event
-stream so the Flutter app can show reconnection progress.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Daemon NAT configuration&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;) — A new &lt;code&gt;[nat]&lt;&#x2F;code&gt; section in
-the TOML config with STUN server list, relay toggle, max relay sessions,
-bandwidth limits (reciprocal vs bootstrap), and idle timeout. All fields have
-sensible defaults; relay is disabled by default.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Prometheus metrics&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — 16 metrics across four
-subsystems:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;STUN&lt;&#x2F;strong&gt;: requests, failures, latency histogram&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Punch&lt;&#x2F;strong&gt;: attempts&#x2F;successes&#x2F;failures (by NAT type pair), latency histogram&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Relay&lt;&#x2F;strong&gt;: active sessions, total sessions, bytes forwarded, idle timeouts,
-rate limit hits&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reconnect&lt;&#x2F;strong&gt;: network changes, attempts&#x2F;successes by phase, duration
-histogram&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;6 tests verifying registration, increment, label cardinality, and
-double-registration detection.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Integration tests&lt;&#x2F;strong&gt; — Two end-to-end tests using &lt;code&gt;MemTransport&lt;&#x2F;code&gt; (in-memory
-simulated network):&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;punch_integration.rs&lt;&#x2F;code&gt; — Full 3-node hole-punch flow: A sends signed
-&lt;code&gt;PunchIntro&lt;&#x2F;code&gt; to introducer I, I verifies and forwards &lt;code&gt;PunchRequest&lt;&#x2F;code&gt; to B, B
-verifies the original signature and sends &lt;code&gt;PunchReady&lt;&#x2F;code&gt; back, A and B exchange
-messages directly. Also tests that a bad signature is correctly rejected.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;relay_integration.rs&lt;&#x2F;code&gt; — Full 3-node relay flow: A requests relay from R, R
-creates session and sends &lt;code&gt;RelayOffer&lt;&#x2F;code&gt; to both peers, A and B exchange
-token-prefixed packets through R, A migrates to a new address mid-session, A
-closes the session, and the test verifies the session is torn down and further
-forwarding fails.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Property tests&lt;&#x2F;strong&gt; — 7 proptest-based tests covering: signature round-trips for
-all three signed message types (arbitrary node IDs, ports, tokens), NAT
-classification determinism (same inputs always produce same output), STUN
-binding request validity, session token uniqueness, and relay rejection of
-too-short packets.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Justfile targets&lt;&#x2F;strong&gt; — &lt;code&gt;just test-nat&lt;&#x2F;code&gt; runs all NAT traversal tests across
-&lt;code&gt;tesseras-net&lt;&#x2F;code&gt; and &lt;code&gt;tesseras-dht&lt;&#x2F;code&gt;. &lt;code&gt;just test-chaos&lt;&#x2F;code&gt; is a placeholder for future
-Docker Compose chaos tests with &lt;code&gt;tc netem&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;STUN over TURN&lt;&#x2F;strong&gt;: we implement STUN (discovery) and custom relay rather than
-full TURN. TURN requires authenticated allocation and is designed for media
-relay; our relay is simpler — token-prefixed UDP forwarding with rate limits.
-This keeps the protocol minimal and avoids depending on external TURN servers.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Signatures on introductions&lt;&#x2F;strong&gt;: every &lt;code&gt;PunchIntro&lt;&#x2F;code&gt; is signed by the
-initiator. Without this, an attacker could send forged introductions to
-redirect a node&#x27;s hole-punch attempts to an attacker-controlled address (a
-reflection attack). The 30-second timestamp window limits replay.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reciprocal bandwidth tiers&lt;&#x2F;strong&gt;: relay nodes give 4x more bandwidth (256 vs 64
-KB&#x2F;s) to peers with good reciprocity scores. This incentivizes nodes to store
-fragments for others — if you contribute, you get better relay service when
-you need it.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Backward-compatible Pong extension&lt;&#x2F;strong&gt;: new NAT fields in &lt;code&gt;Pong&lt;&#x2F;code&gt; use
-&lt;code&gt;#[serde(default)]&lt;&#x2F;code&gt; and &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;. Old nodes that don&#x27;t understand these
-fields simply skip them during deserialization. No protocol version bump
-needed.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;NatHandler as async trait&lt;&#x2F;strong&gt;: the NAT traversal logic is injected into the
-DHT engine via a trait, just like &lt;code&gt;ReplicationHandler&lt;&#x2F;code&gt;. This keeps the DHT
-engine focused on routing and peer management, and allows the NAT
-implementation to be swapped or disabled without touching core DHT code.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued&lt;&#x2F;strong&gt; — performance tuning (connection pooling, fragment
-caching, SQLite WAL), security audits, institutional node onboarding, OS
-packaging&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;With NAT traversal, Tesseras can connect nodes regardless of their network
-topology. Public nodes talk directly. Cone-NATed nodes punch through with an
-introducer&#x27;s help. Symmetric-NATed or firewalled nodes relay through willing
-peers. The network adapts to the real world, where most devices are behind a NAT
-and network conditions change constantly.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>CLI Meets Network: Publish, Fetch, and Status Commands</title>
- <published>2026-02-15T00:00:00+00:00</published>
- <updated>2026-02-15T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/cli-daemon-rpc/"/>
- <id>https://tesseras.net/news/cli-daemon-rpc/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/cli-daemon-rpc/">&lt;p&gt;Until now the CLI operated in isolation: create a tessera, verify it, export it,
-list what you have. Everything stayed on your machine. With this release, &lt;code&gt;tes&lt;&#x2F;code&gt;
-gains three commands that bridge the gap between local storage and the P2P
-network — &lt;code&gt;publish&lt;&#x2F;code&gt;, &lt;code&gt;fetch&lt;&#x2F;code&gt;, and &lt;code&gt;status&lt;&#x2F;code&gt; — by talking to a running &lt;code&gt;tesd&lt;&#x2F;code&gt; over
-a Unix socket.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tesseras-rpc&lt;&#x2F;code&gt; crate&lt;&#x2F;strong&gt; — A new shared crate that both the CLI and daemon
-depend on. It defines the RPC protocol using MessagePack serialization with
-length-prefixed framing (4-byte big-endian size header, 64 MiB max). Three
-request types (&lt;code&gt;Publish&lt;&#x2F;code&gt;, &lt;code&gt;Fetch&lt;&#x2F;code&gt;, &lt;code&gt;Status&lt;&#x2F;code&gt;) and their corresponding responses.
-A sync &lt;code&gt;DaemonClient&lt;&#x2F;code&gt; handles the Unix socket connection with configurable
-timeouts. The protocol is deliberately simple — one request, one response,
-connection closed — to keep the implementation auditable.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes publish &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Publishes a tessera to the network. Accepts full
-hashes or short prefixes (e.g., &lt;code&gt;tes publish a1b2&lt;&#x2F;code&gt;), which are resolved against
-the local database. The daemon reads all tessera files from storage, packs them
-into a single MessagePack buffer, and hands them to the replication engine.
-Small tesseras (&amp;lt; 4 MB) are replicated as a single fragment; larger ones go
-through Reed-Solomon erasure coding. Output shows the short hash and fragment
-count:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;Published tessera 9f2c4a1b (24 fragments created)
-Distribution in progress — use `tes status 9f2c4a1b` to track.
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes fetch &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Retrieves a tessera from the network using its full
-content hash. The daemon collects locally available fragments, reconstructs the
-original data via erasure decoding if needed, unpacks the files, and stores them
-in the content-addressable store. Returns the number of memories and total size
-fetched.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes status &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Displays the replication health of a tessera. The
-output maps directly to the replication engine&#x27;s internal health model:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;State&lt;&#x2F;th&gt;&lt;th&gt;Meaning&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;Local&lt;&#x2F;td&gt;&lt;td&gt;Not yet published — exists only on your machine&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Publishing&lt;&#x2F;td&gt;&lt;td&gt;Fragments being distributed, critical redundancy&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Replicated&lt;&#x2F;td&gt;&lt;td&gt;Distributed but below target redundancy&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Healthy&lt;&#x2F;td&gt;&lt;td&gt;Full redundancy achieved&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;&lt;strong&gt;Daemon RPC listener&lt;&#x2F;strong&gt; — The daemon now binds a Unix socket (default:
-&lt;code&gt;$XDG_RUNTIME_DIR&#x2F;tesseras&#x2F;daemon.sock&lt;&#x2F;code&gt;) with proper directory permissions
-(0700), stale socket cleanup, and graceful shutdown. Each connection is handled
-in a Tokio task — the listener converts the async stream to sync I&#x2F;O for the
-framing layer, dispatches to the RPC handler, and writes the response back.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Pack&#x2F;unpack in &lt;code&gt;tesseras-core&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — A small module that serializes a list of
-file entries (path + data) into a single MessagePack buffer and back. This is
-the bridge between the tessera&#x27;s directory structure and the replication
-engine&#x27;s opaque byte blobs.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Unix socket over TCP&lt;&#x2F;strong&gt;: RPC between CLI and daemon happens on the same
-machine. Unix sockets are faster, don&#x27;t need port allocation, and filesystem
-permissions provide access control without TLS.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;MessagePack over JSON&lt;&#x2F;strong&gt;: the same wire format used everywhere else in
-Tesseras. Compact, schema-less, and already a workspace dependency. A typical
-publish request&#x2F;response round-trip is under 200 bytes.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Sync client, async daemon&lt;&#x2F;strong&gt;: the &lt;code&gt;DaemonClient&lt;&#x2F;code&gt; uses blocking I&#x2F;O because
-the CLI doesn&#x27;t need concurrency — it sends one request and waits. The daemon
-listener is async (Tokio) to handle multiple connections. The framing layer
-works with any &lt;code&gt;Read&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Write&lt;&#x2F;code&gt; impl, bridging both worlds.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Hash prefix resolution on the client side&lt;&#x2F;strong&gt;: &lt;code&gt;publish&lt;&#x2F;code&gt; and &lt;code&gt;status&lt;&#x2F;code&gt; resolve
-short prefixes locally before sending the full hash to the daemon. This keeps
-the daemon stateless — it doesn&#x27;t need access to the CLI&#x27;s database.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Default data directory alignment&lt;&#x2F;strong&gt;: the CLI default changed from
-&lt;code&gt;~&#x2F;.tesseras&lt;&#x2F;code&gt; to &lt;code&gt;~&#x2F;.local&#x2F;share&#x2F;tesseras&lt;&#x2F;code&gt; (via &lt;code&gt;dirs::data_dir()&lt;&#x2F;code&gt;) to match
-the daemon. A migration hint is printed when legacy data is detected.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;DHT peer count&lt;&#x2F;strong&gt;: the &lt;code&gt;status&lt;&#x2F;code&gt; command currently reports 0 peers — wiring
-the actual peer count from the DHT is the next step&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;&lt;code&gt;tes show&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: display the contents of a tessera (memories, metadata) without
-exporting&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Streaming fetch&lt;&#x2F;strong&gt;: for large tesseras, stream fragments as they arrive
-rather than waiting for all of them&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Heir Key Recovery with Shamir&#x27;s Secret Sharing</title>
- <published>2026-02-15T00:00:00+00:00</published>
- <updated>2026-02-15T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-shamir-heir-recovery/"/>
- <id>https://tesseras.net/news/phase4-shamir-heir-recovery/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-shamir-heir-recovery/">&lt;p&gt;What happens to your memories when you die? Until now, Tesseras could preserve
-content across millennia — but the private and sealed keys died with their
-owner. Phase 4 continues with a solution: Shamir&#x27;s Secret Sharing, a
-cryptographic scheme that lets you split your identity into shares and
-distribute them to the people you trust most.&lt;&#x2F;p&gt;
-&lt;p&gt;The math is elegant: you choose a threshold T and a total N. Any T shares
-reconstruct the full secret; T-1 shares reveal absolutely nothing. This is not
-&quot;almost nothing&quot; — it is information-theoretically secure. An attacker with one
-fewer share than the threshold has exactly zero bits of information about the
-secret, no matter how much computing power they have.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;GF(256) finite field arithmetic&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;shamir&#x2F;gf256.rs&lt;&#x2F;code&gt;) —
-Shamir&#x27;s Secret Sharing requires arithmetic in a finite field. We implement
-GF(256) using the same irreducible polynomial as AES (x^8 + x^4 + x^3 + x + 1),
-with compile-time lookup tables for logarithm and exponentiation. All operations
-are constant-time via table lookups — no branches on secret data. The module
-includes Horner&#x27;s method for polynomial evaluation and Lagrange interpolation at
-x=0 for secret recovery. 233 lines, exhaustively tested: all 256 elements for
-identity&#x2F;inverse properties, commutativity, and associativity.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;ShamirSplitter&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;shamir&#x2F;mod.rs&lt;&#x2F;code&gt;) — The core
-split&#x2F;reconstruct API. &lt;code&gt;split()&lt;&#x2F;code&gt; takes a secret byte slice, a configuration
-(threshold T, total N), and the owner&#x27;s Ed25519 public key. For each byte of the
-secret, it constructs a random polynomial of degree T-1 over GF(256) with the
-secret byte as the constant term, then evaluates it at N distinct points.
-&lt;code&gt;reconstruct()&lt;&#x2F;code&gt; takes T or more shares and recovers the secret via Lagrange
-interpolation. Both operations include extensive validation: threshold bounds,
-session consistency, owner fingerprint matching, and BLAKE3 checksum
-verification.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;HeirShare format&lt;&#x2F;strong&gt; — Each share is a self-contained, serializable artifact
-with:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Format version (v1) for forward compatibility&lt;&#x2F;li&gt;
-&lt;li&gt;Share index (1..N) and threshold&#x2F;total metadata&lt;&#x2F;li&gt;
-&lt;li&gt;Session ID (random 8 bytes) — prevents mixing shares from different split
-sessions&lt;&#x2F;li&gt;
-&lt;li&gt;Owner fingerprint (first 8 bytes of BLAKE3 hash of the Ed25519 public key)&lt;&#x2F;li&gt;
-&lt;li&gt;Share data (the Shamir y-values, same length as the secret)&lt;&#x2F;li&gt;
-&lt;li&gt;BLAKE3 checksum over all preceding fields&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Shares are serialized in two formats: &lt;strong&gt;MessagePack&lt;&#x2F;strong&gt; (compact binary, for
-programmatic use) and &lt;strong&gt;base64 text&lt;&#x2F;strong&gt; (human-readable, for printing and physical
-storage). The text format includes a header with metadata and delimiters:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;--- TESSERAS HEIR SHARE ---
-Format: v1
-Owner: a1b2c3d4e5f6a7b8 (fingerprint)
-Share: 1 of 3 (threshold: 2)
-Session: 9f8e7d6c5b4a3210
-Created: 2026-02-15
-
-&amp;lt;base64-encoded MessagePack data&amp;gt;
---- END HEIR SHARE ---
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;This format is designed to be printed on paper, stored in a safe deposit box, or
-engraved on metal. The header is informational — only the base64 payload is
-parsed during reconstruction.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CLI integration&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;commands&#x2F;heir.rs&lt;&#x2F;code&gt;) — Three new
-subcommands:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;tes heir create&lt;&#x2F;code&gt; — splits your Ed25519 identity into heir shares. Prompts for
-confirmation (your full identity is at stake), generates both &lt;code&gt;.bin&lt;&#x2F;code&gt; and
-&lt;code&gt;.txt&lt;&#x2F;code&gt; files for each share, and writes &lt;code&gt;heir_meta.json&lt;&#x2F;code&gt; to your identity
-directory.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tes heir reconstruct&lt;&#x2F;code&gt; — loads share files (auto-detects binary vs text
-format), validates consistency, reconstructs the secret, derives the Ed25519
-keypair, and optionally installs it to &lt;code&gt;~&#x2F;.tesseras&#x2F;identity&#x2F;&lt;&#x2F;code&gt; (with automatic
-backup of the existing identity).&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tes heir info&lt;&#x2F;code&gt; — displays share metadata and verifies the checksum without
-exposing any secret material.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Secret blob format&lt;&#x2F;strong&gt; — Identity keys are serialized into a versioned blob
-before splitting: a version byte (0x01), a flags byte (0x00 for Ed25519-only),
-followed by the 32-byte Ed25519 secret key. This leaves room for future
-expansion when X25519 and ML-KEM-768 private keys are integrated into the heir
-share system.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 20 unit tests for ShamirSplitter (roundtrip, all share
-combinations, insufficient shares, wrong owner, wrong session, threshold-1
-boundary, large secrets up to ML-KEM-768 key size). 7 unit tests for GF(256)
-arithmetic (exhaustive field properties). 3 property-based tests with proptest
-(arbitrary secrets up to 5000 bytes, arbitrary T-of-N configurations,
-information-theoretic security verification). Serialization roundtrip tests for
-both MessagePack and base64 text formats. 2 integration tests covering the
-complete heir lifecycle: generate identity, split into shares, serialize,
-deserialize, reconstruct, verify keypair, and sign&#x2F;verify with reconstructed
-keys.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;GF(256) over GF(prime)&lt;&#x2F;strong&gt;: we use GF(256) rather than a prime field because
-it maps naturally to bytes — each element is a single byte, each share is the
-same length as the secret. No big-integer arithmetic, no modular reduction, no
-padding. This is the same approach used by most real-world Shamir
-implementations including SSSS and Hashicorp Vault.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Compile-time lookup tables&lt;&#x2F;strong&gt;: the LOG and EXP tables for GF(256) are
-computed at compile time using &lt;code&gt;const fn&lt;&#x2F;code&gt;. This means zero runtime
-initialization cost and constant-time operations via table lookups rather than
-loops.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Session ID prevents cross-session mixing&lt;&#x2F;strong&gt;: each call to &lt;code&gt;split()&lt;&#x2F;code&gt; generates
-a fresh random session ID. If an heir accidentally uses shares from two
-different split sessions (e.g., before and after a key rotation),
-reconstruction fails cleanly with a validation error rather than producing
-garbage output.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 checksums detect corruption&lt;&#x2F;strong&gt;: each share includes a BLAKE3 checksum
-over its contents. This catches bit rot, transmission errors, and accidental
-truncation before any reconstruction attempt. A share printed on paper and
-scanned back via OCR will fail the checksum if a single character is wrong.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Owner fingerprint for identification&lt;&#x2F;strong&gt;: shares include the first 8 bytes of
-BLAKE3(Ed25519 public key) as a fingerprint. This lets heirs verify which
-identity a share belongs to without revealing the full public key. During
-reconstruction, the fingerprint is cross-checked against the recovered key.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Dual format for resilience&lt;&#x2F;strong&gt;: both binary (MessagePack) and text (base64)
-formats are generated because physical media has different failure modes than
-digital storage. A USB drive might fail; paper survives. A QR code might be
-unreadable; base64 text can be manually typed.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Blob versioning&lt;&#x2F;strong&gt;: the secret is wrapped in a versioned blob (version +
-flags + key material) so future versions can include additional keys (X25519,
-ML-KEM-768) without breaking backward compatibility with existing shares.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued: Resilience and Scale&lt;&#x2F;strong&gt; — advanced NAT traversal
-(STUN&#x2F;TURN), performance tuning (connection pooling, fragment caching, SQLite
-WAL), security audits, institutional node onboarding, OS packaging&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;With Shamir&#x27;s Secret Sharing, Tesseras closes the last critical gap in long-term
-preservation. Your memories survive infrastructure failures through erasure
-coding. Your privacy survives quantum computers through hybrid encryption. And
-now, your identity survives you — passed on to the people you chose, requiring
-their cooperation to unlock what you left behind.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Encryption and Sealed Tesseras</title>
- <published>2026-02-14T16:00:00+00:00</published>
- <updated>2026-02-14T16:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-encryption-sealed/"/>
- <id>https://tesseras.net/news/phase4-encryption-sealed/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-encryption-sealed/">&lt;p&gt;Some memories are not meant for everyone. A private journal, a letter to be
-opened in 2050, a family secret sealed until the grandchildren are old enough.
-Until now, every tessera on the network was open. Phase 4 changes that: Tesseras
-now encrypts private and sealed content with a hybrid cryptographic scheme
-designed to resist both classical and quantum attacks.&lt;&#x2F;p&gt;
-&lt;p&gt;The principle remains the same — encrypt as little as possible. Public memories
-need availability, not secrecy. But when someone creates a private or sealed
-tessera, the content is now locked behind AES-256-GCM encryption with keys
-protected by a hybrid key encapsulation mechanism combining X25519 and
-ML-KEM-768. Both algorithms must be broken to access the content.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;AES-256-GCM encryptor&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;encryption.rs&lt;&#x2F;code&gt;) — Symmetric
-content encryption with random 12-byte nonces and authenticated associated data
-(AAD). The AAD binds ciphertext to its context: for private tesseras, the
-content hash is included; for sealed tesseras, both the content hash and the
-&lt;code&gt;open_after&lt;&#x2F;code&gt; timestamp are bound into the AAD. This means moving ciphertext
-between tesseras with different open dates causes decryption failure — you
-cannot trick the system into opening a sealed memory early by swapping its
-ciphertext into a tessera with an earlier seal date.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Hybrid Key Encapsulation Mechanism&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;kem.rs&lt;&#x2F;code&gt;) — Key
-exchange using X25519 (classical elliptic curve Diffie-Hellman) combined with
-ML-KEM-768 (the NIST-standardized post-quantum lattice-based KEM, formerly
-Kyber). Both shared secrets are combined via &lt;code&gt;blake3::derive_key&lt;&#x2F;code&gt; with a fixed
-context string (&quot;tesseras hybrid kem v1&quot;) to produce a single 256-bit content
-encryption key. This follows the same &quot;dual from day one&quot; philosophy as the
-project&#x27;s dual signing (Ed25519 + ML-DSA): if either algorithm is broken in the
-future, the other still protects the content.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Sealed Key Envelope&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;sealed.rs&lt;&#x2F;code&gt;) — Wraps a content
-encryption key using the hybrid KEM, so only the tessera owner can recover it.
-The KEM produces a transport key, which is XORed with the content key to produce
-a wrapped key stored alongside the KEM ciphertext. On unsealing, the owner
-decapsulates the KEM ciphertext to recover the transport key, then XORs again to
-recover the content key.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Key Publication&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;sealed.rs&lt;&#x2F;code&gt;) — A standalone signed
-artifact for publishing a sealed tessera&#x27;s content key after its &lt;code&gt;open_after&lt;&#x2F;code&gt;
-date has passed. The owner signs the content key, tessera hash, and publication
-timestamp with their dual keys (Ed25519, with ML-DSA placeholder). The manifest
-stays immutable — the key publication is a separate document. Other nodes verify
-the signature against the owner&#x27;s public key before using the published key to
-decrypt the content.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;EncryptionContext&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;enums.rs&lt;&#x2F;code&gt;) — A domain type that
-represents the AAD context for encryption. It lives in tesseras-core rather than
-tesseras-crypto because it&#x27;s a domain concept (not a crypto implementation
-detail). The &lt;code&gt;to_aad_bytes()&lt;&#x2F;code&gt; method produces deterministic serialization: a tag
-byte (0x00 for Private, 0x01 for Sealed), followed by the content hash, and for
-Sealed, the &lt;code&gt;open_after&lt;&#x2F;code&gt; timestamp as little-endian i64.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Domain validation&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) —
-&lt;code&gt;TesseraService::create()&lt;&#x2F;code&gt; now rejects Sealed and Private tesseras that don&#x27;t
-provide encryption keys. This is a domain-level validation: the service layer
-enforces that you cannot create a sealed memory without the cryptographic
-machinery to protect it. The error message is clear: &quot;missing encryption keys
-for visibility sealed until 2050-01-01.&quot;&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Core type updates&lt;&#x2F;strong&gt; — &lt;code&gt;TesseraIdentity&lt;&#x2F;code&gt; now includes an optional
-&lt;code&gt;encryption_public: Option&amp;lt;HybridEncryptionPublic&amp;gt;&lt;&#x2F;code&gt; field containing both the
-X25519 and ML-KEM-768 public keys. &lt;code&gt;KeyAlgorithm&lt;&#x2F;code&gt; gained &lt;code&gt;X25519&lt;&#x2F;code&gt; and &lt;code&gt;MlKem768&lt;&#x2F;code&gt;
-variants. The identity filesystem layout now supports &lt;code&gt;node.x25519.key&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.pub&lt;&#x2F;code&gt;
-and &lt;code&gt;node.mlkem768.key&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.pub&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 8 unit tests for AES-256-GCM (roundtrip, wrong key, tampered
-ciphertext, wrong AAD, cross-context decryption failure, unique nonces, plus 2
-property-based tests for arbitrary payloads and nonce uniqueness). 5 unit tests
-for HybridKem (roundtrip, wrong keypair, tampered X25519, KDF determinism, plus
-1 property-based test). 4 unit tests for SealedKeyEnvelope and KeyPublication. 2
-integration tests covering the complete sealed and private tessera lifecycle:
-generate keys, create content key, encrypt, seal, unseal, decrypt, publish key,
-and verify — the full cycle.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Hybrid KEM from day one&lt;&#x2F;strong&gt;: X25519 + ML-KEM-768 follows the same philosophy
-as dual signing. We don&#x27;t know which cryptographic assumptions will hold over
-millennia, so we combine classical and post-quantum algorithms. The cost is
-~1.2 KB of additional key material per identity — trivial compared to the
-photos and videos in a tessera.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 for KDF&lt;&#x2F;strong&gt;: rather than adding &lt;code&gt;hkdf&lt;&#x2F;code&gt; + &lt;code&gt;sha2&lt;&#x2F;code&gt; as new dependencies, we
-use &lt;code&gt;blake3::derive_key&lt;&#x2F;code&gt; with a fixed context string. BLAKE3&#x27;s key derivation
-mode is specifically designed for this use case, and the project already
-depends on BLAKE3 for content hashing.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Immutable manifests&lt;&#x2F;strong&gt;: when a sealed tessera&#x27;s &lt;code&gt;open_after&lt;&#x2F;code&gt; date passes, the
-content key is published as a separate signed artifact (&lt;code&gt;KeyPublication&lt;&#x2F;code&gt;), not
-by modifying the manifest. This preserves the append-only, content-addressed
-nature of tesseras. The manifest was signed at creation time and never
-changes.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;AAD binding prevents ciphertext swapping&lt;&#x2F;strong&gt;: the &lt;code&gt;EncryptionContext&lt;&#x2F;code&gt; binds
-both the content hash and (for sealed tesseras) the &lt;code&gt;open_after&lt;&#x2F;code&gt; timestamp
-into the AES-GCM authenticated data. An attacker who copies encrypted content
-from a &quot;sealed until 2050&quot; tessera into a &quot;sealed until 2025&quot; tessera will
-find that decryption fails — the AAD no longer matches.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;XOR key wrapping&lt;&#x2F;strong&gt;: the sealed key envelope uses a simple XOR of the content
-key with the KEM-derived transport key, rather than an additional layer of
-AES-GCM. Since the transport key is a fresh random value from the KEM and is
-used exactly once, XOR is information-theoretically secure for this specific
-use case and avoids unnecessary complexity.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Domain validation, not storage validation&lt;&#x2F;strong&gt;: the &quot;missing encryption keys&quot;
-check lives in &lt;code&gt;TesseraService::create()&lt;&#x2F;code&gt;, not in the storage layer. This
-follows the hexagonal architecture pattern: domain rules are enforced at the
-service boundary, not scattered across adapters.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued: Resilience and Scale&lt;&#x2F;strong&gt; — Shamir&#x27;s Secret Sharing for heir
-key distribution, advanced NAT traversal (STUN&#x2F;TURN), performance tuning,
-security audits, OS packaging&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — Public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Sealed tesseras make Tesseras a true time capsule. A father can now record a
-message for his unborn grandchild, seal it until 2060, and know that the
-cryptographic envelope will hold — even if the quantum computers of the future
-try to break it open early.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 3: Memories in Your Hands</title>
- <published>2026-02-14T14:00:00+00:00</published>
- <updated>2026-02-14T14:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase3-api-and-apps/"/>
- <id>https://tesseras.net/news/phase3-api-and-apps/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase3-api-and-apps/">&lt;p&gt;People can now hold their memories in their hands. Phase 3 delivers what the
-previous phases built toward: a mobile app where someone downloads Tesseras,
-creates an identity, takes a photo, and that memory enters the preservation
-network. No cloud accounts, no subscriptions, no company between you and your
-memories.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-embedded&lt;&#x2F;strong&gt; — A full P2P node that runs inside a mobile app. The
-&lt;code&gt;EmbeddedNode&lt;&#x2F;code&gt; struct owns a Tokio runtime, SQLite database, QUIC transport,
-Kademlia DHT engine, replication service, and tessera service — the same stack
-as the desktop daemon, compiled into a shared library. A global singleton
-pattern (&lt;code&gt;Mutex&amp;lt;Option&amp;lt;EmbeddedNode&amp;gt;&amp;gt;&lt;&#x2F;code&gt;) ensures one node per app lifecycle. On
-start, it opens the database, runs migrations, loads or generates an Ed25519
-identity with proof-of-work node ID, binds QUIC on an ephemeral port, wires up
-DHT and replication, and spawns the repair loop. On stop, it sends a shutdown
-signal and drains gracefully.&lt;&#x2F;p&gt;
-&lt;p&gt;Eleven FFI functions are exposed to Dart via flutter_rust_bridge: lifecycle
-(&lt;code&gt;node_start&lt;&#x2F;code&gt;, &lt;code&gt;node_stop&lt;&#x2F;code&gt;, &lt;code&gt;node_is_running&lt;&#x2F;code&gt;), identity (&lt;code&gt;create_identity&lt;&#x2F;code&gt;,
-&lt;code&gt;get_identity&lt;&#x2F;code&gt;), memories (&lt;code&gt;create_memory&lt;&#x2F;code&gt;, &lt;code&gt;get_timeline&lt;&#x2F;code&gt;, &lt;code&gt;get_memory&lt;&#x2F;code&gt;), and
-network status (&lt;code&gt;get_network_stats&lt;&#x2F;code&gt;, &lt;code&gt;get_replication_status&lt;&#x2F;code&gt;). All types
-crossing the FFI boundary are flat structs with only &lt;code&gt;String&lt;&#x2F;code&gt;, &lt;code&gt;Option&amp;lt;String&amp;gt;&lt;&#x2F;code&gt;,
-&lt;code&gt;Vec&amp;lt;String&amp;gt;&lt;&#x2F;code&gt;, and primitives — no trait objects, no generics, no lifetimes.&lt;&#x2F;p&gt;
-&lt;p&gt;Four adapter modules bridge core ports to concrete implementations:
-&lt;code&gt;Blake3HasherAdapter&lt;&#x2F;code&gt;, &lt;code&gt;Ed25519SignerAdapter&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Ed25519VerifierAdapter&lt;&#x2F;code&gt; for
-cryptography, &lt;code&gt;DhtPortAdapter&lt;&#x2F;code&gt; for DHT operations, and
-&lt;code&gt;ReplicationHandlerAdapter&lt;&#x2F;code&gt; for incoming fragment and attestation RPCs.&lt;&#x2F;p&gt;
-&lt;p&gt;The &lt;code&gt;bundled-sqlite&lt;&#x2F;code&gt; feature flag compiles SQLite from source, required for
-Android and iOS where the system library may not be available. Cargokit
-configuration passes this flag automatically in both debug and release builds.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Flutter app&lt;&#x2F;strong&gt; — A Material Design 3 application with Riverpod state
-management, targeting Android, iOS, Linux, macOS, and Windows from a single
-codebase.&lt;&#x2F;p&gt;
-&lt;p&gt;The &lt;em&gt;onboarding flow&lt;&#x2F;em&gt; is three screens: a welcome screen explaining the project
-in one sentence (&quot;Preserve your memories across millennia. No cloud. No
-company.&quot;), an identity creation screen that triggers Ed25519 keypair generation
-in Rust, and a confirmation screen showing the user&#x27;s name and cryptographic
-identity.&lt;&#x2F;p&gt;
-&lt;p&gt;The &lt;em&gt;timeline screen&lt;&#x2F;em&gt; displays memories in reverse chronological order with
-image previews, context text, and chips for memory type and visibility.
-Pull-to-refresh reloads from the Rust node. A floating action button opens the
-&lt;em&gt;memory creation screen&lt;&#x2F;em&gt;, which supports photo selection from gallery or camera
-via &lt;code&gt;image_picker&lt;&#x2F;code&gt;, optional context text, memory type and visibility dropdowns,
-and comma-separated tags. Creating a memory calls the Rust FFI synchronously,
-then returns to the timeline.&lt;&#x2F;p&gt;
-&lt;p&gt;The &lt;em&gt;network screen&lt;&#x2F;em&gt; shows two cards: node status (peer count, DHT size,
-bootstrap state, uptime) and replication health (total fragments, healthy
-fragments, repairing fragments, replication factor). The &lt;em&gt;settings screen&lt;&#x2F;em&gt;
-displays the user&#x27;s identity — name, truncated node ID, truncated public key,
-and creation date.&lt;&#x2F;p&gt;
-&lt;p&gt;Three Riverpod providers manage state: &lt;code&gt;nodeProvider&lt;&#x2F;code&gt; starts the embedded node
-on app launch using the app documents directory and stops it on dispose;
-&lt;code&gt;identityProvider&lt;&#x2F;code&gt; loads the existing profile or creates a new one;
-&lt;code&gt;timelineProvider&lt;&#x2F;code&gt; fetches the memory list with pagination.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 9 Rust unit tests in tesseras-embedded covering node lifecycle
-(start&#x2F;stop without panic), identity persistence across restarts, restart cycles
-without SQLite corruption, network event streaming, stats retrieval, memory
-creation and timeline retrieval, and single memory lookup by hash. 2 Flutter
-tests: an integration test verifying Rust initialization and app startup, and a
-widget smoke test.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Embedded node, not client-server&lt;&#x2F;strong&gt;: the phone runs the full P2P stack, not a
-thin client talking to a remote daemon. This means memories are preserved even
-without internet. Users with a Raspberry Pi or VPS can optionally connect the
-app to their daemon via GraphQL for higher availability, but it&#x27;s not
-required.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Synchronous FFI&lt;&#x2F;strong&gt;: all flutter_rust_bridge functions are marked
-&lt;code&gt;#[frb(sync)]&lt;&#x2F;code&gt; and block on the internal Tokio runtime. This simplifies the
-Dart side (no async bridge complexity) while the Rust side handles concurrency
-internally. Flutter&#x27;s UI thread stays responsive because Riverpod wraps calls
-in async providers.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Global singleton&lt;&#x2F;strong&gt;: a &lt;code&gt;Mutex&amp;lt;Option&amp;lt;EmbeddedNode&amp;gt;&amp;gt;&lt;&#x2F;code&gt; global ensures the node
-lifecycle is predictable — one start, one stop, no races. Mobile platforms
-kill processes aggressively, so simplicity in lifecycle management is a
-feature.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Flat FFI types&lt;&#x2F;strong&gt;: no Rust abstractions leak across the FFI boundary. Every
-type is a plain struct with strings and numbers. This makes the auto-generated
-Dart bindings reliable and easy to debug.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Three-screen onboarding&lt;&#x2F;strong&gt;: identity creation is the only required step. No
-email, no password, no server registration. The app generates a cryptographic
-identity locally and is ready to use.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4: Resilience and Scale&lt;&#x2F;strong&gt; — Advanced NAT traversal (STUN&#x2F;TURN),
-Shamir&#x27;s Secret Sharing for heirs, sealed tesseras with time-lock encryption,
-performance tuning, security audits, OS packaging for
-Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — Public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;The infrastructure is complete. The network exists, replication works, and now
-anyone with a phone can participate. What remains is hardening what we have and
-opening it to the world.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Reed-Solomon: How Tesseras Survives Data Loss</title>
- <published>2026-02-14T14:00:00+00:00</published>
- <updated>2026-02-14T14:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/reed-solomon/"/>
- <id>https://tesseras.net/news/reed-solomon/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/reed-solomon/">&lt;p&gt;Your hard drive will die. Your cloud provider will pivot. The RAID array in your
-closet will outlive its controller but not its owner. If a memory is stored in
-exactly one place, it has exactly one way to be lost forever.&lt;&#x2F;p&gt;
-&lt;p&gt;Tesseras is a network that keeps human memories alive through mutual aid. The
-core survival mechanism is &lt;strong&gt;Reed-Solomon erasure coding&lt;&#x2F;strong&gt; — a technique
-borrowed from deep-space communication that lets us reconstruct data even when
-pieces go missing.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-is-reed-solomon&quot;&gt;What is Reed-Solomon?&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon is a family of error-correcting codes invented by Irving Reed and
-Gustave Solomon in 1960. The original use case was correcting errors in data
-transmitted over noisy channels — think Voyager sending photos from Jupiter, or
-a CD playing despite scratches.&lt;&#x2F;p&gt;
-&lt;p&gt;The key insight: if you add carefully computed redundancy to your data &lt;em&gt;before&lt;&#x2F;em&gt;
-something goes wrong, you can recover the original even after losing some
-pieces.&lt;&#x2F;p&gt;
-&lt;p&gt;Here&#x27;s the intuition. Suppose you have a polynomial of degree 2 — a parabola.
-You need 3 points to define it uniquely. But if you evaluate it at 5 points, you
-can lose any 2 of those 5 and still reconstruct the polynomial from the
-remaining 3. Reed-Solomon generalizes this idea to work over finite fields
-(Galois fields), where the &quot;polynomial&quot; is your data and the &quot;evaluation points&quot;
-are your fragments.&lt;&#x2F;p&gt;
-&lt;p&gt;In concrete terms:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Split&lt;&#x2F;strong&gt; your data into &lt;em&gt;k&lt;&#x2F;em&gt; data shards&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Compute&lt;&#x2F;strong&gt; &lt;em&gt;m&lt;&#x2F;em&gt; parity shards from the data shards&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Distribute&lt;&#x2F;strong&gt; all &lt;em&gt;k + m&lt;&#x2F;em&gt; shards across different locations&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reconstruct&lt;&#x2F;strong&gt; the original data from any &lt;em&gt;k&lt;&#x2F;em&gt; of the &lt;em&gt;k + m&lt;&#x2F;em&gt; shards&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;You can lose up to &lt;em&gt;m&lt;&#x2F;em&gt; shards — any &lt;em&gt;m&lt;&#x2F;em&gt;, data or parity, in any combination —
-and still recover everything.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;why-not-just-make-copies&quot;&gt;Why not just make copies?&lt;&#x2F;h2&gt;
-&lt;p&gt;The naive approach to redundancy is replication: make 3 copies, store them in 3
-places. This gives you tolerance for 2 failures at the cost of 3x your storage.&lt;&#x2F;p&gt;
-&lt;p&gt;Reed-Solomon is dramatically more efficient:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Strategy&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Storage overhead&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Failures tolerated&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;3x replication&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;200%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2 out of 3&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Reed-Solomon (16,8)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;50%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;8 out of 24&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Reed-Solomon (48,24)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;50%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24 out of 72&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;With 16 data shards and 8 parity shards, you use 50% extra storage but can
-survive losing a third of all fragments. To achieve the same fault tolerance
-with replication alone, you&#x27;d need 3x the storage.&lt;&#x2F;p&gt;
-&lt;p&gt;For a network that aims to preserve memories across decades and centuries, this
-efficiency isn&#x27;t a nice-to-have — it&#x27;s the difference between a viable system
-and one that drowns in its own overhead.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;how-tesseras-uses-reed-solomon&quot;&gt;How Tesseras uses Reed-Solomon&lt;&#x2F;h2&gt;
-&lt;p&gt;Not all data deserves the same treatment. A 500-byte text memory and a 100 MB
-video have very different redundancy needs. Tesseras uses a three-tier
-fragmentation strategy:&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Small (&amp;lt; 4 MB)&lt;&#x2F;strong&gt; — Whole-file replication to 7 peers. For small tesseras, the
-overhead of erasure coding (encoding time, fragment management, reconstruction
-logic) outweighs its benefits. Simple copies are faster and simpler.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Medium (4–256 MB)&lt;&#x2F;strong&gt; — 16 data shards + 8 parity shards = 24 total fragments.
-Each fragment is roughly 1&#x2F;16th of the original size. Any 16 of the 24 fragments
-reconstruct the original. Distributed across 7 peers.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Large (≥ 256 MB)&lt;&#x2F;strong&gt; — 48 data shards + 24 parity shards = 72 total fragments.
-Higher shard count means smaller individual fragments (easier to transfer and
-store) and higher absolute fault tolerance. Also distributed across 7 peers.&lt;&#x2F;p&gt;
-&lt;p&gt;The implementation uses the &lt;code&gt;reed-solomon-erasure&lt;&#x2F;code&gt; crate operating over GF(2⁸) —
-the same Galois field used in QR codes and CDs. Each fragment carries a BLAKE3
-checksum so corruption is detected immediately, not silently propagated.&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;Tessera (120 MB photo album)
- ↓ encode
-16 data shards (7.5 MB each) + 8 parity shards (7.5 MB each)
- ↓ distribute
-24 fragments across 7 peers (subnet-diverse)
- ↓ any 16 fragments
-Original tessera recovered
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;the-challenges&quot;&gt;The challenges&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon solves the mathematical problem of redundancy. The engineering
-challenges are everything around it.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;fragment-tracking&quot;&gt;Fragment tracking&lt;&#x2F;h3&gt;
-&lt;p&gt;Every fragment needs to be findable. Tesseras uses a Kademlia DHT for peer
-discovery and fragment-to-peer mapping. When a node goes offline, its fragments
-need to be re-created and distributed to new peers. This means tracking which
-fragments exist, where they are, and whether they&#x27;re still intact — across a
-network with no central authority.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;silent-corruption&quot;&gt;Silent corruption&lt;&#x2F;h3&gt;
-&lt;p&gt;A fragment that returns wrong data is worse than one that&#x27;s missing — at least a
-missing fragment is honestly absent. Tesseras addresses this with
-attestation-based health checks: the repair loop periodically asks fragment
-holders to prove possession by returning BLAKE3 checksums. If a checksum doesn&#x27;t
-match, the fragment is treated as lost.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;correlated-failures&quot;&gt;Correlated failures&lt;&#x2F;h3&gt;
-&lt;p&gt;If all 24 fragments of a tessera land on machines in the same datacenter, a
-single power outage kills them all. Reed-Solomon&#x27;s math assumes independent
-failures. Tesseras enforces &lt;strong&gt;subnet diversity&lt;&#x2F;strong&gt; during distribution: no more
-than 2 fragments per &#x2F;24 IPv4 subnet (or &#x2F;48 IPv6 prefix). This spreads
-fragments across different physical infrastructure.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;repair-speed-vs-network-load&quot;&gt;Repair speed vs. network load&lt;&#x2F;h3&gt;
-&lt;p&gt;When a peer goes offline, the clock starts ticking. Lost fragments need to be
-re-created before more failures accumulate. But aggressive repair floods the
-network. Tesseras balances this with a configurable repair loop (default: every
-24 hours with 2-hour jitter) and concurrent transfer limits (default: 4
-simultaneous transfers). The jitter prevents repair storms where every node
-checks its fragments at the same moment.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;long-term-key-management&quot;&gt;Long-term key management&lt;&#x2F;h3&gt;
-&lt;p&gt;Reed-Solomon protects against data loss, not against losing access. If a tessera
-is encrypted (private or sealed visibility), you need the decryption key to make
-the recovered data useful. Tesseras separates these concerns: erasure coding
-handles availability, while Shamir&#x27;s Secret Sharing (a future phase) will handle
-key distribution among heirs. The project&#x27;s design philosophy — encrypt as
-little as possible — keeps the key management problem small.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;galois-field-limitations&quot;&gt;Galois field limitations&lt;&#x2F;h3&gt;
-&lt;p&gt;The GF(2⁸) field limits the total number of shards to 255 (data + parity
-combined). For Tesseras, this is not a practical constraint — even the Large
-tier uses only 72 shards. But it does mean that extremely large files with
-thousands of fragments would require either a different field or a layered
-encoding scheme.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;evolving-codec-compatibility&quot;&gt;Evolving codec compatibility&lt;&#x2F;h3&gt;
-&lt;p&gt;A tessera encoded today must be decodable in 50 years. Reed-Solomon over GF(2⁸)
-is one of the most widely implemented algorithms in computing — it&#x27;s in every CD
-player, every QR code scanner, every deep-space probe. This ubiquity is itself a
-survival strategy. The algorithm won&#x27;t be forgotten because half the world&#x27;s
-infrastructure depends on it.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;the-bigger-picture&quot;&gt;The bigger picture&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon is a piece of a larger puzzle. It works in concert with:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Kademlia DHT&lt;&#x2F;strong&gt; for finding peers and routing fragments&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 checksums&lt;&#x2F;strong&gt; for integrity verification&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Bilateral reciprocity&lt;&#x2F;strong&gt; for fair storage exchange (no blockchain needed)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Subnet diversity&lt;&#x2F;strong&gt; for failure independence&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Automatic repair&lt;&#x2F;strong&gt; for maintaining redundancy over time&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;No single technique makes memories survive. Reed-Solomon ensures that data &lt;em&gt;can&lt;&#x2F;em&gt;
-be recovered. The DHT ensures fragments &lt;em&gt;can be found&lt;&#x2F;em&gt;. Reciprocity ensures
-peers &lt;em&gt;want to help&lt;&#x2F;em&gt;. Repair ensures none of this degrades over time.&lt;&#x2F;p&gt;
-&lt;p&gt;A tessera is a bet that the sum of these mechanisms, running across many
-independent machines operated by many independent people, is more durable than
-any single institution. Reed-Solomon is the mathematical foundation of that bet.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 2: Memories Survive</title>
- <published>2026-02-14T12:00:00+00:00</published>
- <updated>2026-02-14T12:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase2-replication/"/>
- <id>https://tesseras.net/news/phase2-replication/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase2-replication/">&lt;p&gt;A tessera is no longer tied to a single machine. Phase 2 delivers the
-replication layer: data is split into erasure-coded fragments, distributed
-across multiple peers, and automatically repaired when nodes go offline. A
-bilateral reciprocity ledger ensures fair storage exchange — no blockchain, no
-tokens.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; (updated) — New replication domain types: &lt;code&gt;FragmentPlan&lt;&#x2F;code&gt;
-(selects fragmentation tier based on tessera size), &lt;code&gt;FragmentId&lt;&#x2F;code&gt; (tessera hash +
-index + shard count + checksum), &lt;code&gt;FragmentEnvelope&lt;&#x2F;code&gt; (fragment with its metadata
-for wire transport), &lt;code&gt;FragmentationTier&lt;&#x2F;code&gt; (Small&#x2F;Medium&#x2F;Large), &lt;code&gt;Attestation&lt;&#x2F;code&gt;
-(proof that a node holds a fragment at a given time), and &lt;code&gt;ReplicateAck&lt;&#x2F;code&gt;
-(acknowledgement of fragment receipt). Three new port traits define the
-hexagonal boundaries: &lt;code&gt;DhtPort&lt;&#x2F;code&gt; (find peers, replicate fragments, request
-attestations, ping), &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; (store&#x2F;read&#x2F;delete&#x2F;list&#x2F;verify fragments),
-and &lt;code&gt;ReciprocityLedger&lt;&#x2F;code&gt; (record storage exchanges, query balances, find best
-peers). Maximum tessera size is 1 GB.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-crypto&lt;&#x2F;strong&gt; (updated) — The existing &lt;code&gt;ReedSolomonCoder&lt;&#x2F;code&gt; now powers
-fragment encoding. Data is split into shards, parity shards are computed, and
-any combination of data shards can reconstruct the original — as long as the
-number of missing shards does not exceed the parity count.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-storage&lt;&#x2F;strong&gt; (updated) — Two new adapters:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt; — stores fragment data as files on disk
-(&lt;code&gt;{root}&#x2F;{tessera_hash}&#x2F;{index:03}.shard&lt;&#x2F;code&gt;) with a SQLite metadata index
-tracking tessera hash, shard index, shard count, checksum, and byte size.
-Verification recomputes the BLAKE3 hash and compares it to the stored
-checksum.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;SqliteReciprocityLedger&lt;&#x2F;code&gt; — bilateral storage accounting in SQLite. Each peer
-has a row tracking bytes stored for them and bytes they store for us. The
-&lt;code&gt;balance&lt;&#x2F;code&gt; column is a generated column
-(&lt;code&gt;bytes_they_store_for_us - bytes_stored_for_them&lt;&#x2F;code&gt;). UPSERT ensures atomic
-increment of counters.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;New migration (&lt;code&gt;002_replication.sql&lt;&#x2F;code&gt;) adds tables for fragments, fragment plans,
-holders, holder-fragment mappings, and reciprocity balances.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-dht&lt;&#x2F;strong&gt; (updated) — Four new message variants: &lt;code&gt;Replicate&lt;&#x2F;code&gt; (send a
-fragment envelope), &lt;code&gt;ReplicateAck&lt;&#x2F;code&gt; (confirm receipt), &lt;code&gt;AttestRequest&lt;&#x2F;code&gt; (ask a
-node to prove it holds a tessera&#x27;s fragments), and &lt;code&gt;AttestResponse&lt;&#x2F;code&gt; (return
-attestation with checksums and timestamp). The engine handles these in its
-message dispatch loop.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-replication&lt;&#x2F;strong&gt; — The new crate, with five modules:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Fragment encoding&lt;&#x2F;em&gt; (&lt;code&gt;fragment.rs&lt;&#x2F;code&gt;): &lt;code&gt;encode_tessera()&lt;&#x2F;code&gt; selects the
-fragmentation tier based on size, then calls Reed-Solomon encoding for Medium
-and Large tiers. Three tiers:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Small&lt;&#x2F;strong&gt; (&amp;lt; 4 MB): whole-file replication to r=7 peers, no erasure coding&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Medium&lt;&#x2F;strong&gt; (4–256 MB): 16 data + 8 parity shards, distributed across r=7
-peers&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Large&lt;&#x2F;strong&gt; (≥ 256 MB): 48 data + 24 parity shards, distributed across r=7
-peers&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Distribution&lt;&#x2F;em&gt; (&lt;code&gt;distributor.rs&lt;&#x2F;code&gt;): subnet diversity filtering limits peers per
-&#x2F;24 IPv4 subnet (or &#x2F;48 IPv6 prefix) to avoid correlated failures. If all your
-fragments land on the same rack, a single power outage kills them all.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Service&lt;&#x2F;em&gt; (&lt;code&gt;service.rs&lt;&#x2F;code&gt;): &lt;code&gt;ReplicationService&lt;&#x2F;code&gt; is the orchestrator.
-&lt;code&gt;replicate_tessera()&lt;&#x2F;code&gt; encodes the data, finds the closest peers via DHT,
-applies subnet diversity, and distributes fragments round-robin.
-&lt;code&gt;receive_fragment()&lt;&#x2F;code&gt; validates the BLAKE3 checksum, checks reciprocity balance
-(rejects if the sender&#x27;s deficit exceeds the configured threshold), stores the
-fragment, and updates the ledger. &lt;code&gt;handle_attestation_request()&lt;&#x2F;code&gt; lists local
-fragments and computes their checksums as proof of possession.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Repair&lt;&#x2F;em&gt; (&lt;code&gt;repair.rs&lt;&#x2F;code&gt;): &lt;code&gt;check_tessera_health()&lt;&#x2F;code&gt; requests attestations from
-known holders, falls back to ping for unresponsive nodes, verifies local
-fragment integrity, and returns one of three actions: &lt;code&gt;Healthy&lt;&#x2F;code&gt;,
-&lt;code&gt;NeedsReplication { deficit }&lt;&#x2F;code&gt;, or &lt;code&gt;CorruptLocal { fragment_index }&lt;&#x2F;code&gt;. The
-repair loop runs every 24 hours (with 2-hour jitter) via &lt;code&gt;tokio::select!&lt;&#x2F;code&gt; with
-shutdown integration.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Configuration&lt;&#x2F;em&gt; (&lt;code&gt;config.rs&lt;&#x2F;code&gt;): &lt;code&gt;ReplicationConfig&lt;&#x2F;code&gt; with defaults for repair
-interval (24h), jitter (2h), concurrent transfers (4), minimum free space (1
-GB), deficit allowance (256 MB), and per-peer storage limit (1 GB).&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;tesd&lt;&#x2F;strong&gt; (updated) — The daemon now opens a SQLite database (&lt;code&gt;db&#x2F;tesseras.db&lt;&#x2F;code&gt;),
-runs migrations, creates &lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt;, &lt;code&gt;SqliteReciprocityLedger&lt;&#x2F;code&gt;, and
-&lt;code&gt;FsBlobStore&lt;&#x2F;code&gt; instances, wraps the DHT engine in a &lt;code&gt;DhtPortAdapter&lt;&#x2F;code&gt;, builds a
-&lt;code&gt;ReplicationService&lt;&#x2F;code&gt;, and spawns the repair loop as a background task with
-graceful shutdown.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 193 tests across the workspace:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;15 unit tests in tesseras-replication (fragment encoding tiers, checksum
-validation, subnet diversity, repair health checks, service receive&#x2F;replicate
-flows)&lt;&#x2F;li&gt;
-&lt;li&gt;3 integration tests with real storage (full encode→distribute→receive cycle
-for medium tessera, small whole-file replication, tampered fragment rejection)&lt;&#x2F;li&gt;
-&lt;li&gt;Tests use in-memory SQLite + tempdir fragments with mockall mocks for DHT and
-BlobStore&lt;&#x2F;li&gt;
-&lt;li&gt;Zero clippy warnings, clean formatting&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Three-tier fragmentation&lt;&#x2F;strong&gt;: small files don&#x27;t need erasure coding — the
-overhead isn&#x27;t worth it. Medium and large files get progressively more parity
-shards. This avoids wasting storage on small tesseras while providing strong
-redundancy for large ones.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Owner-push distribution&lt;&#x2F;strong&gt;: the tessera owner encodes fragments and pushes
-them to peers, rather than peers pulling. This simplifies the protocol (no
-negotiation phase) and ensures fragments are distributed immediately.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Bilateral reciprocity without consensus&lt;&#x2F;strong&gt;: each node tracks its own balance
-with each peer locally. No global ledger, no token, no blockchain. If peer A
-stores 500 MB for peer B, peer B should store roughly 500 MB for peer A. Free
-riders lose redundancy gradually — their fragments are deprioritized for
-repair, but never deleted.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Subnet diversity&lt;&#x2F;strong&gt;: fragments are spread across different network subnets to
-survive correlated failures. A datacenter outage shouldn&#x27;t take out all copies
-of a tessera.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Attestation-first health checks&lt;&#x2F;strong&gt;: the repair loop asks holders to prove
-possession (attestation with checksums) before declaring a tessera degraded.
-Only when attestation fails does it fall back to a simple ping. This catches
-silent data corruption, not just node departure.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 3: API and Apps&lt;&#x2F;strong&gt; — Flutter mobile&#x2F;desktop app via
-flutter_rust_bridge, GraphQL API (async-graphql), WASM browser node&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4: Resilience and Scale&lt;&#x2F;strong&gt; — ML-DSA post-quantum signatures, advanced
-NAT traversal, Shamir&#x27;s Secret Sharing for heirs, packaging for
-Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI on SourceHut&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser, institutional
-curation, genealogy integration, physical media export&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Nodes can find each other and keep each other&#x27;s memories alive. Next, we give
-people a way to hold their memories in their hands.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 1: Nodes Find Each Other</title>
- <published>2026-02-14T11:00:00+00:00</published>
- <updated>2026-02-14T11:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase1-basic-network/"/>
- <id>https://tesseras.net/news/phase1-basic-network/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase1-basic-network/">&lt;p&gt;Tesseras is no longer a local-only tool. Phase 1 delivers the networking layer:
-nodes discover each other through a Kademlia DHT, communicate over QUIC, and
-publish tessera pointers that any peer on the network can find. A tessera
-created on node A is now findable from node C.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; (updated) — New network domain types: &lt;code&gt;TesseraPointer&lt;&#x2F;code&gt;
-(lightweight reference to a tessera&#x27;s holders and fragment locations),
-&lt;code&gt;NodeIdentity&lt;&#x2F;code&gt; (node ID + public key + proof-of-work nonce), &lt;code&gt;NodeInfo&lt;&#x2F;code&gt;
-(identity + address + capabilities), and &lt;code&gt;Capabilities&lt;&#x2F;code&gt; (bitflags for what a
-node supports: DHT, storage, relay, replication).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-net&lt;&#x2F;strong&gt; — The transport layer, built on QUIC via quinn. The &lt;code&gt;Transport&lt;&#x2F;code&gt;
-trait defines the port: &lt;code&gt;send&lt;&#x2F;code&gt;, &lt;code&gt;recv&lt;&#x2F;code&gt;, &lt;code&gt;disconnect&lt;&#x2F;code&gt;, &lt;code&gt;local_addr&lt;&#x2F;code&gt;. Two adapters
-implement it:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;QuinnTransport&lt;&#x2F;code&gt; — real QUIC with self-signed TLS, ALPN negotiation
-(&lt;code&gt;tesseras&#x2F;1&lt;&#x2F;code&gt;), connection pooling via DashMap, and a background accept loop
-that handles incoming streams.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;MemTransport&lt;&#x2F;code&gt; + &lt;code&gt;SimNetwork&lt;&#x2F;code&gt; — in-memory channels for deterministic testing
-without network I&#x2F;O. Every integration test in the DHT crate runs against
-this.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;The wire protocol uses length-prefixed MessagePack: a 4-byte big-endian length
-header followed by an rmp-serde payload. &lt;code&gt;WireMessage&lt;&#x2F;code&gt; carries a version byte,
-request ID, and a body that can be a request, response, or protocol-level error.
-Maximum message size is 64 KiB.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-dht&lt;&#x2F;strong&gt; — A complete Kademlia implementation:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;em&gt;Routing table&lt;&#x2F;em&gt;: 160 k-buckets with k=20. Least-recently-seen eviction,
-move-to-back on update, ping-check before replacing a full bucket&#x27;s oldest
-entry.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;XOR distance&lt;&#x2F;em&gt;: 160-bit XOR metric with bucket indexing by highest differing
-bit.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Proof-of-work&lt;&#x2F;em&gt;: nodes grind a nonce until &lt;code&gt;BLAKE3(pubkey || nonce)[..20]&lt;&#x2F;code&gt; has
-8 leading zero bits (~256 hash attempts on average). Cheap enough for any
-device, expensive enough to make Sybil attacks impractical at scale.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Protocol messages&lt;&#x2F;em&gt;: Ping&#x2F;Pong, FindNode&#x2F;FindNodeResponse,
-FindValue&#x2F;FindValueResult, Store — all serialized with MessagePack via serde.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Pointer store&lt;&#x2F;em&gt;: bounded in-memory store with configurable TTL (24 hours
-default) and max entries (10,000 default). When full, evicts pointers furthest
-from the local node ID, following Kademlia&#x27;s distance-based responsibility
-model.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;DhtEngine&lt;&#x2F;em&gt;: the main orchestrator. Handles incoming RPCs, runs iterative
-lookups (alpha=3 parallelism), bootstrap, publish, and find. The &lt;code&gt;run()&lt;&#x2F;code&gt;
-method drives a &lt;code&gt;tokio::select!&lt;&#x2F;code&gt; loop with maintenance timers: routing table
-refresh every 60 seconds, pointer expiry every 5 minutes.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;tesd&lt;&#x2F;strong&gt; — A full-node binary. Parses CLI args (bind address, bootstrap peers,
-data directory), generates a PoW-valid node identity, binds a QUIC endpoint,
-bootstraps into the network, and runs the DHT engine. Graceful shutdown on
-Ctrl+C via tokio signal handling.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Infrastructure&lt;&#x2F;strong&gt; — OpenTofu configuration for two Hetzner Cloud bootstrap
-nodes (cx22 instances in Falkenstein, Germany and Helsinki, Finland). Cloud-init
-provisioning script creates a dedicated &lt;code&gt;tesseras&lt;&#x2F;code&gt; user, writes a config file,
-and sets up a systemd service. Firewall rules open UDP 4433 (QUIC) and restrict
-metrics to internal access.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 139 tests across the workspace:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;47 unit tests in tesseras-dht (routing table, distance, PoW, pointer store,
-message serialization, engine RPCs)&lt;&#x2F;li&gt;
-&lt;li&gt;5 multi-node integration tests (3-node bootstrap, 10-node lookup convergence,
-publish-and-find, node departure detection, PoW rejection)&lt;&#x2F;li&gt;
-&lt;li&gt;14 tests in tesseras-net (codec roundtrips, transport send&#x2F;recv, backpressure,
-disconnect)&lt;&#x2F;li&gt;
-&lt;li&gt;Docker Compose smoke tests with 3 containerized nodes communicating over real
-QUIC&lt;&#x2F;li&gt;
-&lt;li&gt;Zero clippy warnings, clean formatting&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Transport as a port&lt;&#x2F;strong&gt;: the &lt;code&gt;Transport&lt;&#x2F;code&gt; trait is the only interface between
-the DHT engine and the network. Swapping QUIC for any other protocol means
-implementing four methods. All DHT tests use the in-memory adapter, making
-them fast and deterministic.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;One stream per RPC&lt;&#x2F;strong&gt;: each DHT request-response pair uses a fresh
-bidirectional QUIC stream. No multiplexing complexity, no head-of-line
-blocking between independent operations. QUIC handles the multiplexing at the
-connection level.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;MessagePack over Protobuf&lt;&#x2F;strong&gt;: compact binary encoding without code generation
-or schema files. Serde integration means adding a field to a message is a
-one-line change. Trade-off: no built-in schema evolution guarantees, but at
-this stage velocity matters more.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;PoW instead of stake or reputation&lt;&#x2F;strong&gt;: a node identity costs ~256 BLAKE3
-hashes. This runs in under a second on any hardware, including a Raspberry Pi,
-but generating thousands of identities for a Sybil attack becomes expensive.
-No tokens, no blockchain, no external dependencies.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Iterative lookup with routing table updates&lt;&#x2F;strong&gt;: discovered nodes are added to
-the routing table as they&#x27;re encountered during iterative lookups, following
-standard Kademlia behavior. This ensures the routing table improves
-organically as nodes interact.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 2: Replication&lt;&#x2F;strong&gt; — Reed-Solomon erasure coding over the network,
-fragment distribution, automatic repair loops, bilateral reciprocity ledger
-(no blockchain, no tokens)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 3: API and Apps&lt;&#x2F;strong&gt; — Flutter mobile&#x2F;desktop app via
-flutter_rust_bridge, GraphQL API (async-graphql), WASM browser node&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4: Resilience and Scale&lt;&#x2F;strong&gt; — ML-DSA post-quantum signatures, advanced
-NAT traversal, Shamir&#x27;s Secret Sharing for heirs, packaging for
-Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI on SourceHut&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser, institutional
-curation, genealogy integration, physical media export&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Nodes can find each other. Next, they learn to keep each other&#x27;s memories alive.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 0: Foundation Laid</title>
- <published>2026-02-14T10:00:00+00:00</published>
- <updated>2026-02-14T10:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase0-foundation/"/>
- <id>https://tesseras.net/news/phase0-foundation/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase0-foundation/">&lt;p&gt;The first milestone of the Tesseras project is complete. Phase 0 establishes the
-foundation that every future component will build on: domain types,
-cryptography, storage, and a usable command-line interface.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; — The domain layer defines the tessera format: &lt;code&gt;ContentHash&lt;&#x2F;code&gt;
-(BLAKE3, 32 bytes), &lt;code&gt;NodeId&lt;&#x2F;code&gt; (Kademlia, 20 bytes), memory types (Moment,
-Reflection, Daily, Relation, Object), visibility modes (Private, Circle, Public,
-PublicAfterDeath, Sealed), and a plain-text manifest format that can be parsed
-by any programming language for the next thousand years. The application service
-layer (&lt;code&gt;TesseraService&lt;&#x2F;code&gt;) handles create, verify, export, and list operations
-through port traits, following hexagonal architecture.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-crypto&lt;&#x2F;strong&gt; — Ed25519 key generation, signing, and verification. A
-dual-signature framework (Ed25519 + ML-DSA placeholder) ready for post-quantum
-migration. BLAKE3 content hashing. Reed-Solomon erasure coding behind a feature
-flag for future replication.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-storage&lt;&#x2F;strong&gt; — SQLite index via rusqlite with plain-SQL migrations.
-Filesystem blob store with content-addressable layout
-(&lt;code&gt;blobs&#x2F;&amp;lt;tessera_hash&amp;gt;&#x2F;&amp;lt;memory_hash&amp;gt;&#x2F;&amp;lt;filename&amp;gt;&lt;&#x2F;code&gt;). Identity key persistence on
-disk.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-cli&lt;&#x2F;strong&gt; — A working &lt;code&gt;tesseras&lt;&#x2F;code&gt; binary with five commands:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;init&lt;&#x2F;code&gt; — generates Ed25519 identity, creates SQLite database&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;create &amp;lt;dir&amp;gt;&lt;&#x2F;code&gt; — scans a directory for media files, creates a signed tessera&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;verify &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt; — checks signature and file integrity&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;export &amp;lt;hash&amp;gt; &amp;lt;dest&amp;gt;&lt;&#x2F;code&gt; — writes a self-contained tessera directory&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;list&lt;&#x2F;code&gt; — shows a table of stored tesseras&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 67+ tests across the workspace: unit tests in every module,
-property-based tests (proptest) for hex roundtrips and manifest serialization,
-integration tests covering the full create-verify-export cycle including
-tampered file and invalid signature detection. Zero clippy warnings.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Hexagonal architecture&lt;&#x2F;strong&gt;: crypto operations are injected via trait objects
-(&lt;code&gt;Box&amp;lt;dyn Hasher&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;Box&amp;lt;dyn ManifestSigner&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;Box&amp;lt;dyn ManifestVerifier&amp;gt;&lt;&#x2F;code&gt;),
-keeping the core crate free of concrete crypto dependencies.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Feature flags&lt;&#x2F;strong&gt;: the &lt;code&gt;service&lt;&#x2F;code&gt; feature on tesseras-core gates the async
-application layer. The &lt;code&gt;classical&lt;&#x2F;code&gt; and &lt;code&gt;erasure&lt;&#x2F;code&gt; features on tesseras-crypto
-control which algorithms are compiled in.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Plain-text manifest&lt;&#x2F;strong&gt;: parseable without any binary format library, with
-explicit &lt;code&gt;blake3:&lt;&#x2F;code&gt; hash prefixes and human-readable layout.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;p&gt;Phase 0 is the local-only foundation. The road ahead:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 1: Networking&lt;&#x2F;strong&gt; — QUIC transport (quinn), Kademlia DHT for peer
-discovery, NAT traversal&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 2: Replication&lt;&#x2F;strong&gt; — Reed-Solomon erasure coding over the network,
-repair loops, bilateral reciprocity (no blockchain, no tokens)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 3: Clients&lt;&#x2F;strong&gt; — Flutter mobile&#x2F;desktop app via flutter_rust_bridge,
-GraphQL API, WASM browser node&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4: Hardening&lt;&#x2F;strong&gt; — ML-DSA post-quantum signatures, packaging for
-Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI on SourceHut&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;The tessera format is stable. Everything built from here connects to and extends
-what exists today.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Hello, World</title>
- <published>2026-02-13T00:00:00+00:00</published>
- <updated>2026-02-13T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/hello-world/"/>
- <id>https://tesseras.net/news/hello-world/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/hello-world/">&lt;p&gt;Today we&#x27;re announcing the Tesseras project: a peer-to-peer network for
-preserving human memories across millennia.&lt;&#x2F;p&gt;
-&lt;p&gt;Tesseras is built on a simple idea — your photos, recordings, and writings
-deserve to outlast any company, platform, or file format. Each person creates a
-tessera, a self-contained time capsule that the network keeps alive through
-mutual aid and redundancy.&lt;&#x2F;p&gt;
-&lt;p&gt;The project is in its earliest stage. We&#x27;re building the foundation: tools to
-create, verify, and export tesseras offline. The network layer, replication, and
-apps will follow.&lt;&#x2F;p&gt;
-&lt;p&gt;If this mission resonates with you, &lt;a href=&quot;&#x2F;subscriptions&#x2F;&quot;&gt;join the mailing list&lt;&#x2F;a&gt; or
-browse the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras&quot;&gt;source code&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
-</feed>
diff --git a/atom.xml.gz b/atom.xml.gz
deleted file mode 100644
index 4a69ec8..0000000
--- a/atom.xml.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/.nojekyll b/book/en/.nojekyll
deleted file mode 100644
index f173110..0000000
--- a/book/en/.nojekyll
+++ /dev/null
@@ -1 +0,0 @@
-This file makes sure that Github Pages doesn't process mdBook's output.
diff --git a/book/en/404.html b/book/en/404.html
deleted file mode 100644
index 357f11b..0000000
--- a/book/en/404.html
+++ /dev/null
@@ -1,228 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Page not found - Tesseras User Guide</title>
- <base href="/book/en/">
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="document-not-found-404"><a class="header" href="#document-not-found-404">Document not found (404)</a></h1>
-<p>This URL is invalid, sorry. Please use the navigation bar or search to continue.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
-
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
-
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/404.html.gz b/book/en/404.html.gz
deleted file mode 100644
index 7571907..0000000
--- a/book/en/404.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/ayu-highlight-3fdfc3ac.css b/book/en/ayu-highlight-3fdfc3ac.css
deleted file mode 100644
index dba94b0..0000000
--- a/book/en/ayu-highlight-3fdfc3ac.css
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-Based off of the Ayu theme
-Original by Dempfi (https://github.com/dempfi/ayu)
-*/
-
-.hljs {
- display: block;
- overflow-x: auto;
- background: #191f26;
- color: #e6e1cf;
-}
-
-.hljs-comment,
-.hljs-quote {
- color: #5c6773;
-}
-
-.hljs-variable,
-.hljs-template-variable,
-.hljs-attribute,
-.hljs-attr,
-.hljs-regexp,
-.hljs-link,
-.hljs-selector-id,
-.hljs-selector-class {
- color: #ff7733;
-}
-
-.hljs-number,
-.hljs-meta,
-.hljs-builtin-name,
-.hljs-literal,
-.hljs-type,
-.hljs-params {
- color: #ffee99;
-}
-
-.hljs-string,
-.hljs-bullet {
- color: #b8cc52;
-}
-
-.hljs-title,
-.hljs-built_in,
-.hljs-section {
- color: #ffb454;
-}
-
-.hljs-keyword,
-.hljs-selector-tag,
-.hljs-symbol {
- color: #ff7733;
-}
-
-.hljs-name {
- color: #36a3d9;
-}
-
-.hljs-tag {
- color: #00568d;
-}
-
-.hljs-emphasis {
- font-style: italic;
-}
-
-.hljs-strong {
- font-weight: bold;
-}
-
-.hljs-addition {
- color: #91b362;
-}
-
-.hljs-deletion {
- color: #d96c75;
-}
diff --git a/book/en/ayu-highlight-3fdfc3ac.css.gz b/book/en/ayu-highlight-3fdfc3ac.css.gz
deleted file mode 100644
index 81dfff3..0000000
--- a/book/en/ayu-highlight-3fdfc3ac.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/book-a0b12cfe.js b/book/en/book-a0b12cfe.js
deleted file mode 100644
index 62d7c4c..0000000
--- a/book/en/book-a0b12cfe.js
+++ /dev/null
@@ -1,843 +0,0 @@
-'use strict';
-
-/* global default_theme, default_dark_theme, default_light_theme, hljs, ClipboardJS */
-
-// Fix back button cache problem
-window.onunload = function() { };
-
-// Global variable, shared between modules
-function playground_text(playground, hidden = true) {
- const code_block = playground.querySelector('code');
-
- if (window.ace && code_block.classList.contains('editable')) {
- const editor = window.ace.edit(code_block);
- return editor.getValue();
- } else if (hidden) {
- return code_block.textContent;
- } else {
- return code_block.innerText;
- }
-}
-
-(function codeSnippets() {
- function fetch_with_timeout(url, options, timeout = 6000) {
- return Promise.race([
- fetch(url, options),
- new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)),
- ]);
- }
-
- const playgrounds = Array.from(document.querySelectorAll('.playground'));
- if (playgrounds.length > 0) {
- fetch_with_timeout('https://play.rust-lang.org/meta/crates', {
- headers: {
- 'Content-Type': 'application/json',
- },
- method: 'POST',
- mode: 'cors',
- })
- .then(response => response.json())
- .then(response => {
- // get list of crates available in the rust playground
- const playground_crates = response.crates.map(item => item['id']);
- playgrounds.forEach(block => handle_crate_list_update(block, playground_crates));
- });
- }
-
- function handle_crate_list_update(playground_block, playground_crates) {
- // update the play buttons after receiving the response
- update_play_button(playground_block, playground_crates);
-
- // and install on change listener to dynamically update ACE editors
- if (window.ace) {
- const code_block = playground_block.querySelector('code');
- if (code_block.classList.contains('editable')) {
- const editor = window.ace.edit(code_block);
- editor.addEventListener('change', () => {
- update_play_button(playground_block, playground_crates);
- });
- // add Ctrl-Enter command to execute rust code
- editor.commands.addCommand({
- name: 'run',
- bindKey: {
- win: 'Ctrl-Enter',
- mac: 'Ctrl-Enter',
- },
- exec: _editor => run_rust_code(playground_block),
- });
- }
- }
- }
-
- // updates the visibility of play button based on `no_run` class and
- // used crates vs ones available on https://play.rust-lang.org
- function update_play_button(pre_block, playground_crates) {
- const play_button = pre_block.querySelector('.play-button');
-
- // skip if code is `no_run`
- if (pre_block.querySelector('code').classList.contains('no_run')) {
- play_button.classList.add('hidden');
- return;
- }
-
- // get list of `extern crate`'s from snippet
- const txt = playground_text(pre_block);
- const re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g;
- const snippet_crates = [];
- let item;
- while (item = re.exec(txt)) {
- snippet_crates.push(item[1]);
- }
-
- // check if all used crates are available on play.rust-lang.org
- const all_available = snippet_crates.every(function(elem) {
- return playground_crates.indexOf(elem) > -1;
- });
-
- if (all_available) {
- play_button.classList.remove('hidden');
- play_button.hidden = false;
- } else {
- play_button.classList.add('hidden');
- }
- }
-
- function run_rust_code(code_block) {
- let result_block = code_block.querySelector('.result');
- if (!result_block) {
- result_block = document.createElement('code');
- result_block.className = 'result hljs language-bash';
-
- code_block.append(result_block);
- }
-
- const text = playground_text(code_block);
- const classes = code_block.querySelector('code').classList;
- let edition = '2015';
- classes.forEach(className => {
- if (className.startsWith('edition')) {
- edition = className.slice(7);
- }
- });
- const params = {
- version: 'stable',
- optimize: '0',
- code: text,
- edition: edition,
- };
-
- if (text.indexOf('#![feature') !== -1) {
- params.version = 'nightly';
- }
-
- result_block.innerText = 'Running...';
-
- fetch_with_timeout('https://play.rust-lang.org/evaluate.json', {
- headers: {
- 'Content-Type': 'application/json',
- },
- method: 'POST',
- mode: 'cors',
- body: JSON.stringify(params),
- })
- .then(response => response.json())
- .then(response => {
- if (response.result.trim() === '') {
- result_block.innerText = 'No output';
- result_block.classList.add('result-no-output');
- } else {
- result_block.innerText = response.result;
- result_block.classList.remove('result-no-output');
- }
- })
- .catch(error => result_block.innerText = 'Playground Communication: ' + error.message);
- }
-
- // Syntax highlighting Configuration
- hljs.configure({
- tabReplace: ' ', // 4 spaces
- languages: [], // Languages used for auto-detection
- });
-
- const code_nodes = Array
- .from(document.querySelectorAll('code'))
- // Don't highlight `inline code` blocks in headers.
- .filter(function(node) {
- return !node.parentElement.classList.contains('header');
- });
-
- if (window.ace) {
- // language-rust class needs to be removed for editable
- // blocks or highlightjs will capture events
- code_nodes
- .filter(function(node) {
- return node.classList.contains('editable');
- })
- .forEach(function(block) {
- block.classList.remove('language-rust');
- });
-
- code_nodes
- .filter(function(node) {
- return !node.classList.contains('editable');
- })
- .forEach(function(block) {
- hljs.highlightBlock(block);
- });
- } else {
- code_nodes.forEach(function(block) {
- hljs.highlightBlock(block);
- });
- }
-
- // Adding the hljs class gives code blocks the color css
- // even if highlighting doesn't apply
- code_nodes.forEach(function(block) {
- block.classList.add('hljs');
- });
-
- Array.from(document.querySelectorAll('code.hljs')).forEach(function(block) {
-
- const lines = Array.from(block.querySelectorAll('.boring'));
- // If no lines were hidden, return
- if (!lines.length) {
- return;
- }
- block.classList.add('hide-boring');
-
- const buttons = document.createElement('div');
- buttons.className = 'buttons';
- buttons.innerHTML = '<button title="Show hidden lines" \
-aria-label="Show hidden lines"></button>';
- buttons.firstChild.innerHTML = document.getElementById('fa-eye').innerHTML;
-
- // add expand button
- const pre_block = block.parentNode;
- pre_block.insertBefore(buttons, pre_block.firstChild);
-
- buttons.firstChild.addEventListener('click', function(e) {
- if (this.title === 'Show hidden lines') {
- this.innerHTML = document.getElementById('fa-eye-slash').innerHTML;
- this.title = 'Hide lines';
- this.setAttribute('aria-label', e.target.title);
-
- block.classList.remove('hide-boring');
- } else if (this.title === 'Hide lines') {
- this.innerHTML = document.getElementById('fa-eye').innerHTML;
- this.title = 'Show hidden lines';
- this.setAttribute('aria-label', e.target.title);
-
- block.classList.add('hide-boring');
- }
- });
- });
-
- if (window.playground_copyable) {
- Array.from(document.querySelectorAll('pre code')).forEach(function(block) {
- const pre_block = block.parentNode;
- if (!pre_block.classList.contains('playground')) {
- let buttons = pre_block.querySelector('.buttons');
- if (!buttons) {
- buttons = document.createElement('div');
- buttons.className = 'buttons';
- pre_block.insertBefore(buttons, pre_block.firstChild);
- }
-
- const clipButton = document.createElement('button');
- clipButton.className = 'clip-button';
- clipButton.title = 'Copy to clipboard';
- clipButton.setAttribute('aria-label', clipButton.title);
- clipButton.innerHTML = '<i class="tooltiptext"></i>';
-
- buttons.insertBefore(clipButton, buttons.firstChild);
- }
- });
- }
-
- // Process playground code blocks
- Array.from(document.querySelectorAll('.playground')).forEach(function(pre_block) {
- // Add play button
- let buttons = pre_block.querySelector('.buttons');
- if (!buttons) {
- buttons = document.createElement('div');
- buttons.className = 'buttons';
- pre_block.insertBefore(buttons, pre_block.firstChild);
- }
-
- const runCodeButton = document.createElement('button');
- runCodeButton.className = 'play-button';
- runCodeButton.hidden = true;
- runCodeButton.title = 'Run this code';
- runCodeButton.setAttribute('aria-label', runCodeButton.title);
- runCodeButton.innerHTML = document.getElementById('fa-play').innerHTML;
-
- buttons.insertBefore(runCodeButton, buttons.firstChild);
- runCodeButton.addEventListener('click', () => {
- run_rust_code(pre_block);
- });
-
- if (window.playground_copyable) {
- const copyCodeClipboardButton = document.createElement('button');
- copyCodeClipboardButton.className = 'clip-button';
- copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>';
- copyCodeClipboardButton.title = 'Copy to clipboard';
- copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title);
-
- buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild);
- }
-
- const code_block = pre_block.querySelector('code');
- if (window.ace && code_block.classList.contains('editable')) {
- const undoChangesButton = document.createElement('button');
- undoChangesButton.className = 'reset-button';
- undoChangesButton.title = 'Undo changes';
- undoChangesButton.setAttribute('aria-label', undoChangesButton.title);
- undoChangesButton.innerHTML +=
- document.getElementById('fa-clock-rotate-left').innerHTML;
-
- buttons.insertBefore(undoChangesButton, buttons.firstChild);
-
- undoChangesButton.addEventListener('click', function() {
- const editor = window.ace.edit(code_block);
- editor.setValue(editor.originalCode);
- editor.clearSelection();
- });
- }
- });
-})();
-
-(function themes() {
- const html = document.querySelector('html');
- const themeToggleButton = document.getElementById('mdbook-theme-toggle');
- const themePopup = document.getElementById('mdbook-theme-list');
- const themeColorMetaTag = document.querySelector('meta[name="theme-color"]');
- const themeIds = [];
- themePopup.querySelectorAll('button.theme').forEach(function(el) {
- themeIds.push(el.id);
- });
- const stylesheets = {
- ayuHighlight: document.querySelector('#mdbook-ayu-highlight-css'),
- tomorrowNight: document.querySelector('#mdbook-tomorrow-night-css'),
- highlight: document.querySelector('#mdbook-highlight-css'),
- };
-
- function showThemes() {
- themePopup.style.display = 'block';
- themeToggleButton.setAttribute('aria-expanded', true);
- themePopup.querySelector('button#mdbook-theme-' + get_theme()).focus();
- }
-
- function updateThemeSelected() {
- themePopup.querySelectorAll('.theme-selected').forEach(function(el) {
- el.classList.remove('theme-selected');
- });
- const selected = get_saved_theme() ?? 'default_theme';
- let element = themePopup.querySelector('button#mdbook-theme-' + selected);
- if (element === null) {
- // Fall back in case there is no "Default" item.
- element = themePopup.querySelector('button#mdbook-theme-' + get_theme());
- }
- element.classList.add('theme-selected');
- }
-
- function hideThemes() {
- themePopup.style.display = 'none';
- themeToggleButton.setAttribute('aria-expanded', false);
- themeToggleButton.focus();
- }
-
- function get_saved_theme() {
- let theme = null;
- try {
- theme = localStorage.getItem('mdbook-theme');
- } catch {
- // ignore error.
- }
- return theme;
- }
-
- function delete_saved_theme() {
- localStorage.removeItem('mdbook-theme');
- }
-
- function get_theme() {
- const theme = get_saved_theme();
- if (theme === null || theme === undefined || !themeIds.includes('mdbook-theme-' + theme)) {
- if (typeof default_dark_theme === 'undefined') {
- // A customized index.hbs might not define this, so fall back to
- // old behavior of determining the default on page load.
- return default_theme;
- }
- return window.matchMedia('(prefers-color-scheme: dark)').matches
- ? default_dark_theme
- : default_light_theme;
- } else {
- return theme;
- }
- }
-
- let previousTheme = default_theme;
- function set_theme(theme, store = true) {
- let ace_theme;
-
- if (theme === 'coal' || theme === 'navy') {
- stylesheets.ayuHighlight.disabled = true;
- stylesheets.tomorrowNight.disabled = false;
- stylesheets.highlight.disabled = true;
-
- ace_theme = 'ace/theme/tomorrow_night';
- } else if (theme === 'ayu') {
- stylesheets.ayuHighlight.disabled = false;
- stylesheets.tomorrowNight.disabled = true;
- stylesheets.highlight.disabled = true;
- ace_theme = 'ace/theme/tomorrow_night';
- } else {
- stylesheets.ayuHighlight.disabled = true;
- stylesheets.tomorrowNight.disabled = true;
- stylesheets.highlight.disabled = false;
- ace_theme = 'ace/theme/dawn';
- }
-
- setTimeout(function() {
- themeColorMetaTag.content = getComputedStyle(document.documentElement).backgroundColor;
- }, 1);
-
- if (window.ace && window.editors) {
- window.editors.forEach(function(editor) {
- editor.setTheme(ace_theme);
- });
- }
-
- if (store) {
- try {
- localStorage.setItem('mdbook-theme', theme);
- } catch {
- // ignore error.
- }
- }
-
- html.classList.remove(previousTheme);
- html.classList.add(theme);
- previousTheme = theme;
- updateThemeSelected();
- }
-
- const query = window.matchMedia('(prefers-color-scheme: dark)');
- query.onchange = function() {
- set_theme(get_theme(), false);
- };
-
- // Set theme.
- set_theme(get_theme(), false);
-
- themeToggleButton.addEventListener('click', function() {
- if (themePopup.style.display === 'block') {
- hideThemes();
- } else {
- showThemes();
- }
- });
-
- themePopup.addEventListener('click', function(e) {
- let theme;
- if (e.target.className === 'theme') {
- theme = e.target.id;
- } else if (e.target.parentElement.className === 'theme') {
- theme = e.target.parentElement.id;
- } else {
- return;
- }
- theme = theme.replace(/^mdbook-theme-/, '');
-
- if (theme === 'default_theme' || theme === null) {
- delete_saved_theme();
- set_theme(get_theme(), false);
- } else {
- set_theme(theme);
- }
- });
-
- themePopup.addEventListener('focusout', function(e) {
- // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below)
- if (!!e.relatedTarget &&
- !themeToggleButton.contains(e.relatedTarget) &&
- !themePopup.contains(e.relatedTarget)
- ) {
- hideThemes();
- }
- });
-
- // Should not be needed, but it works around an issue on macOS & iOS:
- // https://github.com/rust-lang/mdBook/issues/628
- document.addEventListener('click', function(e) {
- if (themePopup.style.display === 'block' &&
- !themeToggleButton.contains(e.target) &&
- !themePopup.contains(e.target)
- ) {
- hideThemes();
- }
- });
-
- document.addEventListener('keydown', function(e) {
- if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
- return;
- }
- if (!themePopup.contains(e.target)) {
- return;
- }
-
- let li;
- switch (e.key) {
- case 'Escape':
- e.preventDefault();
- hideThemes();
- break;
- case 'ArrowUp':
- e.preventDefault();
- li = document.activeElement.parentElement;
- if (li && li.previousElementSibling) {
- li.previousElementSibling.querySelector('button').focus();
- }
- break;
- case 'ArrowDown':
- e.preventDefault();
- li = document.activeElement.parentElement;
- if (li && li.nextElementSibling) {
- li.nextElementSibling.querySelector('button').focus();
- }
- break;
- case 'Home':
- e.preventDefault();
- themePopup.querySelector('li:first-child button').focus();
- break;
- case 'End':
- e.preventDefault();
- themePopup.querySelector('li:last-child button').focus();
- break;
- }
- });
-})();
-
-(function sidebar() {
- const sidebar = document.getElementById('mdbook-sidebar');
- const sidebarLinks = document.querySelectorAll('#mdbook-sidebar a');
- const sidebarToggleButton = document.getElementById('mdbook-sidebar-toggle');
- const sidebarResizeHandle = document.getElementById('mdbook-sidebar-resize-handle');
- const sidebarCheckbox = document.getElementById('mdbook-sidebar-toggle-anchor');
- let firstContact = null;
-
-
- /* Because we cannot change the `display` using only CSS after/before the transition, we
- need JS to do it. We change the display to prevent the browsers search to find text inside
- the collapsed sidebar. */
- if (!document.documentElement.classList.contains('sidebar-visible')) {
- sidebar.style.display = 'none';
- }
- sidebar.addEventListener('transitionend', () => {
- /* We only change the display to "none" if we're collapsing the sidebar. */
- if (!sidebarCheckbox.checked) {
- sidebar.style.display = 'none';
- }
- });
- sidebarToggleButton.addEventListener('click', () => {
- /* To allow the sidebar expansion animation, we first need to put back the display. */
- if (!sidebarCheckbox.checked) {
- sidebar.style.display = '';
- // Workaround for Safari skipping the animation when changing
- // `display` and a transform in the same event loop. This forces a
- // reflow after updating the display.
- sidebar.offsetHeight;
- }
- });
-
- function showSidebar() {
- document.documentElement.classList.add('sidebar-visible');
- Array.from(sidebarLinks).forEach(function(link) {
- link.setAttribute('tabIndex', 0);
- });
- sidebarToggleButton.setAttribute('aria-expanded', true);
- sidebar.setAttribute('aria-hidden', false);
- try {
- localStorage.setItem('mdbook-sidebar', 'visible');
- } catch {
- // Ignore error.
- }
- }
-
- function hideSidebar() {
- document.documentElement.classList.remove('sidebar-visible');
- Array.from(sidebarLinks).forEach(function(link) {
- link.setAttribute('tabIndex', -1);
- });
- sidebarToggleButton.setAttribute('aria-expanded', false);
- sidebar.setAttribute('aria-hidden', true);
- try {
- localStorage.setItem('mdbook-sidebar', 'hidden');
- } catch {
- // Ignore error.
- }
- }
-
- // Toggle sidebar
- sidebarCheckbox.addEventListener('change', function sidebarToggle() {
- if (sidebarCheckbox.checked) {
- const current_width = parseInt(
- document.documentElement.style.getPropertyValue('--sidebar-target-width'), 10);
- if (current_width < 150) {
- document.documentElement.style.setProperty('--sidebar-target-width', '150px');
- }
- showSidebar();
- } else {
- hideSidebar();
- }
- });
-
- sidebarResizeHandle.addEventListener('mousedown', initResize, false);
-
- function initResize() {
- window.addEventListener('mousemove', resize, false);
- window.addEventListener('mouseup', stopResize, false);
- document.documentElement.classList.add('sidebar-resizing');
- }
- function resize(e) {
- let pos = e.clientX - sidebar.offsetLeft;
- if (pos < 20) {
- hideSidebar();
- } else {
- if (!document.documentElement.classList.contains('sidebar-visible')) {
- showSidebar();
- }
- pos = Math.min(pos, window.innerWidth - 100);
- document.documentElement.style.setProperty('--sidebar-target-width', pos + 'px');
- }
- }
- //on mouseup remove windows functions mousemove & mouseup
- function stopResize() {
- document.documentElement.classList.remove('sidebar-resizing');
- window.removeEventListener('mousemove', resize, false);
- window.removeEventListener('mouseup', stopResize, false);
- }
-
- document.addEventListener('touchstart', function(e) {
- firstContact = {
- x: e.touches[0].clientX,
- time: Date.now(),
- };
- }, { passive: true });
-
- document.addEventListener('touchmove', function(e) {
- if (!firstContact) {
- return;
- }
-
- const curX = e.touches[0].clientX;
- const xDiff = curX - firstContact.x,
- tDiff = Date.now() - firstContact.time;
-
- if (tDiff < 250 && Math.abs(xDiff) >= 150) {
- if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) {
- showSidebar();
- } else if (xDiff < 0 && curX < 300) {
- hideSidebar();
- }
-
- firstContact = null;
- }
- }, { passive: true });
-})();
-
-(function chapterNavigation() {
- document.addEventListener('keydown', function(e) {
- if (e.altKey || e.ctrlKey || e.metaKey) {
- return;
- }
- if (window.search && window.search.hasFocus()) {
- return;
- }
- const html = document.querySelector('html');
-
- function next() {
- const nextButton = document.querySelector('.nav-chapters.next');
- if (nextButton) {
- window.location.href = nextButton.href;
- }
- }
- function prev() {
- const previousButton = document.querySelector('.nav-chapters.previous');
- if (previousButton) {
- window.location.href = previousButton.href;
- }
- }
- function showHelp() {
- const container = document.getElementById('mdbook-help-container');
- const overlay = document.getElementById('mdbook-help-popup');
- container.style.display = 'flex';
-
- // Clicking outside the popup will dismiss it.
- const mouseHandler = event => {
- if (overlay.contains(event.target)) {
- return;
- }
- if (event.button !== 0) {
- return;
- }
- event.preventDefault();
- event.stopPropagation();
- document.removeEventListener('mousedown', mouseHandler);
- hideHelp();
- };
-
- // Pressing esc will dismiss the popup.
- const escapeKeyHandler = event => {
- if (event.key === 'Escape') {
- event.preventDefault();
- event.stopPropagation();
- document.removeEventListener('keydown', escapeKeyHandler, true);
- hideHelp();
- }
- };
- document.addEventListener('keydown', escapeKeyHandler, true);
- document.getElementById('mdbook-help-container')
- .addEventListener('mousedown', mouseHandler);
- }
- function hideHelp() {
- document.getElementById('mdbook-help-container').style.display = 'none';
- }
-
- // Usually needs the Shift key to be pressed
- switch (e.key) {
- case '?':
- e.preventDefault();
- showHelp();
- break;
- }
-
- // Rest of the keys are only active when the Shift key is not pressed
- if (e.shiftKey) {
- return;
- }
-
- switch (e.key) {
- case 'ArrowRight':
- e.preventDefault();
- if (html.dir === 'rtl') {
- prev();
- } else {
- next();
- }
- break;
- case 'ArrowLeft':
- e.preventDefault();
- if (html.dir === 'rtl') {
- next();
- } else {
- prev();
- }
- break;
- }
- });
-})();
-
-(function clipboard() {
- const clipButtons = document.querySelectorAll('.clip-button');
-
- function hideTooltip(elem) {
- elem.firstChild.innerText = '';
- elem.className = 'clip-button';
- }
-
- function showTooltip(elem, msg) {
- elem.firstChild.innerText = msg;
- elem.className = 'clip-button tooltipped';
- }
-
- const clipboardSnippets = new ClipboardJS('.clip-button', {
- text: function(trigger) {
- hideTooltip(trigger);
- const playground = trigger.closest('pre');
- return playground_text(playground, false);
- },
- });
-
- Array.from(clipButtons).forEach(function(clipButton) {
- clipButton.addEventListener('mouseout', function(e) {
- hideTooltip(e.currentTarget);
- });
- });
-
- clipboardSnippets.on('success', function(e) {
- e.clearSelection();
- showTooltip(e.trigger, 'Copied!');
- });
-
- clipboardSnippets.on('error', function(e) {
- showTooltip(e.trigger, 'Clipboard error!');
- });
-})();
-
-(function scrollToTop() {
- const menuTitle = document.querySelector('.menu-title');
-
- menuTitle.addEventListener('click', function() {
- document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' });
- });
-})();
-
-(function controllMenu() {
- const menu = document.getElementById('mdbook-menu-bar');
-
- (function controllPosition() {
- let scrollTop = document.scrollingElement.scrollTop;
- let prevScrollTop = scrollTop;
- const minMenuY = -menu.clientHeight - 50;
- // When the script loads, the page can be at any scroll (e.g. if you refresh it).
- menu.style.top = scrollTop + 'px';
- // Same as parseInt(menu.style.top.slice(0, -2), but faster
- let topCache = menu.style.top.slice(0, -2);
- menu.classList.remove('sticky');
- let stickyCache = false; // Same as menu.classList.contains('sticky'), but faster
- document.addEventListener('scroll', function() {
- scrollTop = Math.max(document.scrollingElement.scrollTop, 0);
- // `null` means that it doesn't need to be updated
- let nextSticky = null;
- let nextTop = null;
- const scrollDown = scrollTop > prevScrollTop;
- const menuPosAbsoluteY = topCache - scrollTop;
- if (scrollDown) {
- nextSticky = false;
- if (menuPosAbsoluteY > 0) {
- nextTop = prevScrollTop;
- }
- } else {
- if (menuPosAbsoluteY > 0) {
- nextSticky = true;
- } else if (menuPosAbsoluteY < minMenuY) {
- nextTop = prevScrollTop + minMenuY;
- }
- }
- if (nextSticky === true && stickyCache === false) {
- menu.classList.add('sticky');
- stickyCache = true;
- } else if (nextSticky === false && stickyCache === true) {
- menu.classList.remove('sticky');
- stickyCache = false;
- }
- if (nextTop !== null) {
- menu.style.top = nextTop + 'px';
- topCache = nextTop;
- }
- prevScrollTop = scrollTop;
- }, { passive: true });
- })();
- (function controllBorder() {
- function updateBorder() {
- if (menu.offsetTop === 0) {
- menu.classList.remove('bordered');
- } else {
- menu.classList.add('bordered');
- }
- }
- updateBorder();
- document.addEventListener('scroll', updateBorder, { passive: true });
- })();
-})();
diff --git a/book/en/book-a0b12cfe.js.gz b/book/en/book-a0b12cfe.js.gz
deleted file mode 100644
index de44523..0000000
--- a/book/en/book-a0b12cfe.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/clipboard-1626706a.min.js b/book/en/clipboard-1626706a.min.js
deleted file mode 100644
index 02c549e..0000000
--- a/book/en/clipboard-1626706a.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * clipboard.js v2.0.4
- * https://zenorocha.github.io/clipboard.js
- *
- * Licensed MIT © Zeno Rocha
- */
-!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(t,e,n){return e&&o(t.prototype,e),n&&o(t,n),t}}(),a=o(n(1)),c=o(n(3)),u=o(n(4));function o(t){return t&&t.__esModule?t:{default:t}}var l=function(t){function o(t,e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,o);var n=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}(this,(o.__proto__||Object.getPrototypeOf(o)).call(this));return n.resolveOptions(e),n.listenClick(t),n}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(o,c.default),i(o,[{key:"resolveOptions",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===r(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,u.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new a.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return s("action",t)}},{key:"defaultTarget",value:function(t){var e=s("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return s("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),o}();function s(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}t.exports=l},function(t,e,n){"use strict";var o,r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(t,e,n){return e&&o(t.prototype,e),n&&o(t,n),t}}(),a=n(2),c=(o=a)&&o.__esModule?o:{default:o};var u=function(){function e(t){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),this.resolveOptions(t),this.initSelection()}return i(e,[{key:"resolveOptions",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,c.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,c.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),e}();t.exports=u},function(t,e){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o<r;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,a=o.length;i<a;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},t.exports=n},function(t,e,n){var d=n(5),h=n(6);t.exports=function(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!d.string(e))throw new TypeError("Second argument must be a String");if(!d.fn(n))throw new TypeError("Third argument must be a Function");if(d.node(t))return s=e,f=n,(l=t).addEventListener(s,f),{destroy:function(){l.removeEventListener(s,f)}};if(d.nodeList(t))return a=t,c=e,u=n,Array.prototype.forEach.call(a,function(t){t.addEventListener(c,u)}),{destroy:function(){Array.prototype.forEach.call(a,function(t){t.removeEventListener(c,u)})}};if(d.string(t))return o=t,r=e,i=n,h(document.body,o,r,i);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");var o,r,i,a,c,u,l,s,f}},function(t,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},function(t,e,n){var a=n(7);function i(t,e,n,o,r){var i=function(e,n,t,o){return function(t){t.delegateTarget=a(t.target,n),t.delegateTarget&&o.call(e,t)}}.apply(this,arguments);return t.addEventListener(n,i,r),{destroy:function(){t.removeEventListener(n,i,r)}}}t.exports=function(t,e,n,o,r){return"function"==typeof t.addEventListener?i.apply(null,arguments):"function"==typeof n?i.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return i(t,e,n,o,r)}))}},function(t,e){if("undefined"!=typeof Element&&!Element.prototype.matches){var n=Element.prototype;n.matches=n.matchesSelector||n.mozMatchesSelector||n.msMatchesSelector||n.oMatchesSelector||n.webkitMatchesSelector}t.exports=function(t,e){for(;t&&9!==t.nodeType;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}}])}); \ No newline at end of file
diff --git a/book/en/clipboard-1626706a.min.js.gz b/book/en/clipboard-1626706a.min.js.gz
deleted file mode 100644
index ff99056..0000000
--- a/book/en/clipboard-1626706a.min.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/commands/create.html b/book/en/commands/create.html
deleted file mode 100644
index 66db6a5..0000000
--- a/book/en/commands/create.html
+++ /dev/null
@@ -1,329 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>create - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="../favicon-bfbdfe47.png">
- <link rel="stylesheet" href="../css/variables-8adf115d.css">
- <link rel="stylesheet" href="../css/general-2459343d.css">
- <link rel="stylesheet" href="../css/chrome-ae938929.css">
- <link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="../theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "../";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "../searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="../toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="../print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="tes-create"><a class="header" href="#tes-create">tes create</a></h1>
-<p>Create a tessera from a directory of files.</p>
-<h2 id="usage"><a class="header" href="#usage">Usage</a></h2>
-<pre><code class="language-bash">tes create &lt;PATH&gt; [OPTIONS]
-</code></pre>
-<h2 id="arguments"><a class="header" href="#arguments">Arguments</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argument</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;PATH&gt;</code></td><td>Directory containing files to include</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="options"><a class="header" href="#options">Options</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th><th>Default</th></tr>
-</thead>
-<tbody>
-<tr><td><code>-n, --non-interactive</code></td><td>Skip prompts</td><td>off</td></tr>
-<tr><td><code>--dry-run</code></td><td>Preview what would be included</td><td>off</td></tr>
-<tr><td><code>--visibility &lt;VALUE&gt;</code></td><td>Visibility level: <code>public</code>, <code>private</code>, <code>circle</code></td><td><code>public</code></td></tr>
-<tr><td><code>--language &lt;CODE&gt;</code></td><td>Language code (e.g., <code>en</code>, <code>pt-BR</code>)</td><td><code>en</code></td></tr>
-<tr><td><code>--tags &lt;LIST&gt;</code></td><td>Comma-separated tags</td><td>none</td></tr>
-<tr><td><code>--location &lt;DESC&gt;</code></td><td>Location description</td><td>none</td></tr>
-<tr><td><code>--data-dir &lt;PATH&gt;</code></td><td>Base directory for data storage</td><td><code>~/.tesseras</code></td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="supported-file-formats"><a class="header" href="#supported-file-formats">Supported file formats</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Extension</th><th>Type</th><th>Memory type</th></tr>
-</thead>
-<tbody>
-<tr><td><code>.jpg</code>, <code>.jpeg</code></td><td>Image (JPEG)</td><td>Moment</td></tr>
-<tr><td><code>.png</code></td><td>Image (PNG)</td><td>Moment</td></tr>
-<tr><td><code>.wav</code></td><td>Audio (WAV PCM)</td><td>Moment</td></tr>
-<tr><td><code>.webm</code></td><td>Video (WebM)</td><td>Moment</td></tr>
-<tr><td><code>.txt</code></td><td>Plain text (UTF-8)</td><td>Reflection</td></tr>
-</tbody>
-</table>
-</div>
-<p>Files with other extensions are ignored.</p>
-<h2 id="memory-type-inference"><a class="header" href="#memory-type-inference">Memory type inference</a></h2>
-<p>The command automatically assigns a memory type based on the file format:</p>
-<ul>
-<li><strong>Text files</strong> (<code>.txt</code>) are classified as <strong>Reflection</strong> — thoughts, beliefs, or opinions</li>
-<li><strong>All other formats</strong> are classified as <strong>Moment</strong> — a photo, recording, or video of something happening</li>
-</ul>
-<h2 id="examples"><a class="header" href="#examples">Examples</a></h2>
-<h3 id="preview-before-creating"><a class="header" href="#preview-before-creating">Preview before creating</a></h3>
-<pre><code class="language-bash">tes create ./my-photos --dry-run
-</code></pre>
-<h3 id="create-with-metadata"><a class="header" href="#create-with-metadata">Create with metadata</a></h3>
-<pre><code class="language-bash">tes create ./vacation-2026 \
- --tags "vacation,summer,beach" \
- --location "Florianópolis, Brazil" \
- --language pt-BR \
- --visibility public
-</code></pre>
-<h3 id="non-interactive-mode"><a class="header" href="#non-interactive-mode">Non-interactive mode</a></h3>
-<pre><code class="language-bash">tes create ./daily-log --non-interactive --tags "daily"
-</code></pre>
-<h2 id="visibility-levels"><a class="header" href="#visibility-levels">Visibility levels</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Level</th><th>Who can access</th></tr>
-</thead>
-<tbody>
-<tr><td><code>public</code></td><td>Anyone (default)</td></tr>
-<tr><td><code>private</code></td><td>Only you (and designated heirs)</td></tr>
-<tr><td><code>circle</code></td><td>Explicitly chosen people</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="what-happens-under-the-hood"><a class="header" href="#what-happens-under-the-hood">What happens under the hood</a></h2>
-<ol>
-<li>Scans the directory for supported files</li>
-<li>Computes a BLAKE3 hash for each file</li>
-<li>Assigns a memory type based on file extension</li>
-<li>Generates a MANIFEST listing all files with their checksums</li>
-<li>Signs the MANIFEST with your Ed25519 private key</li>
-<li>Stores the files and metadata in the local database</li>
-<li>Outputs the content hash that uniquely identifies this tessera</li>
-</ol>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="../commands/init.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/verify.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="../commands/init.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/verify.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="../elasticlunr-ef4e11c1.min.js"></script>
- <script src="../mark-09e88c2c.min.js"></script>
- <script src="../searcher-c2a407aa.js"></script>
-
- <script src="../clipboard-1626706a.min.js"></script>
- <script src="../highlight-abc7f01d.js"></script>
- <script src="../book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/commands/create.html.gz b/book/en/commands/create.html.gz
deleted file mode 100644
index db49670..0000000
--- a/book/en/commands/create.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/commands/export.html b/book/en/commands/export.html
deleted file mode 100644
index e6ba75b..0000000
--- a/book/en/commands/export.html
+++ /dev/null
@@ -1,307 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>export - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="../favicon-bfbdfe47.png">
- <link rel="stylesheet" href="../css/variables-8adf115d.css">
- <link rel="stylesheet" href="../css/general-2459343d.css">
- <link rel="stylesheet" href="../css/chrome-ae938929.css">
- <link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="../theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "../";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "../searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="../toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="../print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="tes-export"><a class="header" href="#tes-export">tes export</a></h1>
-<p>Export a tessera as a self-contained directory.</p>
-<h2 id="usage"><a class="header" href="#usage">Usage</a></h2>
-<pre><code class="language-bash">tes export &lt;HASH&gt; &lt;DEST&gt;
-</code></pre>
-<h2 id="arguments"><a class="header" href="#arguments">Arguments</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argument</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;HASH&gt;</code></td><td>Tessera content hash (64 hex characters)</td></tr>
-<tr><td><code>&lt;DEST&gt;</code></td><td>Destination directory</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="options"><a class="header" href="#options">Options</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;PATH&gt;</code></td><td>Base directory for data storage (default: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="output-structure"><a class="header" href="#output-structure">Output structure</a></h2>
-<p>The export creates a directory named <code>tessera-&lt;hash&gt;</code> inside the destination:</p>
-<pre><code>tessera-9f2c4a1b.../
-├── MANIFEST # Plain text index with checksums
-├── README.decode # Human-readable decoding instructions
-├── identity/
-│ ├── creator.pub.ed25519 # Creator's public key
-│ └── signature.ed25519.sig # Signature of the MANIFEST
-├── memories/
-│ ├── &lt;content-hash&gt;/
-│ │ ├── media.jpg # Primary media file
-│ │ ├── context.txt # Human context in plain UTF-8
-│ │ └── meta.json # Structured metadata
-│ └── .../
-├── schema/
-│ └── v1.json # JSON schema for metadata validation
-└── decode/
- ├── formats.txt # Explanation of all formats used
- ├── jpeg.txt # How to decode JPEG
- ├── wav.txt # How to decode WAV
- └── json.txt # How to decode JSON
-</code></pre>
-<h2 id="example"><a class="header" href="#example">Example</a></h2>
-<pre><code class="language-bash">tes export 9f2c4a1b3e7d8f0cabc123def4567890... ./backup
-</code></pre>
-<pre><code>Exported to ./backup/tessera-9f2c4a1b3e7d8f0cabc123def4567890...
-</code></pre>
-<h2 id="key-feature-self-contained"><a class="header" href="#key-feature-self-contained">Key feature: self-contained</a></h2>
-<p>The exported directory is designed to be readable <strong>without Tesseras software</strong>. It includes:</p>
-<ul>
-<li><strong>MANIFEST</strong> — a plain-text file listing every file with its BLAKE3 checksum, readable by any text editor</li>
-<li><strong>README.decode</strong> — human-readable instructions for understanding the contents</li>
-<li><strong>decode/</strong> — detailed explanations of every file format used (JPEG, WAV, JSON, UTF-8)</li>
-</ul>
-<p>This means someone thousands of years from now, with no knowledge of Tesseras, can still understand and access the memories.</p>
-<h2 id="use-cases"><a class="header" href="#use-cases">Use cases</a></h2>
-<ul>
-<li><strong>Backup</strong> — export to an external drive, USB stick, or cloud storage</li>
-<li><strong>Sharing</strong> — give someone a complete copy of a tessera</li>
-<li><strong>Archival</strong> — store on write-once media (DVD, Blu-ray, tape)</li>
-<li><strong>Migration</strong> — move tesseras between machines without needing the database</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="../commands/verify.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/list.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="../commands/verify.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/list.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="../elasticlunr-ef4e11c1.min.js"></script>
- <script src="../mark-09e88c2c.min.js"></script>
- <script src="../searcher-c2a407aa.js"></script>
-
- <script src="../clipboard-1626706a.min.js"></script>
- <script src="../highlight-abc7f01d.js"></script>
- <script src="../book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/commands/export.html.gz b/book/en/commands/export.html.gz
deleted file mode 100644
index 32ccd9e..0000000
--- a/book/en/commands/export.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/commands/init.html b/book/en/commands/init.html
deleted file mode 100644
index 0c1db91..0000000
--- a/book/en/commands/init.html
+++ /dev/null
@@ -1,288 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>init - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="../favicon-bfbdfe47.png">
- <link rel="stylesheet" href="../css/variables-8adf115d.css">
- <link rel="stylesheet" href="../css/general-2459343d.css">
- <link rel="stylesheet" href="../css/chrome-ae938929.css">
- <link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="../theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "../";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "../searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="../toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="../print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="tes-init"><a class="header" href="#tes-init">tes init</a></h1>
-<p>Initialize identity and local database.</p>
-<h2 id="usage"><a class="header" href="#usage">Usage</a></h2>
-<pre><code class="language-bash">tes init
-</code></pre>
-<h2 id="description"><a class="header" href="#description">Description</a></h2>
-<p>Sets up your local Tesseras environment. This is the first command you should run after installing Tesseras.</p>
-<p>The command creates:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Path</th><th>Contents</th></tr>
-</thead>
-<tbody>
-<tr><td><code>~/.tesseras/identity/</code></td><td>Ed25519 keypair for signing tesseras</td></tr>
-<tr><td><code>~/.tesseras/db/</code></td><td>SQLite database for indexing</td></tr>
-<tr><td><code>~/.tesseras/blobs/</code></td><td>Blob storage for memory files</td></tr>
-<tr><td><code>~/.tesseras/config.toml</code></td><td>Configuration file</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="options"><a class="header" href="#options">Options</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;PATH&gt;</code></td><td>Base directory for data storage (default: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="idempotent"><a class="header" href="#idempotent">Idempotent</a></h2>
-<p>Running <code>init</code> again is safe. If an identity already exists, it is preserved:</p>
-<pre><code class="language-bash">tes init
-</code></pre>
-<pre><code>Ed25519 identity already exists
-Database initialized
-Tesseras initialized at /home/user/.tesseras
-</code></pre>
-<h2 id="custom-data-directory"><a class="header" href="#custom-data-directory">Custom data directory</a></h2>
-<pre><code class="language-bash">tes --data-dir /mnt/usb/tesseras init
-</code></pre>
-<p>This creates the full directory structure under <code>/mnt/usb/tesseras/</code> instead of the default location.</p>
-<h2 id="what-happens-under-the-hood"><a class="header" href="#what-happens-under-the-hood">What happens under the hood</a></h2>
-<ol>
-<li>Creates the directory structure (<code>identity/</code>, <code>db/</code>, <code>blobs/</code>)</li>
-<li>Generates an Ed25519 keypair (private key stays local, public key identifies you)</li>
-<li>Runs SQLite migrations to set up the database schema</li>
-<li>Writes a default <code>config.toml</code></li>
-</ol>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="../quick-start.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/create.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="../quick-start.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/create.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="../elasticlunr-ef4e11c1.min.js"></script>
- <script src="../mark-09e88c2c.min.js"></script>
- <script src="../searcher-c2a407aa.js"></script>
-
- <script src="../clipboard-1626706a.min.js"></script>
- <script src="../highlight-abc7f01d.js"></script>
- <script src="../book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/commands/init.html.gz b/book/en/commands/init.html.gz
deleted file mode 100644
index c3b534c..0000000
--- a/book/en/commands/init.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/commands/list.html b/book/en/commands/list.html
deleted file mode 100644
index c8f0a2b..0000000
--- a/book/en/commands/list.html
+++ /dev/null
@@ -1,283 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>list - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="../favicon-bfbdfe47.png">
- <link rel="stylesheet" href="../css/variables-8adf115d.css">
- <link rel="stylesheet" href="../css/general-2459343d.css">
- <link rel="stylesheet" href="../css/chrome-ae938929.css">
- <link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="../theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "../";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "../searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="../toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="../print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="tes-list"><a class="header" href="#tes-list">tes list</a></h1>
-<p>List all local tesseras.</p>
-<h2 id="usage"><a class="header" href="#usage">Usage</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<h2 id="options"><a class="header" href="#options">Options</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;PATH&gt;</code></td><td>Base directory for data storage (default: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="output"><a class="header" href="#output">Output</a></h2>
-<p>Displays a table with the following columns:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Column</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Hash</strong></td><td>First 16 characters of the content hash</td></tr>
-<tr><td><strong>Created</strong></td><td>Creation date (YYYY-MM-DD)</td></tr>
-<tr><td><strong>Memories</strong></td><td>Number of memories in the tessera</td></tr>
-<tr><td><strong>Size</strong></td><td>Total size (B, KB, MB, or GB)</td></tr>
-<tr><td><strong>Visibility</strong></td><td>Visibility level (public, private, or circle)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="example"><a class="header" href="#example">Example</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>Hash Created Memories Size Visibility
-9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public
-a3b7c2d9e4f01823 2026-02-10 1 12 KB private
-f8e7d6c5b4a39201 2026-01-28 12 4 MB public
-</code></pre>
-<h2 id="empty-database"><a class="header" href="#empty-database">Empty database</a></h2>
-<p>If no tesseras have been created yet:</p>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>No tesseras found.
-</code></pre>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="../commands/export.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../running-a-node.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="../commands/export.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../running-a-node.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="../elasticlunr-ef4e11c1.min.js"></script>
- <script src="../mark-09e88c2c.min.js"></script>
- <script src="../searcher-c2a407aa.js"></script>
-
- <script src="../clipboard-1626706a.min.js"></script>
- <script src="../highlight-abc7f01d.js"></script>
- <script src="../book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/commands/list.html.gz b/book/en/commands/list.html.gz
deleted file mode 100644
index 82e48b1..0000000
--- a/book/en/commands/list.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/commands/verify.html b/book/en/commands/verify.html
deleted file mode 100644
index d28d57c..0000000
--- a/book/en/commands/verify.html
+++ /dev/null
@@ -1,307 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>verify - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="../favicon-bfbdfe47.png">
- <link rel="stylesheet" href="../css/variables-8adf115d.css">
- <link rel="stylesheet" href="../css/general-2459343d.css">
- <link rel="stylesheet" href="../css/chrome-ae938929.css">
- <link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="../theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "../";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "../searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="../toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="../print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="tes-verify"><a class="header" href="#tes-verify">tes verify</a></h1>
-<p>Verify integrity of a stored tessera.</p>
-<h2 id="usage"><a class="header" href="#usage">Usage</a></h2>
-<pre><code class="language-bash">tes verify &lt;HASH&gt;
-</code></pre>
-<h2 id="arguments"><a class="header" href="#arguments">Arguments</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argument</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;HASH&gt;</code></td><td>Tessera content hash (64 hex characters)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="options"><a class="header" href="#options">Options</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;PATH&gt;</code></td><td>Base directory for data storage (default: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="what-it-checks"><a class="header" href="#what-it-checks">What it checks</a></h2>
-<ol>
-<li><strong>Signature validity</strong> — verifies the Ed25519 signature over the MANIFEST</li>
-<li><strong>File integrity</strong> — recomputes the BLAKE3 hash of every file and compares it against the MANIFEST</li>
-</ol>
-<h2 id="exit-codes"><a class="header" href="#exit-codes">Exit codes</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Code</th><th>Meaning</th></tr>
-</thead>
-<tbody>
-<tr><td><code>0</code></td><td>Verification passed — all files intact, signature valid</td></tr>
-<tr><td><code>1</code></td><td>Verification failed — corrupted files or invalid signature</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="examples"><a class="header" href="#examples">Examples</a></h2>
-<h3 id="successful-verification"><a class="header" href="#successful-verification">Successful verification</a></h3>
-<pre><code class="language-bash">tes verify 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-</code></pre>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-Signature: VALID
- [OK] memories/a1b2c3d4/media.jpg
- [OK] memories/e5f6a7b8/media.txt
- [OK] memories/c9d0e1f2/media.wav
-Verification: PASSED
-</code></pre>
-<h3 id="failed-verification"><a class="header" href="#failed-verification">Failed verification</a></h3>
-<p>If a file has been modified or corrupted:</p>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-Signature: VALID
- [OK] memories/a1b2c3d4/media.jpg
- [FAILED] memories/e5f6a7b8/media.txt
- [OK] memories/c9d0e1f2/media.wav
-Verification: FAILED
-</code></pre>
-<h2 id="use-cases"><a class="header" href="#use-cases">Use cases</a></h2>
-<ul>
-<li><strong>Routine integrity checks</strong> — periodically verify that your stored tesseras haven’t been corrupted</li>
-<li><strong>After transfer</strong> — verify after copying tesseras to a new device or storage medium</li>
-<li><strong>Trust verification</strong> — confirm that a tessera received from someone else hasn’t been tampered with</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="../commands/create.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/export.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="../commands/create.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/export.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="../elasticlunr-ef4e11c1.min.js"></script>
- <script src="../mark-09e88c2c.min.js"></script>
- <script src="../searcher-c2a407aa.js"></script>
-
- <script src="../clipboard-1626706a.min.js"></script>
- <script src="../highlight-abc7f01d.js"></script>
- <script src="../book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/commands/verify.html.gz b/book/en/commands/verify.html.gz
deleted file mode 100644
index 301946c..0000000
--- a/book/en/commands/verify.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/configuration.html b/book/en/configuration.html
deleted file mode 100644
index 532d6a0..0000000
--- a/book/en/configuration.html
+++ /dev/null
@@ -1,390 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Configuration - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="configuration"><a class="header" href="#configuration">Configuration</a></h1>
-<p>The daemon can be configured via a TOML file. Pass the path with <code>--config</code>:</p>
-<pre><code class="language-bash">tesseras-daemon --config /etc/tesseras/config.toml
-</code></pre>
-<p>If no config file is given, the daemon uses sensible defaults. CLI options (<code>--listen</code>, <code>--bootstrap</code>, <code>--data-dir</code>) override the corresponding config values.</p>
-<h2 id="full-example"><a class="header" href="#full-example">Full example</a></h2>
-<pre><code class="language-toml">[node]
-data_dir = "~/.local/share/tesseras"
-listen_addr = "0.0.0.0:4433"
-
-[dht]
-k = 20
-alpha = 3
-bucket_refresh_interval_secs = 3600
-republish_interval_secs = 3600
-pointer_ttl_secs = 86400
-max_stored_pointers = 100000
-ping_failure_threshold = 3
-
-[bootstrap]
-dns_domain = "_tesseras._udp.tesseras.net"
-hardcoded = [
- "boot1.tesseras.net:4433",
- "boot2.tesseras.net:4433",
-]
-
-[network]
-enable_mdns = true
-
-[observability]
-metrics_addr = "127.0.0.1:9190"
-log_format = "json"
-</code></pre>
-<h2 id="sections"><a class="header" href="#sections">Sections</a></h2>
-<h3 id="node"><a class="header" href="#node"><code>[node]</code></a></h3>
-<p>Basic node settings.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key</th><th>Type</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>data_dir</code></td><td>path</td><td>Platform-specific</td><td>Where to store identity, database, and blobs</td></tr>
-<tr><td><code>listen_addr</code></td><td>address</td><td><code>0.0.0.0:4433</code></td><td>QUIC listener address</td></tr>
-</tbody>
-</table>
-</div>
-<p>The default <code>data_dir</code> is <code>~/.local/share/tesseras</code> on Linux and <code>~/Library/Application Support/tesseras</code> on macOS.</p>
-<h3 id="dht"><a class="header" href="#dht"><code>[dht]</code></a></h3>
-<p>Kademlia DHT tuning parameters. The defaults work well for most deployments.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key</th><th>Type</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>k</code></td><td>integer</td><td><code>20</code></td><td>Maximum entries per routing table bucket</td></tr>
-<tr><td><code>alpha</code></td><td>integer</td><td><code>3</code></td><td>Parallelism for iterative lookups</td></tr>
-<tr><td><code>bucket_refresh_interval_secs</code></td><td>integer</td><td><code>3600</code></td><td>How often to refresh routing table buckets (seconds)</td></tr>
-<tr><td><code>republish_interval_secs</code></td><td>integer</td><td><code>3600</code></td><td>How often to republish stored pointers (seconds)</td></tr>
-<tr><td><code>pointer_ttl_secs</code></td><td>integer</td><td><code>86400</code></td><td>How long to keep a pointer before it expires (seconds)</td></tr>
-<tr><td><code>max_stored_pointers</code></td><td>integer</td><td><code>100000</code></td><td>Maximum number of pointers to store locally</td></tr>
-<tr><td><code>ping_failure_threshold</code></td><td>integer</td><td><code>3</code></td><td>How many consecutive ping failures before removing a peer</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="bootstrap"><a class="header" href="#bootstrap"><code>[bootstrap]</code></a></h3>
-<p>How the node discovers its first peers when joining the network.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key</th><th>Type</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>dns_domain</code></td><td>string</td><td><code>_tesseras._udp.tesseras.net</code></td><td>DNS domain for TXT-record-based peer discovery</td></tr>
-<tr><td><code>hardcoded</code></td><td>list of strings</td><td><code>["boot1.tesseras.net:4433", "boot2.tesseras.net:4433"]</code></td><td>Fallback bootstrap addresses</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="network"><a class="header" href="#network"><code>[network]</code></a></h3>
-<p>Network-level features.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key</th><th>Type</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>enable_mdns</code></td><td>boolean</td><td><code>true</code></td><td>Enable local network discovery via mDNS</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="observability"><a class="header" href="#observability"><code>[observability]</code></a></h3>
-<p>Monitoring and logging.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key</th><th>Type</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>metrics_addr</code></td><td>address</td><td><code>127.0.0.1:9190</code></td><td>Address for the Prometheus metrics endpoint</td></tr>
-<tr><td><code>log_format</code></td><td>string</td><td><code>json</code></td><td>Log output format (<code>json</code> or <code>text</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="ipv6-support"><a class="header" href="#ipv6-support">IPv6 Support</a></h2>
-<p>Tesseras supports IPv6 natively. The <code>listen_addr</code> and <code>listen_addrs</code> fields accept both IPv4 and IPv6 addresses.</p>
-<h3 id="listening-on-ipv6"><a class="header" href="#listening-on-ipv6">Listening on IPv6</a></h3>
-<p>To listen on all IPv6 interfaces:</p>
-<pre><code class="language-toml">[node]
-listen_addr = "[::]:4433"
-</code></pre>
-<p>On Linux and most BSDs, binding to <code>[::]</code> also accepts IPv4 connections (dual-stack) by default. On some systems (notably OpenBSD), <code>[::]</code> is IPv6-only due to <code>IPV6_V6ONLY</code> being enabled by default. To guarantee both IPv4 and IPv6 on all platforms, use <code>listen_addrs</code> with explicit addresses:</p>
-<pre><code class="language-toml">[node]
-listen_addrs = ["0.0.0.0:4433", "[::]:4433"]
-</code></pre>
-<p>For IPv6 loopback only (testing):</p>
-<pre><code class="language-toml">[node]
-listen_addr = "[::1]:4433"
-</code></pre>
-<h3 id="bootstrap-with-ipv6"><a class="header" href="#bootstrap-with-ipv6">Bootstrap with IPv6</a></h3>
-<p>Bootstrap addresses can be IPv6:</p>
-<pre><code class="language-toml">[bootstrap]
-hardcoded = [
- "boot1.tesseras.net:4433",
- "[2001:db8::1]:4433",
-]
-</code></pre>
-<p>DNS hostnames with both A and AAAA records are resolved to all addresses, so the daemon will connect over whichever protocol is reachable.</p>
-<h3 id="ipv6_v6only-behavior-by-os"><a class="header" href="#ipv6_v6only-behavior-by-os"><code>IPV6_V6ONLY</code> behavior by OS</a></h3>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>OS</th><th><code>[::]</code> accepts IPv4?</th><th>Notes</th></tr>
-</thead>
-<tbody>
-<tr><td>Linux</td><td>Yes (dual-stack)</td><td><code>IPV6_V6ONLY</code> defaults to 0</td></tr>
-<tr><td>macOS</td><td>Yes (dual-stack)</td><td><code>IPV6_V6ONLY</code> defaults to 0</td></tr>
-<tr><td>FreeBSD</td><td>Yes (dual-stack)</td><td><code>IPV6_V6ONLY</code> defaults to 0</td></tr>
-<tr><td>OpenBSD</td><td>No (IPv6-only)</td><td><code>IPV6_V6ONLY</code> always 1</td></tr>
-<tr><td>Windows</td><td>Yes (dual-stack)</td><td><code>IPV6_V6ONLY</code> defaults to 0</td></tr>
-</tbody>
-</table>
-</div>
-<p>If you need explicit control, use <code>listen_addrs</code> with both an IPv4 and IPv6 address.</p>
-<h2 id="minimal-config"><a class="header" href="#minimal-config">Minimal config</a></h2>
-<p>Most users don’t need a config file at all. If you do, a minimal config overriding only what you need is enough:</p>
-<pre><code class="language-toml">[node]
-listen_addr = "0.0.0.0:5000"
-
-[bootstrap]
-hardcoded = ["192.168.1.10:4433"]
-</code></pre>
-<p>All other values use their defaults.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="running-a-node.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="network-concepts.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="running-a-node.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="network-concepts.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/configuration.html.gz b/book/en/configuration.html.gz
deleted file mode 100644
index 307ecad..0000000
--- a/book/en/configuration.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/css/chrome-ae938929.css b/book/en/css/chrome-ae938929.css
deleted file mode 100644
index bab3889..0000000
--- a/book/en/css/chrome-ae938929.css
+++ /dev/null
@@ -1,756 +0,0 @@
-/* CSS for UI elements (a.k.a. chrome) */
-
-html {
- scrollbar-color: var(--scrollbar) transparent;
-}
-#mdbook-searchresults a,
-.content a:link,
-a:visited,
-a > .hljs {
- color: var(--links);
-}
-
-/*
- mdbook-body-container is necessary because mobile browsers don't seem to like
- overflow-x on the body tag when there is a <meta name="viewport"> tag.
-*/
-#mdbook-body-container {
- /*
- This is used when the sidebar pushes the body content off the side of
- the screen on small screens. Without it, dragging on mobile Safari
- will want to reposition the viewport in a weird way.
- */
- overflow-x: clip;
-}
-
-/* Menu Bar */
-
-#mdbook-menu-bar,
-#mdbook-menu-bar-hover-placeholder {
- z-index: 101;
- margin: auto calc(0px - var(--page-padding));
-}
-#mdbook-menu-bar {
- position: relative;
- display: flex;
- flex-wrap: wrap;
- background-color: var(--bg);
- border-block-end-color: var(--bg);
- border-block-end-width: 1px;
- border-block-end-style: solid;
-}
-#mdbook-menu-bar.sticky,
-#mdbook-menu-bar-hover-placeholder:hover + #mdbook-menu-bar,
-#mdbook-menu-bar:hover,
-html.sidebar-visible #mdbook-menu-bar {
- position: -webkit-sticky;
- position: sticky;
- top: 0 !important;
-}
-#mdbook-menu-bar-hover-placeholder {
- position: sticky;
- position: -webkit-sticky;
- top: 0;
- height: var(--menu-bar-height);
-}
-#mdbook-menu-bar.bordered {
- border-block-end-color: var(--table-border-color);
-}
-#mdbook-menu-bar .fa-svg, #mdbook-menu-bar .icon-button {
- position: relative;
- padding: 0 8px;
- z-index: 10;
- line-height: var(--menu-bar-height);
- cursor: pointer;
- transition: color 0.5s;
-}
-@media only screen and (max-width: 420px) {
- #mdbook-menu-bar .fa-svg, #mdbook-menu-bar .icon-button {
- padding: 0 5px;
- }
-}
-
-.icon-button {
- border: none;
- background: none;
- padding: 0;
- color: inherit;
-}
-.icon-button .fa-svg {
- margin: 0;
-}
-
-.right-buttons {
- margin: 0 15px;
-}
-.right-buttons a {
- text-decoration: none;
-}
-
-.left-buttons {
- display: flex;
- margin: 0 5px;
-}
-html:not(.js) .left-buttons button {
- display: none;
-}
-
-.menu-title {
- display: inline-block;
- font-weight: 200;
- font-size: 2.4rem;
- line-height: var(--menu-bar-height);
- text-align: center;
- margin: 0;
- flex: 1;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.menu-title {
- cursor: pointer;
-}
-
-.menu-bar,
-.menu-bar:visited,
-.nav-chapters,
-.nav-chapters:visited,
-.mobile-nav-chapters,
-.mobile-nav-chapters:visited,
-.menu-bar .icon-button,
-.menu-bar a .fa-svg {
- color: var(--icons);
-}
-
-.menu-bar .fa-svg:hover,
-.menu-bar .icon-button:hover,
-.nav-chapters:hover,
-.mobile-nav-chapters .fa-svg:hover {
- color: var(--icons-hover);
-}
-
-/* Nav Icons */
-
-.nav-chapters {
- font-size: 2.5em;
- text-align: center;
- text-decoration: none;
-
- position: fixed;
- top: 0;
- bottom: 0;
- margin: 0;
- max-width: 150px;
- min-width: 90px;
-
- display: flex;
- justify-content: center;
- align-content: center;
- flex-direction: column;
-
- transition: color 0.5s, background-color 0.5s;
-}
-
-.nav-chapters:hover {
- text-decoration: none;
- background-color: var(--theme-hover);
- transition: background-color 0.15s, color 0.15s;
-}
-
-.nav-wrapper {
- margin-block-start: 50px;
- display: none;
-}
-
-.mobile-nav-chapters {
- font-size: 2.5em;
- text-align: center;
- text-decoration: none;
- width: 90px;
- border-radius: 5px;
- background-color: var(--sidebar-bg);
-}
-
-/* Only Firefox supports flow-relative values */
-.previous { float: left; }
-[dir=rtl] .previous { float: right; }
-
-/* Only Firefox supports flow-relative values */
-.next {
- float: right;
- right: var(--page-padding);
-}
-[dir=rtl] .next {
- float: left;
- right: unset;
- left: var(--page-padding);
-}
-
-@media only screen and (max-width: 1080px) {
- .nav-wide-wrapper { display: none; }
- .nav-wrapper { display: block; }
-}
-
-/* sidebar-visible */
-@media only screen and (max-width: 1380px) {
- #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; }
- #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; }
-}
-
-/* Inline code */
-
-:not(pre) > .hljs {
- display: inline;
- padding: 0.1em 0.3em;
- border-radius: 3px;
-}
-
-:not(pre):not(a) > .hljs {
- color: var(--inline-code-color);
- overflow-x: initial;
-}
-
-a:hover > .hljs {
- text-decoration: underline;
-}
-
-pre {
- position: relative;
-}
-pre > .buttons {
- position: absolute;
- z-index: 100;
- right: 0px;
- top: 2px;
- margin: 0px;
- padding: 2px 0px;
-
- color: var(--sidebar-fg);
- cursor: pointer;
- visibility: hidden;
- opacity: 0;
- transition: visibility 0.1s linear, opacity 0.1s linear;
-}
-pre:hover > .buttons {
- visibility: visible;
- opacity: 1
-}
-pre > .buttons :hover {
- color: var(--sidebar-active);
- border-color: var(--icons-hover);
- background-color: var(--theme-hover);
-}
-pre > .buttons button {
- cursor: inherit;
- margin: 0px 5px;
- padding: 2px 3px 0px 4px;
- font-size: 23px;
-
- border-style: solid;
- border-width: 1px;
- border-radius: 4px;
- border-color: var(--icons);
- background-color: var(--theme-popup-bg);
- transition: 100ms;
- transition-property: color,border-color,background-color;
- color: var(--icons);
-}
-
-pre > .buttons button.clip-button {
- padding: 2px 4px 0px 6px;
-}
-pre > .buttons button.clip-button::before {
- /* clipboard image from octicons (https://github.com/primer/octicons/tree/v2.0.0) MIT license
- */
- content: url('data:image/svg+xml,<svg width="21" height="20" viewBox="0 0 24 25" \
-xmlns="http://www.w3.org/2000/svg" aria-label="Copy to clipboard">\
-<path d="M18 20h2v3c0 1-1 2-2 2H2c-.998 0-2-1-2-2V5c0-.911.755-1.667 1.667-1.667h5A3.323 3.323 0 \
-0110 0a3.323 3.323 0 013.333 3.333h5C19.245 3.333 20 4.09 20 5v8.333h-2V9H2v14h16v-3zM3 \
-7h14c0-.911-.793-1.667-1.75-1.667H13.5c-.957 0-1.75-.755-1.75-1.666C11.75 2.755 10.957 2 10 \
-2s-1.75.755-1.75 1.667c0 .911-.793 1.666-1.75 1.666H4.75C3.793 5.333 3 6.09 3 7z"/>\
-<path d="M4 19h6v2H4zM12 11H4v2h8zM4 17h4v-2H4zM15 15v-3l-4.5 4.5L15 21v-3l8.027-.032L23 15z"/>\
-</svg>');
- filter: var(--copy-button-filter);
-}
-pre > .buttons button.clip-button:hover::before {
- filter: var(--copy-button-filter-hover);
-}
-
-@media (pointer: coarse) {
- pre > .buttons button {
- /* On mobile, make it easier to tap buttons. */
- padding: 0.3rem 1rem;
- }
-
- .sidebar-resize-indicator {
- /* Hide resize indicator on devices with limited accuracy */
- display: none;
- }
-}
-pre > code {
- display: block;
- padding: 1rem;
-}
-
-/* FIXME: ACE editors overlap their buttons because ACE does absolute
- positioning within the code block which breaks padding. The only solution I
- can think of is to move the padding to the outer pre tag (or insert a div
- wrapper), but that would require fixing a whole bunch of CSS rules.
-*/
-.hljs.ace_editor {
- padding: 0rem 0rem;
-}
-
-pre > .result {
- margin-block-start: 10px;
-}
-
-/* Search */
-
-#mdbook-searchresults a {
- text-decoration: none;
-}
-
-mark {
- border-radius: 2px;
- padding-block-start: 0;
- padding-block-end: 1px;
- padding-inline-start: 3px;
- padding-inline-end: 3px;
- margin-block-start: 0;
- margin-block-end: -1px;
- margin-inline-start: -3px;
- margin-inline-end: -3px;
- background-color: var(--search-mark-bg);
- transition: background-color 300ms linear;
- cursor: pointer;
-}
-
-mark.fade-out {
- background-color: rgba(0,0,0,0) !important;
- cursor: auto;
-}
-
-.searchbar-outer {
- margin-inline-start: auto;
- margin-inline-end: auto;
- max-width: var(--content-max-width);
-}
-
-#mdbook-searchbar-outer.searching #mdbook-searchbar {
- padding-right: 30px;
-}
-#mdbook-searchbar-outer .spinner-wrapper {
- display: none;
-}
-#mdbook-searchbar-outer.searching .spinner-wrapper {
- display: block;
-}
-
-.search-wrapper {
- position: relative;
-}
-
-.spinner-wrapper {
- --spinner-margin: 2px;
- position: absolute;
- margin-block-start: calc(var(--searchbar-margin-block-start) + var(--spinner-margin));
- right: var(--spinner-margin);
- top: 0;
- bottom: var(--spinner-margin);
- padding: 6px;
- background-color: var(--bg);
-}
-
-#fa-spin {
- animation: rotating 2s linear infinite;
- display: inline-block;
-}
-
-@keyframes rotating {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
-
-#mdbook-searchbar {
- width: 100%;
- margin-block-start: var(--searchbar-margin-block-start);
- margin-block-end: 0;
- margin-inline-start: auto;
- margin-inline-end: auto;
- padding: 10px 16px;
- transition: box-shadow 300ms ease-in-out;
- border: 1px solid var(--searchbar-border-color);
- border-radius: 3px;
- background-color: var(--searchbar-bg);
- color: var(--searchbar-fg);
-}
-#mdbook-searchbar:focus,
-#mdbook-searchbar.active {
- box-shadow: 0 0 3px var(--searchbar-shadow-color);
-}
-
-.searchresults-header {
- font-weight: bold;
- font-size: 1em;
- padding-block-start: 18px;
- padding-block-end: 0;
- padding-inline-start: 5px;
- padding-inline-end: 0;
- color: var(--searchresults-header-fg);
-}
-
-.searchresults-outer {
- margin-inline-start: auto;
- margin-inline-end: auto;
- max-width: var(--content-max-width);
- border-block-end: 1px dashed var(--searchresults-border-color);
-}
-
-ul#mdbook-searchresults {
- list-style: none;
- padding-inline-start: 20px;
-}
-ul#mdbook-searchresults li {
- margin: 10px 0px;
- padding: 2px;
- border-radius: 2px;
-}
-ul#mdbook-searchresults li.focus {
- background-color: var(--searchresults-li-bg);
-}
-ul#mdbook-searchresults span.teaser {
- display: block;
- clear: both;
- margin-block-start: 5px;
- margin-block-end: 0;
- margin-inline-start: 20px;
- margin-inline-end: 0;
- font-size: 0.8em;
-}
-ul#mdbook-searchresults span.teaser em {
- font-weight: bold;
- font-style: normal;
-}
-
-/* Sidebar */
-
-.sidebar {
- position: fixed;
- left: 0;
- top: 0;
- bottom: 0;
- width: var(--sidebar-width);
- font-size: 0.875em;
- box-sizing: border-box;
- -webkit-overflow-scrolling: touch;
- overscroll-behavior-y: contain;
- background-color: var(--sidebar-bg);
- color: var(--sidebar-fg);
-}
-.sidebar-iframe-inner {
- --padding: 10px;
-
- background-color: var(--sidebar-bg);
- padding: var(--padding);
- margin: 0;
- font-size: 1.4rem;
- color: var(--sidebar-fg);
- min-height: calc(100vh - var(--padding) * 2);
-}
-.sidebar-iframe-outer {
- border: none;
- height: 100%;
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
-}
-[dir=rtl] .sidebar { left: unset; right: 0; }
-.sidebar-resizing {
- -moz-user-select: none;
- -webkit-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-html:not(.sidebar-resizing) .sidebar {
- transition: transform 0.3s; /* Animation: slide away */
-}
-.sidebar code {
- line-height: 2em;
-}
-.sidebar .sidebar-scrollbox {
- overflow-y: auto;
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- padding: 10px 10px;
-}
-.sidebar .sidebar-resize-handle {
- position: absolute;
- cursor: col-resize;
- width: 0;
- right: calc(var(--sidebar-resize-indicator-width) * -1);
- top: 0;
- bottom: 0;
- display: flex;
- align-items: center;
-}
-
-.sidebar-resize-handle .sidebar-resize-indicator {
- width: 100%;
- height: 16px;
- color: var(--icons);
- margin-inline-start: var(--sidebar-resize-indicator-space);
- display: flex;
- align-items: center;
- justify-content: flex-start;
-}
-.sidebar-resize-handle .sidebar-resize-indicator::before {
- content: "";
- width: 2px;
- height: 12px;
- border-left: dotted 2px currentColor;
-}
-.sidebar-resize-handle .sidebar-resize-indicator::after {
- content: "";
- width: 2px;
- height: 16px;
- border-left: dotted 2px currentColor;
-}
-
-[dir=rtl] .sidebar .sidebar-resize-handle {
- left: calc(var(--sidebar-resize-indicator-width) * -1);
- right: unset;
-}
-.js .sidebar .sidebar-resize-handle {
- cursor: col-resize;
- width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space));
-}
-
-html:not(.js) .sidebar-resize-handle {
- display: none;
-}
-
-/* sidebar-hidden */
-#mdbook-sidebar-toggle-anchor:not(:checked) ~ .sidebar {
- transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width)));
-}
-[dir=rtl] #mdbook-sidebar-toggle-anchor:not(:checked) ~ .sidebar {
- transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)));
-}
-.sidebar::-webkit-scrollbar {
- background: var(--sidebar-bg);
-}
-.sidebar::-webkit-scrollbar-thumb {
- background: var(--scrollbar);
-}
-
-/* sidebar-visible */
-#mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
- transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)));
-}
-[dir=rtl] #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
- transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width)));
-}
-@media only screen and (min-width: 620px) {
- #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
- transform: none;
- margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width));
- }
- [dir=rtl] #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
- transform: none;
- }
-}
-
-.chapter {
- list-style: none outside none;
- padding-inline-start: 0;
- line-height: 2.2em;
-}
-
-.chapter li {
- color: var(--sidebar-non-existant);
-}
-
-/* This is a span wrapping the chapter link and the fold chevron. */
-.chapter-link-wrapper {
- /* Used to position the chevron to the right, allowing the text to wrap before it. */
- display: flex;
-}
-
-.chapter li a {
- /* Remove underlines. */
- text-decoration: none;
- color: var(--sidebar-fg);
-}
-
-.chapter li a:hover {
- color: var(--sidebar-active);
-}
-
-.chapter li a.active {
- color: var(--sidebar-active);
-}
-
-/* This is the toggle chevron. */
-.chapter-fold-toggle {
- cursor: pointer;
- /* Positions the chevron to the side. */
- margin-inline-start: auto;
- padding: 0 10px;
- user-select: none;
- opacity: 0.68;
-}
-
-.chapter-fold-toggle div {
- transition: transform 0.5s;
-}
-
-/* collapse the section */
-.chapter li:not(.expanded) > ol {
- display: none;
-}
-
-.chapter li.chapter-item {
- line-height: 1.5em;
- margin-block-start: 0.6em;
-}
-
-/* When expanded, rotate the chevron to point down. */
-.chapter li.expanded > span > .chapter-fold-toggle div {
- transform: rotate(90deg);
-}
-
-.chapter a.current-header {
- color: var(--sidebar-active);
-}
-
-.on-this-page {
- margin-left: 22px;
- border-inline-start: 4px solid var(--sidebar-header-border-color);
- padding-left: 8px;
-}
-
-.on-this-page > ol {
- padding-left: 0;
-}
-
-/* Horizontal line in chapter list. */
-.spacer {
- width: 100%;
- height: 3px;
- margin: 5px 0px;
-}
-.chapter .spacer {
- background-color: var(--sidebar-spacer);
-}
-
-/* On touch devices, add more vertical spacing to make it easier to tap links. */
-@media (-moz-touch-enabled: 1), (pointer: coarse) {
- .chapter li a { padding: 5px 0; }
- .spacer { margin: 10px 0; }
-}
-
-.section {
- list-style: none outside none;
- padding-inline-start: 20px;
- line-height: 1.9em;
-}
-
-/* Theme Menu Popup */
-
-.theme-popup {
- position: absolute;
- left: 10px;
- top: var(--menu-bar-height);
- z-index: 1000;
- border-radius: 4px;
- font-size: 0.7em;
- color: var(--fg);
- background: var(--theme-popup-bg);
- border: 1px solid var(--theme-popup-border);
- margin: 0;
- padding: 0;
- list-style: none;
- display: none;
- /* Don't let the children's background extend past the rounded corners. */
- overflow: hidden;
-}
-[dir=rtl] .theme-popup { left: unset; right: 10px; }
-.theme-popup .default {
- color: var(--icons);
-}
-.theme-popup .theme {
- width: 100%;
- border: 0;
- margin: 0;
- padding: 2px 20px;
- line-height: 25px;
- white-space: nowrap;
- text-align: start;
- cursor: pointer;
- color: inherit;
- background: inherit;
- font-size: inherit;
-}
-.theme-popup .theme:hover {
- background-color: var(--theme-hover);
-}
-
-.theme-selected::before {
- display: inline-block;
- content: "✓";
- margin-inline-start: -14px;
- width: 14px;
-}
-
-/* The container for the help popup that covers the whole window. */
-#mdbook-help-container {
- /* Position and size for the whole window. */
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- /* This uses flex layout (which is set in book.js), and centers the popup
- in the window.*/
- display: none;
- align-items: center;
- justify-content: center;
- z-index: 1000;
- /* Dim out the book while the popup is visible. */
- background: var(--overlay-bg);
-}
-
-/* The popup help box. */
-#mdbook-help-popup {
- box-shadow: 0 4px 24px rgba(0,0,0,0.15);
- min-width: 300px;
- max-width: 500px;
- width: 100%;
- box-sizing: border-box;
- display: flex;
- flex-direction: column;
- align-items: center;
- background-color: var(--bg);
- color: var(--fg);
- border-width: 1px;
- border-color: var(--theme-popup-border);
- border-style: solid;
- border-radius: 8px;
- padding: 10px;
-}
-
-.mdbook-help-title {
- text-align: center;
- /* mdbook's margin for h2 is way too large. */
- margin: 10px;
-}
diff --git a/book/en/css/chrome-ae938929.css.gz b/book/en/css/chrome-ae938929.css.gz
deleted file mode 100644
index 2aeb42d..0000000
--- a/book/en/css/chrome-ae938929.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/css/general-2459343d.css b/book/en/css/general-2459343d.css
deleted file mode 100644
index df8a3ef..0000000
--- a/book/en/css/general-2459343d.css
+++ /dev/null
@@ -1,408 +0,0 @@
-/* Base styles and content styles */
-
-:root {
- /* Browser default font-size is 16px, this way 1 rem = 10px */
- font-size: 62.5%;
- color-scheme: var(--color-scheme);
-}
-
-html {
- font-family: "Open Sans", sans-serif;
- color: var(--fg);
- background-color: var(--bg);
- text-size-adjust: none;
- -webkit-text-size-adjust: none;
-}
-
-body {
- margin: 0;
- font-size: 1.6rem;
- overflow-x: hidden;
-}
-
-code {
- font-family: var(--mono-font) !important;
- font-size: var(--code-font-size);
- direction: ltr !important;
-}
-
-/* make long words/inline code not x overflow */
-main {
- overflow-wrap: break-word;
-}
-
-/* make wide tables scroll if they overflow */
-.table-wrapper {
- overflow-x: auto;
-}
-
-/* Don't change font size in headers. */
-h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
- font-size: unset;
-}
-
-.left { float: left; }
-.right { float: right; }
-.boring { opacity: 0.6; }
-.hide-boring .boring { display: none; }
-.hidden { display: none !important; }
-
-h2, h3 { margin-block-start: 2.5em; }
-h4, h5 { margin-block-start: 2em; }
-
-.header + .header h3,
-.header + .header h4,
-.header + .header h5 {
- margin-block-start: 1em;
-}
-
-h1:target::before,
-h2:target::before,
-h3:target::before,
-h4:target::before,
-h5:target::before,
-h6:target::before,
-dt:target::before {
- display: inline-block;
- content: "»";
- margin-inline-start: -30px;
- width: 30px;
-}
-
-/* This is broken on Safari as of version 14, but is fixed
- in Safari Technology Preview 117 which I think will be Safari 14.2.
- https://bugs.webkit.org/show_bug.cgi?id=218076
-*/
-:target {
- /* Safari does not support logical properties */
- scroll-margin-top: calc(var(--menu-bar-height) + 0.5em);
-}
-
-.page {
- outline: 0;
- padding: 0 var(--page-padding);
- margin-block-start: calc(0px - var(--menu-bar-height)); /* Compensate for the #mdbook-menu-bar-hover-placeholder */
-}
-.page-wrapper {
- box-sizing: border-box;
- background-color: var(--bg);
-}
-html:not(.js) .page-wrapper,
-.js:not(.sidebar-resizing) .page-wrapper {
- transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */
-}
-[dir=rtl]:not(.js) .page-wrapper,
-[dir=rtl].js:not(.sidebar-resizing) .page-wrapper {
- transition: margin-right 0.3s ease, transform 0.3s ease; /* Animation: slide away */
-}
-
-.content {
- overflow-y: auto;
- padding: 0 5px 50px 5px;
-}
-.content main {
- margin-inline-start: auto;
- margin-inline-end: auto;
- max-width: var(--content-max-width);
-}
-.content p { line-height: 1.45em; }
-.content ol { line-height: 1.45em; }
-.content ul { line-height: 1.45em; }
-.content a { text-decoration: none; }
-.content a:hover { text-decoration: underline; }
-.content img, .content video { max-width: 100%; }
-.content .header:link,
-.content .header:visited {
- color: var(--fg);
-}
-.content .header:link,
-.content .header:visited:hover {
- text-decoration: none;
-}
-
-table {
- margin: 0 auto;
- border-collapse: collapse;
-}
-table td {
- padding: 3px 20px;
- border: 1px var(--table-border-color) solid;
-}
-table thead {
- background: var(--table-header-bg);
-}
-table thead td {
- font-weight: 700;
- border: none;
-}
-table thead th {
- padding: 3px 20px;
-}
-table thead tr {
- border: 1px var(--table-header-bg) solid;
-}
-/* Alternate background colors for rows */
-table tbody tr:nth-child(2n) {
- background: var(--table-alternate-bg);
-}
-
-
-blockquote {
- margin: 20px 0;
- padding: 0 20px;
- color: var(--fg);
- background-color: var(--quote-bg);
- border-block-start: .1em solid var(--quote-border);
- border-block-end: .1em solid var(--quote-border);
-}
-
-/* TODO: Remove .warning in a future version of mdbook, it is replaced by
-blockquote tags. */
-.warning {
- margin: 20px;
- padding: 0 20px;
- border-inline-start: 2px solid var(--warning-border);
-}
-
-.warning:before {
- position: absolute;
- width: 3rem;
- height: 3rem;
- margin-inline-start: calc(-1.5rem - 21px);
- content: "ⓘ";
- text-align: center;
- background-color: var(--bg);
- color: var(--warning-border);
- font-weight: bold;
- font-size: 2rem;
-}
-
-blockquote .warning:before {
- background-color: var(--quote-bg);
-}
-
-kbd {
- background-color: var(--table-border-color);
- border-radius: 4px;
- border: solid 1px var(--theme-popup-border);
- box-shadow: inset 0 -1px 0 var(--theme-hover);
- display: inline-block;
- font-size: var(--code-font-size);
- font-family: var(--mono-font);
- line-height: 10px;
- padding: 4px 5px;
- vertical-align: middle;
-}
-
-sup {
- /* Set the line-height for superscript and footnote references so that there
- isn't an awkward space appearing above lines that contain the footnote.
-
- See https://github.com/rust-lang/mdBook/pull/2443#discussion_r1813773583
- for an explanation.
- */
- line-height: 0;
-}
-
-.footnote-definition {
- font-size: 0.9em;
-}
-/* The default spacing for a list is a little too large. */
-.footnote-definition ul,
-.footnote-definition ol {
- padding-left: 20px;
-}
-.footnote-definition > li {
- /* Required to position the ::before target */
- position: relative;
-}
-.footnote-definition > li:target {
- scroll-margin-top: 50vh;
-}
-.footnote-reference:target {
- scroll-margin-top: 50vh;
-}
-/* Draws a border around the footnote (including the marker) when it is selected.
- TODO: If there are multiple linkbacks, highlight which one you just came
- from so you know which one to click.
-*/
-.footnote-definition > li:target::before {
- border: 2px solid var(--footnote-highlight);
- border-radius: 6px;
- position: absolute;
- top: -8px;
- right: -8px;
- bottom: -8px;
- left: -32px;
- pointer-events: none;
- content: "";
-}
-/* Pulses the footnote reference so you can quickly see where you left off reading.
- This could use some improvement.
-*/
-@media not (prefers-reduced-motion) {
- .footnote-reference:target {
- animation: fn-highlight 0.8s;
- border-radius: 2px;
- }
-
- @keyframes fn-highlight {
- from {
- background-color: var(--footnote-highlight);
- }
- }
-}
-
-.tooltiptext {
- position: absolute;
- visibility: hidden;
- color: #fff;
- background-color: #333;
- transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */
- left: -8px; /* Half of the width of the icon */
- top: -35px;
- font-size: 0.8em;
- text-align: center;
- border-radius: 6px;
- padding: 5px 8px;
- margin: 5px;
- z-index: 1000;
-}
-.tooltipped .tooltiptext {
- visibility: visible;
-}
-
-.chapter li.part-title {
- color: var(--sidebar-fg);
- margin: 5px 0px;
- font-weight: bold;
-}
-
-.result-no-output {
- font-style: italic;
-}
-
-.fa-svg svg {
- width: 1em;
- height: 1em;
- fill: currentColor;
- margin-bottom: -0.1em;
-}
-
-dt {
- font-weight: bold;
- margin-top: 0.5em;
- margin-bottom: 0.1em;
-}
-
-/* This uses a CSS counter to add numbers to definitions, but only if there is
- more than one definition. */
-dl, dt {
- counter-reset: dd-counter;
-}
-
-/* When there is more than one definition, increment the counter. The first
-selector selects the first definition, and the second one selects definitions
-2 and beyond.*/
-dd:has(+ dd), dd + dd {
- counter-increment: dd-counter;
- /* Use flex display to help with positioning the numbers when there is a p
- tag inside the definition. */
- display: flex;
- align-items: flex-start;
-}
-
-/* Shows the counter for definitions. The first selector selects the first
-definition, and the second one selections definitions 2 and beyond.*/
-dd:has(+ dd)::before, dd + dd::before {
- content: counter(dd-counter) ". ";
- font-weight: 600;
- display: inline-block;
- margin-right: 0.5em;
-}
-
-dd > p {
- /* For loose definitions that have a p tag inside, don't add a bunch of
- space before the definition. */
- margin-top: 0;
-}
-
-/* Remove some excess space from the bottom. */
-.blockquote-tag p:last-child {
- margin-bottom: 2px;
-}
-
-.blockquote-tag {
- /* Add some padding to make the vertical bar a little taller than the text.*/
- padding: 2px 0px 2px 20px;
- /* Add a solid color bar on the left side. */
- border-inline-start-style: solid;
- border-inline-start-width: 4px;
- /* Disable the background color from normal blockquotes . */
- background-color: inherit;
- /* Disable border blocks from blockquotes. */
- border-block-start: none;
- border-block-end: none;
-}
-
-.blockquote-tag-title svg {
- fill: currentColor;
- /* Add space between the icon and the title. */
- margin-right: 8px;
-}
-
-.blockquote-tag-note {
- border-inline-start-color: var(--blockquote-note-color);
-}
-
-.blockquote-tag-tip {
- border-inline-start-color: var(--blockquote-tip-color);
-}
-
-.blockquote-tag-important {
- border-inline-start-color: var(--blockquote-important-color);
-}
-
-.blockquote-tag-warning {
- border-inline-start-color: var(--blockquote-warning-color);
-}
-
-.blockquote-tag-caution {
- border-inline-start-color: var(--blockquote-caution-color);
-}
-
-.blockquote-tag-note .blockquote-tag-title {
- color: var(--blockquote-note-color);
-}
-
-.blockquote-tag-tip .blockquote-tag-title {
- color: var(--blockquote-tip-color);
-}
-
-.blockquote-tag-important .blockquote-tag-title {
- color: var(--blockquote-important-color);
-}
-
-.blockquote-tag-warning .blockquote-tag-title {
- color: var(--blockquote-warning-color);
-}
-
-.blockquote-tag-caution .blockquote-tag-title {
- color: var(--blockquote-caution-color);
-}
-
-.blockquote-tag-title {
- /* Slightly increase the weight for more emphasis. */
- font-weight: 600;
- /* Vertically center the icon with the text. */
- display: flex;
- align-items: center;
- /* Remove default large margins for a more compact display. */
- margin: 2px 0 8px 0;
-}
-
-.blockquote-tag-title .fa-svg {
- fill: currentColor;
- /* Add some space between the icon and the text. */
- margin-right: 8px;
-}
diff --git a/book/en/css/general-2459343d.css.gz b/book/en/css/general-2459343d.css.gz
deleted file mode 100644
index 78d9fd8..0000000
--- a/book/en/css/general-2459343d.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/css/print-9e4910d8.css b/book/en/css/print-9e4910d8.css
deleted file mode 100644
index 2004384..0000000
--- a/book/en/css/print-9e4910d8.css
+++ /dev/null
@@ -1,50 +0,0 @@
-
-#mdbook-sidebar,
-#mdbook-menu-bar,
-.nav-chapters,
-.mobile-nav-chapters {
- display: none;
-}
-
-#mdbook-page-wrapper.page-wrapper {
- transform: none !important;
- margin-inline-start: 0px;
- overflow-y: initial;
-}
-
-#mdbook-content {
- max-width: none;
- margin: 0;
- padding: 0;
-}
-
-.page {
- overflow-y: initial;
-}
-
-code {
- direction: ltr !important;
-}
-
-pre > .buttons {
- z-index: 2;
-}
-
-a, a:visited, a:active, a:hover {
- color: #4183c4;
- text-decoration: none;
-}
-
-h1, h2, h3, h4, h5, h6 {
- page-break-inside: avoid;
- page-break-after: avoid;
-}
-
-pre, code {
- page-break-inside: avoid;
- white-space: pre-wrap;
-}
-
-.fa {
- display: none !important;
-}
diff --git a/book/en/css/print-9e4910d8.css.gz b/book/en/css/print-9e4910d8.css.gz
deleted file mode 100644
index b87a3da..0000000
--- a/book/en/css/print-9e4910d8.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/css/variables-8adf115d.css b/book/en/css/variables-8adf115d.css
deleted file mode 100644
index af5023b..0000000
--- a/book/en/css/variables-8adf115d.css
+++ /dev/null
@@ -1,383 +0,0 @@
-
-/* Globals */
-
-:root {
- --sidebar-target-width: 300px;
- --sidebar-width: min(var(--sidebar-target-width), 80vw);
- --sidebar-resize-indicator-width: 8px;
- --sidebar-resize-indicator-space: 2px;
- --page-padding: 15px;
- --content-max-width: 750px;
- --menu-bar-height: 50px;
- --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace;
- --code-font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */
- --searchbar-margin-block-start: 5px;
-}
-
-/* Themes */
-
-.ayu {
- --bg: hsl(210, 25%, 8%);
- --fg: #c5c5c5;
-
- --sidebar-bg: #14191f;
- --sidebar-fg: #c8c9db;
- --sidebar-non-existant: #5c6773;
- --sidebar-active: #ffb454;
- --sidebar-spacer: #2d334f;
-
- --scrollbar: var(--sidebar-fg);
-
- --icons: #737480;
- --icons-hover: #b7b9cc;
-
- --links: #0096cf;
-
- --inline-code-color: #ffb454;
-
- --theme-popup-bg: #14191f;
- --theme-popup-border: #5c6773;
- --theme-hover: #191f26;
-
- --quote-bg: hsl(226, 15%, 17%);
- --quote-border: hsl(226, 15%, 22%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(210, 25%, 13%);
- --table-header-bg: hsl(210, 25%, 28%);
- --table-alternate-bg: hsl(210, 25%, 11%);
-
- --searchbar-border-color: #848484;
- --searchbar-bg: #424242;
- --searchbar-fg: #fff;
- --searchbar-shadow-color: #d4c89f;
- --searchresults-header-fg: #666;
- --searchresults-border-color: #888;
- --searchresults-li-bg: #252932;
- --search-mark-bg: #e3b171;
-
- --color-scheme: dark;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(45%) sepia(6%) saturate(621%) hue-rotate(198deg) brightness(99%) contrast(85%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(68%) sepia(55%) saturate(531%) hue-rotate(341deg) brightness(104%) contrast(101%);
-
- --footnote-highlight: #2668a6;
-
- --overlay-bg: rgba(33, 40, 48, 0.4);
-
- --blockquote-note-color: #74b9ff;
- --blockquote-tip-color: #09ca09;
- --blockquote-important-color: #d3abff;
- --blockquote-warning-color: #f0b72f;
- --blockquote-caution-color: #f21424;
-
- --sidebar-header-border-color: #c18639;
-}
-
-.coal {
- --bg: hsl(200, 7%, 8%);
- --fg: #98a3ad;
-
- --sidebar-bg: #292c2f;
- --sidebar-fg: #a1adb8;
- --sidebar-non-existant: #505254;
- --sidebar-active: #3473ad;
- --sidebar-spacer: #393939;
-
- --scrollbar: var(--sidebar-fg);
-
- --icons: #43484d;
- --icons-hover: #b3c0cc;
-
- --links: #2b79a2;
-
- --inline-code-color: #c5c8c6;
-
- --theme-popup-bg: #141617;
- --theme-popup-border: #43484d;
- --theme-hover: #1f2124;
-
- --quote-bg: hsl(234, 21%, 18%);
- --quote-border: hsl(234, 21%, 23%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(200, 7%, 13%);
- --table-header-bg: hsl(200, 7%, 28%);
- --table-alternate-bg: hsl(200, 7%, 11%);
-
- --searchbar-border-color: #aaa;
- --searchbar-bg: #b7b7b7;
- --searchbar-fg: #000;
- --searchbar-shadow-color: #aaa;
- --searchresults-header-fg: #666;
- --searchresults-border-color: #98a3ad;
- --searchresults-li-bg: #2b2b2f;
- --search-mark-bg: #355c7d;
-
- --color-scheme: dark;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%);
-
- --footnote-highlight: #4079ae;
-
- --overlay-bg: rgba(33, 40, 48, 0.4);
-
- --blockquote-note-color: #4493f8;
- --blockquote-tip-color: #08ae08;
- --blockquote-important-color: #ab7df8;
- --blockquote-warning-color: #d29922;
- --blockquote-caution-color: #d91b29;
-
- --sidebar-header-border-color: #3473ad;
-}
-
-.light, html:not(.js) {
- --bg: hsl(0, 0%, 100%);
- --fg: hsl(0, 0%, 0%);
-
- --sidebar-bg: #fafafa;
- --sidebar-fg: hsl(0, 0%, 0%);
- --sidebar-non-existant: #aaaaaa;
- --sidebar-active: #1f1fff;
- --sidebar-spacer: #f4f4f4;
-
- --scrollbar: #8F8F8F;
-
- --icons: #747474;
- --icons-hover: #000000;
-
- --links: #20609f;
-
- --inline-code-color: #301900;
-
- --theme-popup-bg: #fafafa;
- --theme-popup-border: #cccccc;
- --theme-hover: #e6e6e6;
-
- --quote-bg: hsl(197, 37%, 96%);
- --quote-border: hsl(197, 37%, 91%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(0, 0%, 95%);
- --table-header-bg: hsl(0, 0%, 80%);
- --table-alternate-bg: hsl(0, 0%, 97%);
-
- --searchbar-border-color: #aaa;
- --searchbar-bg: #fafafa;
- --searchbar-fg: #000;
- --searchbar-shadow-color: #aaa;
- --searchresults-header-fg: #666;
- --searchresults-border-color: #888;
- --searchresults-li-bg: #e4f2fe;
- --search-mark-bg: #a2cff5;
-
- --color-scheme: light;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(45.49%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(14%) sepia(93%) saturate(4250%) hue-rotate(243deg) brightness(99%) contrast(130%);
-
- --footnote-highlight: #7e7eff;
-
- --overlay-bg: rgba(200, 200, 205, 0.4);
-
- --blockquote-note-color: #0969da;
- --blockquote-tip-color: #008000;
- --blockquote-important-color: #8250df;
- --blockquote-warning-color: #9a6700;
- --blockquote-caution-color: #b52731;
-
- --sidebar-header-border-color: #6e6edb;
-}
-
-.navy {
- --bg: hsl(226, 23%, 11%);
- --fg: #bcbdd0;
-
- --sidebar-bg: #282d3f;
- --sidebar-fg: #c8c9db;
- --sidebar-non-existant: #505274;
- --sidebar-active: #2b79a2;
- --sidebar-spacer: #2d334f;
-
- --scrollbar: var(--sidebar-fg);
-
- --icons: #737480;
- --icons-hover: #b7b9cc;
-
- --links: #2b79a2;
-
- --inline-code-color: #c5c8c6;
-
- --theme-popup-bg: #161923;
- --theme-popup-border: #737480;
- --theme-hover: #282e40;
-
- --quote-bg: hsl(226, 15%, 17%);
- --quote-border: hsl(226, 15%, 22%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(226, 23%, 16%);
- --table-header-bg: hsl(226, 23%, 31%);
- --table-alternate-bg: hsl(226, 23%, 14%);
-
- --searchbar-border-color: #aaa;
- --searchbar-bg: #aeaec6;
- --searchbar-fg: #000;
- --searchbar-shadow-color: #aaa;
- --searchresults-header-fg: #5f5f71;
- --searchresults-border-color: #5c5c68;
- --searchresults-li-bg: #242430;
- --search-mark-bg: #a2cff5;
-
- --color-scheme: dark;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(46%) sepia(20%) saturate(1537%) hue-rotate(156deg) brightness(85%) contrast(90%);
-
- --footnote-highlight: #4079ae;
-
- --overlay-bg: rgba(33, 40, 48, 0.4);
-
- --blockquote-note-color: #4493f8;
- --blockquote-tip-color: #09ca09;
- --blockquote-important-color: #ab7df8;
- --blockquote-warning-color: #d29922;
- --blockquote-caution-color: #f21424;
-
- --sidebar-header-border-color: #2f6ab5;
-}
-
-.rust {
- --bg: hsl(60, 9%, 87%);
- --fg: #262625;
-
- --sidebar-bg: #3b2e2a;
- --sidebar-fg: #c8c9db;
- --sidebar-non-existant: #505254;
- --sidebar-active: #e69f67;
- --sidebar-spacer: #45373a;
-
- --scrollbar: var(--sidebar-fg);
-
- --icons: #737480;
- --icons-hover: #262625;
-
- --links: #2b79a2;
-
- --inline-code-color: #6e6b5e;
-
- --theme-popup-bg: #e1e1db;
- --theme-popup-border: #b38f6b;
- --theme-hover: #99908a;
-
- --quote-bg: hsl(60, 5%, 75%);
- --quote-border: hsl(60, 5%, 70%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(60, 9%, 82%);
- --table-header-bg: #b3a497;
- --table-alternate-bg: hsl(60, 9%, 84%);
-
- --searchbar-border-color: #aaa;
- --searchbar-bg: #fafafa;
- --searchbar-fg: #000;
- --searchbar-shadow-color: #aaa;
- --searchresults-header-fg: #666;
- --searchresults-border-color: #888;
- --searchresults-li-bg: #dec2a2;
- --search-mark-bg: #e69f67;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(77%) sepia(16%) saturate(1798%) hue-rotate(328deg) brightness(98%) contrast(83%);
-
- --footnote-highlight: #d3a17a;
-
- --overlay-bg: rgba(150, 150, 150, 0.25);
-
- --blockquote-note-color: #023b95;
- --blockquote-tip-color: #007700;
- --blockquote-important-color: #8250df;
- --blockquote-warning-color: #603700;
- --blockquote-caution-color: #aa1721;
-
- --sidebar-header-border-color: #8c391f;
-}
-
-@media (prefers-color-scheme: dark) {
- html:not(.js) {
- --bg: hsl(200, 7%, 8%);
- --fg: #98a3ad;
-
- --sidebar-bg: #292c2f;
- --sidebar-fg: #a1adb8;
- --sidebar-non-existant: #505254;
- --sidebar-active: #3473ad;
- --sidebar-spacer: #393939;
-
- --scrollbar: var(--sidebar-fg);
-
- --icons: #43484d;
- --icons-hover: #b3c0cc;
-
- --links: #2b79a2;
-
- --inline-code-color: #c5c8c6;
-
- --theme-popup-bg: #141617;
- --theme-popup-border: #43484d;
- --theme-hover: #1f2124;
-
- --quote-bg: hsl(234, 21%, 18%);
- --quote-border: hsl(234, 21%, 23%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(200, 7%, 13%);
- --table-header-bg: hsl(200, 7%, 28%);
- --table-alternate-bg: hsl(200, 7%, 11%);
-
- --searchbar-border-color: #aaa;
- --searchbar-bg: #b7b7b7;
- --searchbar-fg: #000;
- --searchbar-shadow-color: #aaa;
- --searchresults-header-fg: #666;
- --searchresults-border-color: #98a3ad;
- --searchresults-li-bg: #2b2b2f;
- --search-mark-bg: #355c7d;
-
- --color-scheme: dark;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%);
-
- --footnote-highlight: #4079ae;
-
- --overlay-bg: rgba(33, 40, 48, 0.4);
-
- --blockquote-note-color: #4493f8;
- --blockquote-tip-color: #08ae08;
- --blockquote-important-color: #ab7df8;
- --blockquote-warning-color: #d29922;
- --blockquote-caution-color: #d91b29;
-
- --sidebar-header-border-color: #3473ad;
- }
-}
diff --git a/book/en/css/variables-8adf115d.css.gz b/book/en/css/variables-8adf115d.css.gz
deleted file mode 100644
index c276a85..0000000
--- a/book/en/css/variables-8adf115d.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/docker.html b/book/en/docker.html
deleted file mode 100644
index e6e4570..0000000
--- a/book/en/docker.html
+++ /dev/null
@@ -1,303 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Docker - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="docker"><a class="header" href="#docker">Docker</a></h1>
-<p>Tesseras provides a Docker image for running the daemon in containers. This is useful for servers, testing multi-node networks, and CI environments.</p>
-<h2 id="building-the-image"><a class="header" href="#building-the-image">Building the image</a></h2>
-<p>From the repository root:</p>
-<pre><code class="language-bash">docker build -t tesseras-daemon .
-</code></pre>
-<p>The multi-stage Dockerfile uses <code>rust:1.85</code> to compile and <code>debian:bookworm-slim</code> as the runtime base. The resulting image is small and contains only the daemon binary and CA certificates.</p>
-<h2 id="running-a-single-node"><a class="header" href="#running-a-single-node">Running a single node</a></h2>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- tesseras-daemon
-</code></pre>
-<p>This starts a node that:</p>
-<ul>
-<li>Listens on UDP port 4433</li>
-<li>Bootstraps from the default seed nodes</li>
-<li>Stores data inside the container (ephemeral)</li>
-</ul>
-<p>To persist data across container restarts, mount a volume:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- -v tesseras-data:/root/.local/share/tesseras \
- tesseras-daemon
-</code></pre>
-<h2 id="running-as-a-seed-node"><a class="header" href="#running-as-a-seed-node">Running as a seed node</a></h2>
-<p>To run a seed node that doesn’t bootstrap from anyone else:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras-seed \
- -p 4433:4433/udp \
- tesseras-daemon --listen 0.0.0.0:4433 --bootstrap ""
-</code></pre>
-<h2 id="multi-node-network-with-docker-compose"><a class="header" href="#multi-node-network-with-docker-compose">Multi-node network with Docker Compose</a></h2>
-<p>The repository includes a Docker Compose file for testing a 3-node network:</p>
-<pre><code class="language-yaml">services:
- boot1:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", ""]
- ports: ["4433:4433/udp"]
-
- boot2:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", "boot1:4433"]
- depends_on: [boot1]
-
- client:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", "boot2:4433"]
- depends_on: [boot2]
-</code></pre>
-<p>Start the network:</p>
-<pre><code class="language-bash">cd tests/smoke
-docker compose up --build -d
-</code></pre>
-<p>Check that all nodes are running:</p>
-<pre><code class="language-bash">docker compose logs --tail=5
-</code></pre>
-<p>You should see <code>daemon ready</code> in the logs for each node, and <code>bootstrap successful</code> for <code>boot2</code> and <code>client</code>.</p>
-<p>Stop the network:</p>
-<pre><code class="language-bash">docker compose down
-</code></pre>
-<h2 id="custom-configuration"><a class="header" href="#custom-configuration">Custom configuration</a></h2>
-<p>To use a config file with Docker, mount it into the container:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- -v ./config.toml:/etc/tesseras/config.toml:ro \
- -v tesseras-data:/root/.local/share/tesseras \
- tesseras-daemon --config /etc/tesseras/config.toml
-</code></pre>
-<p>See the <a href="./configuration.html">Configuration</a> chapter for all available options.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="nat-traversal.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="nat-traversal.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/docker.html.gz b/book/en/docker.html.gz
deleted file mode 100644
index bdb4522..0000000
--- a/book/en/docker.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/elasticlunr-ef4e11c1.min.js b/book/en/elasticlunr-ef4e11c1.min.js
deleted file mode 100644
index 94b20dd..0000000
--- a/book/en/elasticlunr-ef4e11c1.min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * elasticlunr - http://weixsong.github.io
- * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5
- *
- * Copyright (C) 2017 Oliver Nightingale
- * Copyright (C) 2017 Wei Song
- * MIT Licensed
- * @license
- */
-!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u<s.length;u++){var a=s[u];r[a]=this.pipeline.run(t.tokenizer(e[a]))}var l={};for(var c in o){var d=r[c]||r.any;if(d){var f=this.fieldSearch(d,c,o),h=o[c].boost;for(var p in f)f[p]=f[p]*h;for(var p in f)p in l?l[p]+=f[p]:l[p]=f[p]}}var v,g=[];for(var p in l)v={ref:p,score:l[p]},this.documentStore.hasDoc(p)&&(v.doc=this.documentStore.getDoc(p)),g.push(v);return g.sort(function(e,t){return t.score-e.score}),g},t.Index.prototype.fieldSearch=function(e,t,n){var i=n[t].bool,o=n[t].expand,r=n[t].boost,s=null,u={};return 0!==r?(e.forEach(function(e){var n=[e];1==o&&(n=this.index[t].expandToken(e));var r={};n.forEach(function(n){var o=this.index[t].getDocs(n),a=this.idf(n,t);if(s&&"AND"==i){var l={};for(var c in s)c in o&&(l[c]=o[c]);o=l}n==e&&this.fieldSearchStats(u,n,o);for(var c in o){var d=this.index[t].getTermFrequency(n,c),f=this.documentStore.getFieldLength(c,t),h=1;0!=f&&(h=1/Math.sqrt(f));var p=1;n!=e&&(p=.15*(1-(n.length-e.length)/n.length));var v=d*a*h*p;c in r?r[c]+=v:r[c]=v}},this),s=this.mergeScores(s,r,i)},this),s=this.coordNorm(s,u,e.length)):void 0},t.Index.prototype.mergeScores=function(e,t,n){if(!e)return t;if("AND"==n){var i={};for(var o in t)o in e&&(i[o]=e[o]+t[o]);return i}for(var o in t)o in e?e[o]+=t[o]:e[o]=t[o];return e},t.Index.prototype.fieldSearchStats=function(e,t,n){for(var i in n)i in e?e[i].push(t):e[i]=[t]},t.Index.prototype.coordNorm=function(e,t,n){for(var i in e)if(i in t){var o=t[i].length;e[i]=e[i]*o/n}return e},t.Index.prototype.toJSON=function(){var e={};return this._fields.forEach(function(t){e[t]=this.index[t].toJSON()},this),{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),index:e,pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},t.DocumentStore=function(e){this._save=null===e||void 0===e?!0:e,this.docs={},this.docInfo={},this.length=0},t.DocumentStore.load=function(e){var t=new this;return t.length=e.length,t.docs=e.docs,t.docInfo=e.docInfo,t._save=e.save,t},t.DocumentStore.prototype.isDocStored=function(){return this._save},t.DocumentStore.prototype.addDoc=function(t,n){this.hasDoc(t)||this.length++,this.docs[t]=this._save===!0?e(n):null},t.DocumentStore.prototype.getDoc=function(e){return this.hasDoc(e)===!1?null:this.docs[e]},t.DocumentStore.prototype.hasDoc=function(e){return e in this.docs},t.DocumentStore.prototype.removeDoc=function(e){this.hasDoc(e)&&(delete this.docs[e],delete this.docInfo[e],this.length--)},t.DocumentStore.prototype.addFieldLength=function(e,t,n){null!==e&&void 0!==e&&0!=this.hasDoc(e)&&(this.docInfo[e]||(this.docInfo[e]={}),this.docInfo[e][t]=n)},t.DocumentStore.prototype.updateFieldLength=function(e,t,n){null!==e&&void 0!==e&&0!=this.hasDoc(e)&&this.addFieldLength(e,t,n)},t.DocumentStore.prototype.getFieldLength=function(e,t){return null===e||void 0===e?0:e in this.docs&&t in this.docInfo[e]?this.docInfo[e][t]:0},t.DocumentStore.prototype.toJSON=function(){return{docs:this.docs,docInfo:this.docInfo,length:this.length,save:this._save}},t.stemmer=function(){var e={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},t={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,u="^("+o+")?"+r+o+"("+r+")?$",a="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,c=new RegExp(s),d=new RegExp(a),f=new RegExp(u),h=new RegExp(l),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,x=new RegExp("([^aeiouylsz])\\1$"),w=new RegExp("^"+o+i+"[^aeiouwxy]$"),I=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,D=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,_=/^(.+?)e$/,P=/ll$/,k=new RegExp("^"+o+i+"[^aeiouwxy]$"),z=function(n){var i,o,r,s,u,a,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,u=v,s.test(n)?n=n.replace(s,"$1$2"):u.test(n)&&(n=n.replace(u,"$1$2")),s=g,u=m,s.test(n)){var z=s.exec(n);s=c,s.test(z[1])&&(s=y,n=n.replace(s,""))}else if(u.test(n)){var z=u.exec(n);i=z[1],u=h,u.test(i)&&(n=i,u=S,a=x,l=w,u.test(n)?n+="e":a.test(n)?(s=y,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=I,s.test(n)){var z=s.exec(n);i=z[1],n=i+"i"}if(s=b,s.test(n)){var z=s.exec(n);i=z[1],o=z[2],s=c,s.test(i)&&(n=i+e[o])}if(s=E,s.test(n)){var z=s.exec(n);i=z[1],o=z[2],s=c,s.test(i)&&(n=i+t[o])}if(s=D,u=F,s.test(n)){var z=s.exec(n);i=z[1],s=d,s.test(i)&&(n=i)}else if(u.test(n)){var z=u.exec(n);i=z[1]+z[2],u=d,u.test(i)&&(n=i)}if(s=_,s.test(n)){var z=s.exec(n);i=z[1],s=d,u=f,a=k,(s.test(i)||u.test(i)&&!a.test(i))&&(n=i)}return s=P,u=d,s.test(n)&&u.test(n)&&(s=y,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return z}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==!0?e:void 0},t.clearStopWords=function(){t.stopWordFilter.stopWords={}},t.addStopWords=function(e){null!=e&&Array.isArray(e)!==!1&&e.forEach(function(e){t.stopWordFilter.stopWords[e]=!0},this)},t.resetStopWords=function(){t.stopWordFilter.stopWords=t.defaultStopWords},t.defaultStopWords={"":!0,a:!0,able:!0,about:!0,across:!0,after:!0,all:!0,almost:!0,also:!0,am:!0,among:!0,an:!0,and:!0,any:!0,are:!0,as:!0,at:!0,be:!0,because:!0,been:!0,but:!0,by:!0,can:!0,cannot:!0,could:!0,dear:!0,did:!0,"do":!0,does:!0,either:!0,"else":!0,ever:!0,every:!0,"for":!0,from:!0,get:!0,got:!0,had:!0,has:!0,have:!0,he:!0,her:!0,hers:!0,him:!0,his:!0,how:!0,however:!0,i:!0,"if":!0,"in":!0,into:!0,is:!0,it:!0,its:!0,just:!0,least:!0,let:!0,like:!0,likely:!0,may:!0,me:!0,might:!0,most:!0,must:!0,my:!0,neither:!0,no:!0,nor:!0,not:!0,of:!0,off:!0,often:!0,on:!0,only:!0,or:!0,other:!0,our:!0,own:!0,rather:!0,said:!0,say:!0,says:!0,she:!0,should:!0,since:!0,so:!0,some:!0,than:!0,that:!0,the:!0,their:!0,them:!0,then:!0,there:!0,these:!0,they:!0,"this":!0,tis:!0,to:!0,too:!0,twas:!0,us:!0,wants:!0,was:!0,we:!0,were:!0,what:!0,when:!0,where:!0,which:!0,"while":!0,who:!0,whom:!0,why:!0,will:!0,"with":!0,would:!0,yet:!0,you:!0,your:!0},t.stopWordFilter.stopWords=t.defaultStopWords,t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(e){if(null===e||void 0===e)throw new Error("token should not be undefined");return e.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.InvertedIndex=function(){this.root={docs:{},df:0}},t.InvertedIndex.load=function(e){var t=new this;return t.root=e.root,t},t.InvertedIndex.prototype.addToken=function(e,t,n){for(var n=n||this.root,i=0;i<=e.length-1;){var o=e[i];o in n||(n[o]={docs:{},df:0}),i+=1,n=n[o]}var r=t.ref;n.docs[r]?n.docs[r]={tf:t.tf}:(n.docs[r]={tf:t.tf},n.df+=1)},t.InvertedIndex.prototype.hasToken=function(e){if(!e)return!1;for(var t=this.root,n=0;n<e.length;n++){if(!t[e[n]])return!1;t=t[e[n]]}return!0},t.InvertedIndex.prototype.getNode=function(e){if(!e)return null;for(var t=this.root,n=0;n<e.length;n++){if(!t[e[n]])return null;t=t[e[n]]}return t},t.InvertedIndex.prototype.getDocs=function(e){var t=this.getNode(e);return null==t?{}:t.docs},t.InvertedIndex.prototype.getTermFrequency=function(e,t){var n=this.getNode(e);return null==n?0:t in n.docs?n.docs[t].tf:0},t.InvertedIndex.prototype.getDocFreq=function(e){var t=this.getNode(e);return null==t?0:t.df},t.InvertedIndex.prototype.removeToken=function(e,t){if(e){var n=this.getNode(e);null!=n&&t in n.docs&&(delete n.docs[t],n.df-=1)}},t.InvertedIndex.prototype.expandToken=function(e,t,n){if(null==e||""==e)return[];var t=t||[];if(void 0==n&&(n=this.getNode(e),null==n))return t;n.df>0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e<arguments.length;e++)t=arguments[e],~this.indexOf(t)||this.elements.splice(this.locationFor(t),0,t);this.length=this.elements.length},lunr.SortedSet.prototype.toArray=function(){return this.elements.slice()},lunr.SortedSet.prototype.map=function(e,t){return this.elements.map(e,t)},lunr.SortedSet.prototype.forEach=function(e,t){return this.elements.forEach(e,t)},lunr.SortedSet.prototype.indexOf=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]<u[i]?n++:s[n]>u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o<r.length;o++)i.add(r[o]);return i},lunr.SortedSet.prototype.toJSON=function(){return this.toArray()},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.elasticlunr=t()}(this,function(){return t})}(); \ No newline at end of file
diff --git a/book/en/elasticlunr-ef4e11c1.min.js.gz b/book/en/elasticlunr-ef4e11c1.min.js.gz
deleted file mode 100644
index f10a125..0000000
--- a/book/en/elasticlunr-ef4e11c1.min.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/encryption.html b/book/en/encryption.html
deleted file mode 100644
index c576f8c..0000000
--- a/book/en/encryption.html
+++ /dev/null
@@ -1,294 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Encryption and Sealed Tesseras - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="encryption-and-sealed-tesseras"><a class="header" href="#encryption-and-sealed-tesseras">Encryption and Sealed Tesseras</a></h1>
-<p>Most tesseras are public — designed to be accessible to anyone, forever. But some memories need privacy. Tesseras supports two encrypted visibility modes:</p>
-<ul>
-<li><strong>Private</strong> — only the creator (and their heirs) can ever access the content</li>
-<li><strong>Sealed</strong> — the content is time-locked and becomes accessible after a specific date</li>
-</ul>
-<p>Public tesseras are never encrypted. Availability is more important than secrecy for preservation.</p>
-<h2 id="how-encryption-works"><a class="header" href="#how-encryption-works">How encryption works</a></h2>
-<p>When you create a private or sealed tessera, the following happens:</p>
-<ol>
-<li>A random <strong>content key</strong> (256-bit) is generated</li>
-<li>Each memory file is encrypted with <strong>AES-256-GCM</strong> using that content key</li>
-<li>The content key is wrapped in a <strong>sealed key envelope</strong> using your encryption public key</li>
-<li>The wrapped key is stored alongside the encrypted content</li>
-</ol>
-<p>Only the holder of the corresponding private key can unwrap the content key and decrypt the content.</p>
-<h2 id="hybrid-post-quantum-key-encapsulation"><a class="header" href="#hybrid-post-quantum-key-encapsulation">Hybrid post-quantum key encapsulation</a></h2>
-<p>The sealed key envelope uses a <strong>hybrid Key Encapsulation Mechanism (KEM)</strong> combining two algorithms:</p>
-<ul>
-<li><strong>X25519</strong> — a well-tested classical elliptic curve key exchange</li>
-<li><strong>ML-KEM-768</strong> — a NIST-standardized post-quantum lattice-based KEM (formerly Kyber)</li>
-</ul>
-<p>Both algorithms produce shared secrets that are combined using BLAKE3 key derivation. An attacker must break <strong>both</strong> algorithms to recover the content key. This follows the same principle as Tesseras’ dual signatures (Ed25519 + ML-DSA): we don’t know which cryptographic assumptions will hold over centuries, so we hedge our bets.</p>
-<h2 id="authenticated-associated-data-aad"><a class="header" href="#authenticated-associated-data-aad">Authenticated associated data (AAD)</a></h2>
-<p>AES-256-GCM supports authenticated associated data — extra information that is verified during decryption but not encrypted. Tesseras binds the following into the AAD:</p>
-<ul>
-<li>The <strong>content hash</strong> of the tessera (always)</li>
-<li>The <strong>open_after timestamp</strong> (for sealed tesseras only)</li>
-</ul>
-<p>This prevents <strong>ciphertext swapping attacks</strong>: an attacker cannot copy encrypted content from one tessera to another, because the AAD will not match and decryption will fail. For sealed tesseras, this also means you cannot change the seal date — the timestamp is cryptographically bound to the ciphertext.</p>
-<h2 id="sealed-tesseras-time-capsules"><a class="header" href="#sealed-tesseras-time-capsules">Sealed tesseras: time capsules</a></h2>
-<p>A sealed tessera is a true time capsule. When you create one, you specify an <code>open_after</code> date. The content is encrypted and the key is sealed in an envelope that only you can open.</p>
-<p>When the <code>open_after</code> date passes, the owner publishes the content key as a signed <strong>Key Publication</strong> — a standalone artifact containing the key, the tessera hash, and the owner’s signature. Other nodes can verify the signature and use the published key to decrypt the content.</p>
-<p>The tessera’s manifest is never modified. The Key Publication is a separate document, preserving the immutable, content-addressed nature of tesseras.</p>
-<h2 id="what-about-the-keys"><a class="header" href="#what-about-the-keys">What about the keys?</a></h2>
-<p>Each identity now includes an <strong>encryption keypair</strong> alongside the signing keypair:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key type</th><th>Algorithm</th><th>Purpose</th></tr>
-</thead>
-<tbody>
-<tr><td>Ed25519</td><td>Classical</td><td>Signing manifests and key publications</td></tr>
-<tr><td>ML-DSA</td><td>Post-quantum</td><td>Signing (when enabled)</td></tr>
-<tr><td>X25519</td><td>Classical</td><td>Key encapsulation (encryption)</td></tr>
-<tr><td>ML-KEM-768</td><td>Post-quantum</td><td>Key encapsulation (encryption)</td></tr>
-</tbody>
-</table>
-</div>
-<p>The encryption keypair is generated when the identity is created. The public half is stored in the tessera’s identity directory; the private half stays on the owner’s device.</p>
-<h2 id="design-principles"><a class="header" href="#design-principles">Design principles</a></h2>
-<ul>
-<li><strong>Encrypt as little as possible</strong> — only private and sealed content is encrypted. Public memories stay open for long-term accessibility.</li>
-<li><strong>Dual algorithms from day one</strong> — both classical and post-quantum cryptography, so content is protected even if one algorithm is broken.</li>
-<li><strong>Immutable manifests</strong> — keys are published separately, never by modifying existing data.</li>
-<li><strong>Fail closed</strong> — the system rejects attempts to create private or sealed tesseras without encryption keys.</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="replication.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="heir-recovery.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="replication.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="heir-recovery.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/encryption.html.gz b/book/en/encryption.html.gz
deleted file mode 100644
index 11b5583..0000000
--- a/book/en/encryption.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/favicon-bfbdfe47.png b/book/en/favicon-bfbdfe47.png
deleted file mode 100644
index aec48da..0000000
--- a/book/en/favicon-bfbdfe47.png
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/OPEN-SANS-LICENSE.txt b/book/en/fonts/OPEN-SANS-LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/book/en/fonts/OPEN-SANS-LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/book/en/fonts/OPEN-SANS-LICENSE.txt.gz b/book/en/fonts/OPEN-SANS-LICENSE.txt.gz
deleted file mode 100644
index c6e887a..0000000
--- a/book/en/fonts/OPEN-SANS-LICENSE.txt.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt b/book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt
deleted file mode 100644
index 366206f..0000000
--- a/book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
-
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt.gz b/book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt.gz
deleted file mode 100644
index 74eeec0..0000000
--- a/book/en/fonts/SOURCE-CODE-PRO-LICENSE.txt.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/fonts-9644e21d.css b/book/en/fonts/fonts-9644e21d.css
deleted file mode 100644
index ce32fdc..0000000
--- a/book/en/fonts/fonts-9644e21d.css
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */
-/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */
-
-/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: normal;
- font-weight: 300;
- src: local('Open Sans Light'), local('OpenSans-Light'),
- url('../fonts/open-sans-v17-all-charsets-300-7736aa35.woff2') format('woff2');
-}
-
-/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: italic;
- font-weight: 300;
- src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'),
- url('../fonts/open-sans-v17-all-charsets-300italic-2c7b95c0.woff2') format('woff2');
-}
-
-/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: normal;
- font-weight: 400;
- src: local('Open Sans Regular'), local('OpenSans-Regular'),
- url('../fonts/open-sans-v17-all-charsets-regular-2e3b1d34.woff2') format('woff2');
-}
-
-/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: italic;
- font-weight: 400;
- src: local('Open Sans Italic'), local('OpenSans-Italic'),
- url('../fonts/open-sans-v17-all-charsets-italic-6c9463f7.woff2') format('woff2');
-}
-
-/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: normal;
- font-weight: 600;
- src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'),
- url('../fonts/open-sans-v17-all-charsets-600-486c6759.woff2') format('woff2');
-}
-
-/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: italic;
- font-weight: 600;
- src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'),
- url('../fonts/open-sans-v17-all-charsets-600italic-1a3e8659.woff2') format('woff2');
-}
-
-/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: normal;
- font-weight: 700;
- src: local('Open Sans Bold'), local('OpenSans-Bold'),
- url('../fonts/open-sans-v17-all-charsets-700-c22fe8c7.woff2') format('woff2');
-}
-
-/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: italic;
- font-weight: 700;
- src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'),
- url('../fonts/open-sans-v17-all-charsets-700italic-238ae959.woff2') format('woff2');
-}
-
-/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: normal;
- font-weight: 800;
- src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'),
- url('../fonts/open-sans-v17-all-charsets-800-3d2c812a.woff2') format('woff2');
-}
-
-/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: italic;
- font-weight: 800;
- src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'),
- url('../fonts/open-sans-v17-all-charsets-800italic-ba1521ec.woff2') format('woff2');
-}
-
-/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Source Code Pro';
- font-style: normal;
- font-weight: 500;
- src: url('../fonts/source-code-pro-v11-all-charsets-500-2bdd9410.woff2') format('woff2');
-}
diff --git a/book/en/fonts/fonts-9644e21d.css.gz b/book/en/fonts/fonts-9644e21d.css.gz
deleted file mode 100644
index c125db3..0000000
--- a/book/en/fonts/fonts-9644e21d.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/open-sans-v17-all-charsets-300-7736aa35.woff2 b/book/en/fonts/open-sans-v17-all-charsets-300-7736aa35.woff2
deleted file mode 100644
index 9f51be3..0000000
--- a/book/en/fonts/open-sans-v17-all-charsets-300-7736aa35.woff2
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/open-sans-v17-all-charsets-300italic-2c7b95c0.woff2 b/book/en/fonts/open-sans-v17-all-charsets-300italic-2c7b95c0.woff2
deleted file mode 100644
index 2f54544..0000000
--- a/book/en/fonts/open-sans-v17-all-charsets-300italic-2c7b95c0.woff2
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/open-sans-v17-all-charsets-600-486c6759.woff2 b/book/en/fonts/open-sans-v17-all-charsets-600-486c6759.woff2
deleted file mode 100644
index f503d55..0000000
--- a/book/en/fonts/open-sans-v17-all-charsets-600-486c6759.woff2
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/open-sans-v17-all-charsets-600italic-1a3e8659.woff2 b/book/en/fonts/open-sans-v17-all-charsets-600italic-1a3e8659.woff2
deleted file mode 100644
index c99aabe..0000000
--- a/book/en/fonts/open-sans-v17-all-charsets-600italic-1a3e8659.woff2
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/open-sans-v17-all-charsets-700-c22fe8c7.woff2 b/book/en/fonts/open-sans-v17-all-charsets-700-c22fe8c7.woff2
deleted file mode 100644
index 421a1ab..0000000
--- a/book/en/fonts/open-sans-v17-all-charsets-700-c22fe8c7.woff2
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/open-sans-v17-all-charsets-700italic-238ae959.woff2 b/book/en/fonts/open-sans-v17-all-charsets-700italic-238ae959.woff2
deleted file mode 100644
index 12ce3d2..0000000
--- a/book/en/fonts/open-sans-v17-all-charsets-700italic-238ae959.woff2
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/open-sans-v17-all-charsets-800-3d2c812a.woff2 b/book/en/fonts/open-sans-v17-all-charsets-800-3d2c812a.woff2
deleted file mode 100644
index c94a223..0000000
--- a/book/en/fonts/open-sans-v17-all-charsets-800-3d2c812a.woff2
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/open-sans-v17-all-charsets-800italic-ba1521ec.woff2 b/book/en/fonts/open-sans-v17-all-charsets-800italic-ba1521ec.woff2
deleted file mode 100644
index eed7d3c..0000000
--- a/book/en/fonts/open-sans-v17-all-charsets-800italic-ba1521ec.woff2
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/open-sans-v17-all-charsets-italic-6c9463f7.woff2 b/book/en/fonts/open-sans-v17-all-charsets-italic-6c9463f7.woff2
deleted file mode 100644
index 398b68a..0000000
--- a/book/en/fonts/open-sans-v17-all-charsets-italic-6c9463f7.woff2
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/open-sans-v17-all-charsets-regular-2e3b1d34.woff2 b/book/en/fonts/open-sans-v17-all-charsets-regular-2e3b1d34.woff2
deleted file mode 100644
index 8383e94..0000000
--- a/book/en/fonts/open-sans-v17-all-charsets-regular-2e3b1d34.woff2
+++ /dev/null
Binary files differ
diff --git a/book/en/fonts/source-code-pro-v11-all-charsets-500-2bdd9410.woff2 b/book/en/fonts/source-code-pro-v11-all-charsets-500-2bdd9410.woff2
deleted file mode 100644
index 7222456..0000000
--- a/book/en/fonts/source-code-pro-v11-all-charsets-500-2bdd9410.woff2
+++ /dev/null
Binary files differ
diff --git a/book/en/heir-recovery.html b/book/en/heir-recovery.html
deleted file mode 100644
index 252d292..0000000
--- a/book/en/heir-recovery.html
+++ /dev/null
@@ -1,314 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Heir Key Recovery - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="heir-key-recovery"><a class="header" href="#heir-key-recovery">Heir Key Recovery</a></h1>
-<p>Your tesseras can survive infrastructure failures, quantum computers, and centuries of time. But what happens when you can no longer access your own keys? Tesseras uses <strong>Shamir’s Secret Sharing</strong> to let you distribute your cryptographic identity to trusted heirs.</p>
-<h2 id="how-it-works"><a class="header" href="#how-it-works">How it works</a></h2>
-<p>Shamir’s Secret Sharing splits a secret into N shares with a threshold T. Any T shares can reconstruct the original secret. Fewer than T shares reveal <strong>nothing</strong> — this is information-theoretically secure, not just computationally hard to break.</p>
-<p>For example, with threshold 2 and 3 total shares:</p>
-<ul>
-<li>Give share 1 to your spouse</li>
-<li>Give share 2 to your sibling</li>
-<li>Give share 3 to your lawyer</li>
-</ul>
-<p>Any two of them can recover your identity. A single share alone is useless.</p>
-<h2 id="creating-heir-shares"><a class="header" href="#creating-heir-shares">Creating heir shares</a></h2>
-<pre><code class="language-bash">tes heir create --threshold 2 --shares 3
-</code></pre>
-<p>This splits your Ed25519 identity key into 3 shares (requiring 2 to reconstruct) and saves them to <code>./heir-shares/</code>:</p>
-<pre><code>heir-shares/
-├── heir_share_1.bin # MessagePack binary
-├── heir_share_1.txt # Human-readable base64 text
-├── heir_share_2.bin
-├── heir_share_2.txt
-├── heir_share_3.bin
-└── heir_share_3.txt
-</code></pre>
-<p>Each share is generated in two formats:</p>
-<ul>
-<li><strong>Binary</strong> (<code>.bin</code>) — compact MessagePack, suitable for USB drives or digital storage</li>
-<li><strong>Text</strong> (<code>.txt</code>) — base64 with human-readable header, suitable for printing on paper</li>
-</ul>
-<p>The text format looks like this:</p>
-<pre><code>--- TESSERAS HEIR SHARE ---
-Format: v1
-Owner: a1b2c3d4e5f6a7b8 (fingerprint)
-Share: 1 of 3 (threshold: 2)
-Session: 9f8e7d6c5b4a3210
-Created: 2026-02-15
-
-&lt;base64-encoded data&gt;
---- END HEIR SHARE ---
-</code></pre>
-<h2 id="reconstructing-from-shares"><a class="header" href="#reconstructing-from-shares">Reconstructing from shares</a></h2>
-<p>When heirs need to recover the identity:</p>
-<pre><code class="language-bash">tes heir reconstruct heir_share_1.txt heir_share_2.bin --output-dir ./recovered-keys
-</code></pre>
-<p>The command auto-detects whether each file is binary or text format. It validates that all shares belong to the same session and owner, verifies checksums, and reconstructs the Ed25519 keypair.</p>
-<p>To install the recovered keys as the active identity:</p>
-<pre><code class="language-bash">tes heir reconstruct share1.txt share2.txt --output-dir ./recovered --install
-</code></pre>
-<p>This backs up the current identity before replacing it.</p>
-<h2 id="inspecting-a-share"><a class="header" href="#inspecting-a-share">Inspecting a share</a></h2>
-<p>To view metadata about a share without exposing secret data:</p>
-<pre><code class="language-bash">tes heir info heir_share_1.txt
-</code></pre>
-<p>Output:</p>
-<pre><code>Heir Share Information:
- Format version: 1
- Share: 1 of 3 (threshold: 2)
- Session: 9f8e7d6c5b4a3210
- Owner fingerprint: a1b2c3d4e5f6a7b8
- Share data size: 34 bytes
- Checksum: valid
-</code></pre>
-<h2 id="security-considerations"><a class="header" href="#security-considerations">Security considerations</a></h2>
-<ul>
-<li><strong>Threshold choice</strong>: a threshold of 2-of-3 or 3-of-5 is recommended for most people. Higher thresholds are more secure but require more heirs to cooperate.</li>
-<li><strong>Physical storage</strong>: print the <code>.txt</code> files on acid-free paper and store in separate physical locations (safe deposit boxes, different homes). Paper survives decades without degradation.</li>
-<li><strong>Never store shares together</strong>: the entire point of splitting is distribution. Keeping all shares in one place defeats the purpose.</li>
-<li><strong>Session isolation</strong>: each <code>heir create</code> call generates a fresh session ID. Shares from different sessions cannot be mixed — this prevents confusion after key rotations.</li>
-<li><strong>Checksum verification</strong>: each share includes a BLAKE3 checksum. Corrupted shares (OCR errors, bit rot) are detected before reconstruction is attempted.</li>
-<li><strong>Re-split after key changes</strong>: if you regenerate your identity, create new heir shares and securely destroy the old ones.</li>
-</ul>
-<h2 id="design-principles"><a class="header" href="#design-principles">Design principles</a></h2>
-<ul>
-<li><strong>Information-theoretic security</strong> — T-1 shares reveal exactly zero information about the secret. This is not a computational assumption; it is mathematically proven.</li>
-<li><strong>Corruption detection</strong> — BLAKE3 checksums catch bit rot, OCR errors, and truncation before any reconstruction attempt.</li>
-<li><strong>Format resilience</strong> — dual output (binary + text) ensures shares survive different storage media failure modes.</li>
-<li><strong>Backward compatibility</strong> — the secret blob is versioned, so future versions can include additional key material without breaking existing shares.</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="encryption.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="nat-traversal.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="encryption.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="nat-traversal.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/heir-recovery.html.gz b/book/en/heir-recovery.html.gz
deleted file mode 100644
index 21ec159..0000000
--- a/book/en/heir-recovery.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/highlight-493f70e1.css b/book/en/highlight-493f70e1.css
deleted file mode 100644
index 352c79b..0000000
--- a/book/en/highlight-493f70e1.css
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * An increased contrast highlighting scheme loosely based on the
- * "Base16 Atelier Dune Light" theme by Bram de Haan
- * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune)
- * Original Base16 color scheme by Chris Kempson
- * (https://github.com/chriskempson/base16)
- */
-
-/* Comment */
-.hljs-comment,
-.hljs-quote {
- color: #575757;
-}
-
-/* Red */
-.hljs-variable,
-.hljs-template-variable,
-.hljs-attribute,
-.hljs-attr,
-.hljs-tag,
-.hljs-name,
-.hljs-regexp,
-.hljs-link,
-.hljs-name,
-.hljs-selector-id,
-.hljs-selector-class {
- color: #d70025;
-}
-
-/* Orange */
-.hljs-number,
-.hljs-meta,
-.hljs-built_in,
-.hljs-builtin-name,
-.hljs-literal,
-.hljs-type,
-.hljs-params {
- color: #b21e00;
-}
-
-/* Green */
-.hljs-string,
-.hljs-symbol,
-.hljs-bullet {
- color: #008200;
-}
-
-/* Blue */
-.hljs-title,
-.hljs-section {
- color: #0030f2;
-}
-
-/* Purple */
-.hljs-keyword,
-.hljs-selector-tag {
- color: #9d00ec;
-}
-
-.hljs {
- display: block;
- overflow-x: auto;
- background: #f6f7f6;
- color: #000;
-}
-
-.hljs-emphasis {
- font-style: italic;
-}
-
-.hljs-strong {
- font-weight: bold;
-}
-
-.hljs-addition {
- color: #22863a;
- background-color: #f0fff4;
-}
-
-.hljs-deletion {
- color: #b31d28;
- background-color: #ffeef0;
-}
diff --git a/book/en/highlight-493f70e1.css.gz b/book/en/highlight-493f70e1.css.gz
deleted file mode 100644
index c8f4aaa..0000000
--- a/book/en/highlight-493f70e1.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/highlight-abc7f01d.js b/book/en/highlight-abc7f01d.js
deleted file mode 100644
index 18d2434..0000000
--- a/book/en/highlight-abc7f01d.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- Highlight.js 10.1.1 (93fd0d73)
- License: BSD-3-Clause
- Copyright (c) 2006-2020, Ivan Sagalaev
-*/
-var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){s+="<"+a(e)+[].map.call(e.attributes,(function(e){return" "+e.nodeName+'="'+t(e.value)+'"'})).join("")+">"}function u(e){s+="</"+a(e)+">"}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="</span>",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"<unnamed>")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var s=r+=1,o=d(e[i]);for(i>0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"<br>":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);
-hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"</?",end:">",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}());
-hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}());
-hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"</",contains:[].concat(_,u,d,[s,{begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",end:">",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin:/</,end:/>/,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}());
-hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}());
-hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}());
-hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}());
-hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:"</?",end:">"}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());
-hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}());
-hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}());
-hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{className:"number",variants:[{begin:e.C_NUMBER_RE+"[i]",relevance:1},e.C_NUMBER_MODE]},{begin:/:=/},{className:"function",beginKeywords:"func",end:"\\s*(\\{|$)",excludeEnd:!0,contains:[e.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:n,illegal:/["']/}]}]}}}());
-hljs.registerLanguage("http",function(){"use strict";return function(e){var n="HTTP/[0-9\\.]+";return{name:"HTTP",aliases:["https"],illegal:"\\S",contains:[{begin:"^"+n,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+n+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:n},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}}());
-hljs.registerLanguage("ini",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(...n){return n.map(n=>e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}());
-hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}());
-hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:"</>"},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}());
-hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}());
-hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/</,end:/>/,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin:/</,end:/>/,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}());
-hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}());
-hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}());
-hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i]},a={className:"variable",begin:/\$\([\w-]+\s/,end:/\)/,keywords:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},contains:[i]},r={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},s={className:"section",begin:/^[^\s]+:/,end:/$/,contains:[i]};return{name:"Makefile",aliases:["mk","mak"],keywords:{$pattern:/[\w-]+/,keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"},contains:[e.HASH_COMMENT_MODE,i,n,a,r,{className:"meta",begin:/^\.PHONY:/,end:/$/,keywords:{$pattern:/[\.\w]+/,"meta-keyword":".PHONY"}},s]}}}());
-hljs.registerLanguage("xml",function(){"use strict";return function(e){var n={className:"symbol",begin:"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"},a={begin:"\\s",contains:[{className:"meta-keyword",begin:"#?[a-z_][a-z1-9_-]+",illegal:"\\n"}]},s=e.inherit(a,{begin:"\\(",end:"\\)"}),t=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),i=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),c={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"<![a-z]",end:">",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"<![a-z]",end:">",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:"<style(?=\\s|>)",end:">",keywords:{name:"style"},contains:[c],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>)",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}());
-hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}());
-hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());
-hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"</",contains:[{className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}());
-hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());
-hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());
-hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}());
-hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}());
-hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}());
-hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}());
-hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}());
-hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}());
-hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{className:"string",variants:[{begin:/r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*/},{className:"number",variants:[{begin:"\\b0b([01_]+)"+n},{begin:"\\b0o([0-7_]+)"+n},{begin:"\\b0x([A-Fa-f0-9_]+)"+n},{begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+n}],relevance:0},{className:"function",beginKeywords:"fn",end:"(\\(|<)",excludeEnd:!0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"meta",begin:"#\\!?\\[",end:"\\]",contains:[{className:"meta-string",begin:/"/,end:/"/}]},{className:"class",beginKeywords:"type",end:";",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"\\S"},{className:"class",beginKeywords:"trait enum struct union",end:"{",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"[\\w\\d]"},{begin:e.IDENT_RE+"::",keywords:{built_in:t}},{begin:"->"}]}}}());
-hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}());
-hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}());
-hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}());
-hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin:/</,end:/>/},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());
-hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}());
-hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}());
-hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}());
-hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}());
-hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}());
-hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}());
-hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}());
-hljs.registerLanguage("nim",function(){"use strict";return function(e){return{name:"Nim",aliases:["nim"],keywords:{keyword:"addr and as asm bind block break case cast const continue converter discard distinct div do elif else end enum except export finally for from func generic if import in include interface is isnot iterator let macro method mixin mod nil not notin object of or out proc ptr raise ref return shl shr static template try tuple type using var when while with without xor yield",literal:"shared guarded stdin stdout stderr result true false",built_in:"int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 bool char string cstring pointer expr stmt void auto any range array openarray varargs seq set clong culong cchar cschar cshort cint csize clonglong cfloat cdouble clongdouble cuchar cushort cuint culonglong cstringarray semistatic"},contains:[{className:"meta",begin:/{\./,end:/\.}/,relevance:10},{className:"string",begin:/[a-zA-Z]\w*"/,end:/"/,contains:[{begin:/""/}]},{className:"string",begin:/([a-zA-Z]\w*)?"""/,end:/"""/},e.QUOTE_STRING_MODE,{className:"type",begin:/\b[A-Z]\w+\b/,relevance:0},{className:"number",relevance:0,variants:[{begin:/\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/},{begin:/\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(\d[_\d]*)('?[iIuUfF](8|16|32|64))?/}]},e.HASH_COMMENT_MODE]}}}());
-hljs.registerLanguage("nix",function(){"use strict";return function(e){var n={keyword:"rec with let in inherit assert if else then",literal:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"},i={className:"subst",begin:/\$\{/,end:/}/,keywords:n},t={className:"string",contains:[i],variants:[{begin:"''",end:"''"},{begin:'"',end:'"'}]},s=[e.NUMBER_MODE,e.HASH_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t,{begin:/[a-zA-Z0-9-_]+(\s*=)/,returnBegin:!0,relevance:0,contains:[{className:"attr",begin:/\S+/}]}];return i.contains=s,{name:"Nix",aliases:["nixos"],keywords:n,contains:s}}}());
-hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}());
-hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}());
-hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}()); \ No newline at end of file
diff --git a/book/en/highlight-abc7f01d.js.gz b/book/en/highlight-abc7f01d.js.gz
deleted file mode 100644
index 675e895..0000000
--- a/book/en/highlight-abc7f01d.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/images/logo.png b/book/en/images/logo.png
deleted file mode 100644
index ae0d24d..0000000
--- a/book/en/images/logo.png
+++ /dev/null
Binary files differ
diff --git a/book/en/index.html b/book/en/index.html
deleted file mode 100644
index cfdd805..0000000
--- a/book/en/index.html
+++ /dev/null
@@ -1,288 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Introduction - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="introduction"><a class="header" href="#introduction">Introduction</a></h1>
-<p>Tesseras is a peer-to-peer network for preserving human memories across millennia. Each person creates a <strong>tessera</strong> — a self-contained time capsule of memories (photos, audio, video, text) that survives independently of any software, company, or infrastructure.</p>
-<h2 id="what-is-a-tessera"><a class="header" href="#what-is-a-tessera">What is a tessera?</a></h2>
-<p>The word <em>tessera</em> comes from the small tiles used to make mosaics in the ancient world. In Tesseras, each tessera is a collection of memories packaged into a format designed to be understood even thousands of years from now, without any special software.</p>
-<p>A tessera contains:</p>
-<ul>
-<li><strong>Memories</strong> — photos (JPEG), audio recordings (WAV), video (WebM), and text (plain UTF-8)</li>
-<li><strong>Metadata</strong> — when and where each memory was created, who it involves, and what it means</li>
-<li><strong>Identity</strong> — cryptographic signatures proving who created it</li>
-<li><strong>Decoding instructions</strong> — plain-text explanations of every format used, so future humans can read the contents</li>
-</ul>
-<h2 id="core-philosophy"><a class="header" href="#core-philosophy">Core philosophy</a></h2>
-<ul>
-<li><strong>No company dependency</strong> — your memories are yours, stored locally and replicated across a peer-to-peer network</li>
-<li><strong>No format lock-in</strong> — every tessera includes instructions for decoding its contents</li>
-<li><strong>Availability over secrecy</strong> — public memories are not encrypted, because long-term accessibility matters more than hiding things</li>
-<li><strong>Minimal encryption</strong> — only private and sealed content is encrypted; everything else is open</li>
-<li><strong>Quantum-resistant</strong> — dual signatures (Ed25519 + ML-DSA) protect integrity even against future quantum computers</li>
-</ul>
-<h2 id="current-status-phase-4"><a class="header" href="#current-status-phase-4">Current status: Phase 4</a></h2>
-<p>Tesseras has completed through <strong>Phase 4</strong> — encryption and sealed tesseras. The project now covers local tessera management, networking, replication, a mobile app, and cryptographic privacy.</p>
-<p>What’s available today:</p>
-<ul>
-<li>Identity generation (Ed25519 keypair with proof-of-work)</li>
-<li>Tessera creation from local files</li>
-<li>Content-addressed storage (BLAKE3 hashing)</li>
-<li>Integrity verification and self-contained export</li>
-<li>Full node daemon with QUIC transport</li>
-<li>Peer discovery via Kademlia DHT</li>
-<li>Tessera pointer publishing and lookup across the network</li>
-<li>Reed-Solomon erasure coding with automatic fragment repair</li>
-<li>Flutter mobile app with embedded Rust P2P node</li>
-<li><strong>Private tesseras</strong> — encrypted content only the owner can access</li>
-<li><strong>Sealed tesseras</strong> — time-locked content that opens after a specific date</li>
-<li><strong>Hybrid post-quantum encryption</strong> — X25519 + ML-KEM-768 key encapsulation</li>
-<li><strong>AES-256-GCM</strong> content encryption with AAD binding</li>
-</ul>
-<h2 id="key-concepts"><a class="header" href="#key-concepts">Key concepts</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Concept</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Tessera</strong></td><td>A self-contained time capsule of memories</td></tr>
-<tr><td><strong>Memory</strong></td><td>A single item (photo, recording, video, or text) within a tessera</td></tr>
-<tr><td><strong>Content hash</strong></td><td>A BLAKE3 hash that uniquely identifies a tessera by its contents</td></tr>
-<tr><td><strong>Visibility</strong></td><td>Controls who can access a tessera: public, private, sealed, or circle</td></tr>
-<tr><td><strong>Sealed tessera</strong></td><td>A time capsule that can only be opened after a specific date</td></tr>
-<tr><td><strong>MANIFEST</strong></td><td>A plain-text index listing every file in the tessera with its checksum</td></tr>
-<tr><td><strong>Memory type</strong></td><td>Categorizes a memory: moment, reflection, daily, relation, or object</td></tr>
-<tr><td><strong>Node</strong></td><td>A device running the Tesseras daemon, participating in the P2P network</td></tr>
-<tr><td><strong>DHT</strong></td><td>Distributed hash table — how nodes find tessera pointers without a central server</td></tr>
-<tr><td><strong>Bootstrap</strong></td><td>The process of joining the network by contacting known seed nodes</td></tr>
-</tbody>
-</table>
-</div>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
-
- <a rel="next prefetch" href="installation.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
-
- <a rel="next prefetch" href="installation.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/index.html.gz b/book/en/index.html.gz
deleted file mode 100644
index e0763c5..0000000
--- a/book/en/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/installation.html b/book/en/installation.html
deleted file mode 100644
index df06763..0000000
--- a/book/en/installation.html
+++ /dev/null
@@ -1,397 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Installation - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="installation"><a class="header" href="#installation">Installation</a></h1>
-<p>Tesseras is currently available by building from source.</p>
-<h2 id="prerequisites"><a class="header" href="#prerequisites">Prerequisites</a></h2>
-<h3 id="rust"><a class="header" href="#rust">Rust</a></h3>
-<p>Tesseras requires <strong>Rust 1.85 or higher</strong>. The recommended way to install Rust is via <a href="https://rustup.rs/">rustup</a>:</p>
-<pre><code class="language-bash">curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
-</code></pre>
-<p>After installation, make sure <code>~/.cargo/bin</code> is in your <code>PATH</code>. The installer usually adds it automatically. Verify with:</p>
-<pre><code class="language-bash">rustc --version
-cargo --version
-</code></pre>
-<p>If you already have Rust installed, update to the latest version:</p>
-<pre><code class="language-bash">rustup update stable
-</code></pre>
-<h3 id="sqlite"><a class="header" href="#sqlite">SQLite</a></h3>
-<p>Tesseras uses SQLite for local storage. You have two options:</p>
-<p><strong>Option 1: System SQLite (recommended)</strong></p>
-<p>Install SQLite development libraries via your system package manager:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Distribution</th><th>Command</th></tr>
-</thead>
-<tbody>
-<tr><td>Arch Linux</td><td><code>sudo pacman -S sqlite</code></td></tr>
-<tr><td>Debian / Ubuntu</td><td><code>sudo apt install libsqlite3-dev</code></td></tr>
-<tr><td>Fedora</td><td><code>sudo dnf install sqlite-devel</code></td></tr>
-<tr><td>Alpine</td><td><code>apk add sqlite-dev</code></td></tr>
-<tr><td>macOS (Homebrew)</td><td><code>brew install sqlite</code></td></tr>
-<tr><td>FreeBSD</td><td><code>pkg install sqlite3</code></td></tr>
-<tr><td>OpenBSD</td><td>Included in the base system</td></tr>
-</tbody>
-</table>
-</div>
-<p><strong>Option 2: Bundled SQLite</strong></p>
-<p>If you prefer not to install SQLite on your system, use the <code>bundled-sqlite</code> feature flag during compilation. This compiles SQLite alongside Tesseras:</p>
-<pre><code class="language-bash">cargo install --path crates/tesseras-cli --features bundled-sqlite
-cargo install --path crates/tesseras-daemon --features bundled-sqlite
-</code></pre>
-<h3 id="optional-tools"><a class="header" href="#optional-tools">Optional tools</a></h3>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Tool</th><th>Purpose</th><th>Installation</th></tr>
-</thead>
-<tbody>
-<tr><td><a href="https://github.com/casey/just">just</a></td><td>Run project build commands</td><td><code>cargo install just</code></td></tr>
-<tr><td><a href="https://rust-lang.github.io/mdBook/">mdBook</a></td><td>Build the documentation</td><td><code>cargo install mdbook</code></td></tr>
-<tr><td><a href="https://docs.docker.com/get-docker/">Docker</a></td><td>Run nodes in containers</td><td>See <a href="./docker.html">Docker</a></td></tr>
-<tr><td><a href="https://flutter.dev/docs/get-started/install">Flutter</a></td><td>Build the mobile/desktop app</td><td>See <a href="#flutter-app">Flutter App</a></td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="build-from-source"><a class="header" href="#build-from-source">Build from source</a></h2>
-<p>Clone the repository and install the binaries:</p>
-<pre><code class="language-bash">git clone https://git.sr.ht/~ijanc/tesseras
-cd tesseras
-cargo install --path crates/tesseras-cli
-cargo install --path crates/tesseras-daemon
-</code></pre>
-<p>Or, if you have <code>just</code> installed:</p>
-<pre><code class="language-bash">just install
-</code></pre>
-<p>This installs two binaries to <code>~/.cargo/bin/</code> and configures shell auto-completions:</p>
-<ul>
-<li><code>tes</code> — CLI tool for creating, verifying, and exporting tesseras</li>
-<li><code>tesseras-daemon</code> — full node daemon that participates in the P2P network</li>
-</ul>
-<h2 id="verify-installation"><a class="header" href="#verify-installation">Verify installation</a></h2>
-<pre><code class="language-bash">tes --help
-</code></pre>
-<p>You should see:</p>
-<pre><code>Create and preserve human memories
-
-Usage: tes [OPTIONS] &lt;COMMAND&gt;
-
-Commands:
- init Initialize identity and local database
- create Create a tessera from a directory of files
- verify Verify integrity of a stored tessera
- export Export tessera to a self-contained directory
- list List local tesseras
- help Print this message or the help of the given subcommand(s)
-
-Options:
- --data-dir &lt;DATA_DIR&gt; Base directory for data storage [default: ~/.tesseras]
- -h, --help Print help
-</code></pre>
-<h2 id="shell-completions"><a class="header" href="#shell-completions">Shell completions</a></h2>
-<p>The <code>just install</code> command configures completions automatically. If you installed manually, generate completions for your shell:</p>
-<pre><code class="language-bash"># Fish
-tes completions fish &gt; ~/.config/fish/completions/tes.fish
-
-# Zsh
-tes completions zsh &gt; "${XDG_DATA_HOME:-$HOME/.local/share}/zsh/site-functions/_tes"
-
-# Bash
-tes completions bash &gt; "${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion/completions/tes"
-</code></pre>
-<h2 id="flutter-app"><a class="header" href="#flutter-app">Flutter App</a></h2>
-<p>To build the mobile or desktop app, you need additional dependencies:</p>
-<h3 id="flutter-prerequisites"><a class="header" href="#flutter-prerequisites">Flutter prerequisites</a></h3>
-<ol>
-<li><strong>Flutter SDK</strong> — install following the <a href="https://flutter.dev/docs/get-started/install">official guide</a></li>
-<li><strong>Rust</strong> — already installed as above</li>
-<li><strong>Platform dependencies:</strong></li>
-</ol>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Platform</th><th>Dependencies</th></tr>
-</thead>
-<tbody>
-<tr><td>Android</td><td>Android SDK, Android NDK, Java 17+</td></tr>
-<tr><td>iOS</td><td>Xcode, CocoaPods</td></tr>
-<tr><td>Linux desktop</td><td>GTK 3.0+, pkg-config (<code>sudo apt install libgtk-3-dev pkg-config</code> on Debian/Ubuntu)</td></tr>
-<tr><td>macOS desktop</td><td>Xcode Command Line Tools</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="build-the-app"><a class="header" href="#build-the-app">Build the app</a></h3>
-<pre><code class="language-bash">cd apps/flutter
-flutter pub get
-
-# Linux desktop
-flutter build linux --debug
-
-# Android
-flutter build apk --debug
-
-# iOS
-flutter build ios --debug
-
-# Tests
-flutter test
-</code></pre>
-<p>Or using <code>just</code> from the repository root:</p>
-<pre><code class="language-bash">just build-linux # Linux desktop
-just build-android # Android APK
-just test-flutter # Tests
-</code></pre>
-<h2 id="network-ports"><a class="header" href="#network-ports">Network ports</a></h2>
-<p>The Tesseras daemon uses QUIC (protocol over UDP). If you are behind a firewall, allow traffic on the port:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Protocol</th><th>Port</th><th>Direction</th></tr>
-</thead>
-<tbody>
-<tr><td>UDP</td><td>4433</td><td>Inbound and outbound</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="next-steps"><a class="header" href="#next-steps">Next steps</a></h2>
-<ul>
-<li><a href="./quick-start.html">Quick Start</a> — create your first tessera</li>
-<li><a href="./running-a-node.html">Running a Node</a> — configure and run the daemon</li>
-<li><a href="./configuration.html">Configuration</a> — configuration options</li>
-<li><a href="./docker.html">Docker</a> — run in containers</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="introduction.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="quick-start.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="introduction.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="quick-start.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/installation.html.gz b/book/en/installation.html.gz
deleted file mode 100644
index 701f8d4..0000000
--- a/book/en/installation.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/introduction.html b/book/en/introduction.html
deleted file mode 100644
index cfdd805..0000000
--- a/book/en/introduction.html
+++ /dev/null
@@ -1,288 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Introduction - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="introduction"><a class="header" href="#introduction">Introduction</a></h1>
-<p>Tesseras is a peer-to-peer network for preserving human memories across millennia. Each person creates a <strong>tessera</strong> — a self-contained time capsule of memories (photos, audio, video, text) that survives independently of any software, company, or infrastructure.</p>
-<h2 id="what-is-a-tessera"><a class="header" href="#what-is-a-tessera">What is a tessera?</a></h2>
-<p>The word <em>tessera</em> comes from the small tiles used to make mosaics in the ancient world. In Tesseras, each tessera is a collection of memories packaged into a format designed to be understood even thousands of years from now, without any special software.</p>
-<p>A tessera contains:</p>
-<ul>
-<li><strong>Memories</strong> — photos (JPEG), audio recordings (WAV), video (WebM), and text (plain UTF-8)</li>
-<li><strong>Metadata</strong> — when and where each memory was created, who it involves, and what it means</li>
-<li><strong>Identity</strong> — cryptographic signatures proving who created it</li>
-<li><strong>Decoding instructions</strong> — plain-text explanations of every format used, so future humans can read the contents</li>
-</ul>
-<h2 id="core-philosophy"><a class="header" href="#core-philosophy">Core philosophy</a></h2>
-<ul>
-<li><strong>No company dependency</strong> — your memories are yours, stored locally and replicated across a peer-to-peer network</li>
-<li><strong>No format lock-in</strong> — every tessera includes instructions for decoding its contents</li>
-<li><strong>Availability over secrecy</strong> — public memories are not encrypted, because long-term accessibility matters more than hiding things</li>
-<li><strong>Minimal encryption</strong> — only private and sealed content is encrypted; everything else is open</li>
-<li><strong>Quantum-resistant</strong> — dual signatures (Ed25519 + ML-DSA) protect integrity even against future quantum computers</li>
-</ul>
-<h2 id="current-status-phase-4"><a class="header" href="#current-status-phase-4">Current status: Phase 4</a></h2>
-<p>Tesseras has completed through <strong>Phase 4</strong> — encryption and sealed tesseras. The project now covers local tessera management, networking, replication, a mobile app, and cryptographic privacy.</p>
-<p>What’s available today:</p>
-<ul>
-<li>Identity generation (Ed25519 keypair with proof-of-work)</li>
-<li>Tessera creation from local files</li>
-<li>Content-addressed storage (BLAKE3 hashing)</li>
-<li>Integrity verification and self-contained export</li>
-<li>Full node daemon with QUIC transport</li>
-<li>Peer discovery via Kademlia DHT</li>
-<li>Tessera pointer publishing and lookup across the network</li>
-<li>Reed-Solomon erasure coding with automatic fragment repair</li>
-<li>Flutter mobile app with embedded Rust P2P node</li>
-<li><strong>Private tesseras</strong> — encrypted content only the owner can access</li>
-<li><strong>Sealed tesseras</strong> — time-locked content that opens after a specific date</li>
-<li><strong>Hybrid post-quantum encryption</strong> — X25519 + ML-KEM-768 key encapsulation</li>
-<li><strong>AES-256-GCM</strong> content encryption with AAD binding</li>
-</ul>
-<h2 id="key-concepts"><a class="header" href="#key-concepts">Key concepts</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Concept</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Tessera</strong></td><td>A self-contained time capsule of memories</td></tr>
-<tr><td><strong>Memory</strong></td><td>A single item (photo, recording, video, or text) within a tessera</td></tr>
-<tr><td><strong>Content hash</strong></td><td>A BLAKE3 hash that uniquely identifies a tessera by its contents</td></tr>
-<tr><td><strong>Visibility</strong></td><td>Controls who can access a tessera: public, private, sealed, or circle</td></tr>
-<tr><td><strong>Sealed tessera</strong></td><td>A time capsule that can only be opened after a specific date</td></tr>
-<tr><td><strong>MANIFEST</strong></td><td>A plain-text index listing every file in the tessera with its checksum</td></tr>
-<tr><td><strong>Memory type</strong></td><td>Categorizes a memory: moment, reflection, daily, relation, or object</td></tr>
-<tr><td><strong>Node</strong></td><td>A device running the Tesseras daemon, participating in the P2P network</td></tr>
-<tr><td><strong>DHT</strong></td><td>Distributed hash table — how nodes find tessera pointers without a central server</td></tr>
-<tr><td><strong>Bootstrap</strong></td><td>The process of joining the network by contacting known seed nodes</td></tr>
-</tbody>
-</table>
-</div>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
-
- <a rel="next prefetch" href="installation.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
-
- <a rel="next prefetch" href="installation.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/introduction.html.gz b/book/en/introduction.html.gz
deleted file mode 100644
index 5e91d4f..0000000
--- a/book/en/introduction.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/mark-09e88c2c.min.js b/book/en/mark-09e88c2c.min.js
deleted file mode 100644
index 1636231..0000000
--- a/book/en/mark-09e88c2c.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!***************************************************
-* mark.js v8.11.1
-* https://markjs.io/
-* Copyright (c) 2014–2018, Julian Kühnel
-* Released under the MIT license https://git.io/vwTVl
-*****************************************************/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Mark=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=function(){function e(n){var r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&o(c)};s||u(),a.forEach(function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach(function(e,t){e.val===n&&(i=t,o=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o,a=this,s=this.createIterator(t,e,r),c=[],u=[],l=void 0,h=void 0;void 0,o=a.getIteratorNode(s),h=o.prevNode,l=o.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(l,h,e,c)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return u.push(e)},r)}),u.push(l);u.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(c,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach(function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,function(){--a<=0&&i()})};r.iframes?r.waitForIframes(o,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),o=function(){function e(n){t(this,e),this.opt=r({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},n)}return n(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm"+(this.opt.caseSensitive?"":"i"))}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynonyms(a)+"|"+this.processSynonyms(s)+")"+r))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="";switch(("string"==typeof n?[]:n.limiters).forEach(function(e){i+="|"+t.escapeStr(e)}),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=o.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,i){for(var o=t.length,a=1;a<o;a++){var s=e.textContent.indexOf(t[a]);t[a]&&s>-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,i))}return e}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];){if(o.opt.separateGroups)t=o.separateGroups(t,i,a,n,r);else{if(!n(i[a],t))continue;var s=i.index;if(0!==a)for(var c=1;c<a;c++)s+=i[c].length;t=o.wrapGroups(t,s,i[a].length,r)}e.lastIndex=0}}),i()})}},{key:"wrapMatchesAcrossElements",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){for(var s=void 0;null!==(s=e.exec(t.value))&&""!==s[a];){var c=s.index;if(0!==a)for(var u=1;u<a;u++)c+=s[u].length;var l=c+s[a].length;o.wrapRangeInMappedTextNode(t,c,l,function(e){return n(s[a],e)},function(t,n){e.lastIndex=n,r(t)})}i()})}},{key:"wrapRangeFromIndex",value:function(e,t,n,r){var i=this;this.getTextNodes(function(o){var a=o.value.length;e.forEach(function(e,r){var s=i.checkWhitespaceRanges(e,a,o.value),c=s.start,u=s.end;s.valid&&i.wrapRangeInMappedTextNode(o,c,u,function(n){return t(n,e,o.value.substring(c,u),r)},function(t){n(t,e)})}),r()})}},{key:"unwrapMatches",value:function(e){for(var t=e.parentNode,n=document.createDocumentFragment();e.firstChild;)n.appendChild(e.removeChild(e.firstChild));t.replaceChild(n,e),this.ie?this.normalizeTextNode(t):t.normalize()}},{key:"normalizeTextNode",value:function(e){if(e){if(3===e.nodeType)for(;e.nextSibling&&3===e.nextSibling.nodeType;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}},{key:"markRegExp",value:function(e,t){var n=this;this.opt=t,this.log('Searching with expression "'+e+'"');var r=0,i="wrapMatches";this.opt.acrossElements&&(i="wrapMatchesAcrossElements"),this[i](e,this.opt.ignoreGroups,function(e,t){return n.opt.filter(t,e,r)},function(e){r++,n.opt.each(e)},function(){0===r&&n.opt.noMatch(e),n.opt.done(r)})}},{key:"mark",value:function(e,t){var n=this;this.opt=t;var r=0,i="wrapMatches",a=this.getSeparatedKeywords("string"==typeof e?[e]:e),s=a.keywords,c=a.length;this.opt.acrossElements&&(i="wrapMatchesAcrossElements"),0===c?this.opt.done(r):function e(t){var a=new o(n.opt).create(t),u=0;n.log('Searching with expression "'+a+'"'),n[i](a,1,function(e,i){return n.opt.filter(i,t,r,u)},function(e){u++,r++,n.opt.each(e)},function(){0===u&&n.opt.noMatch(t),s[c-1]===t?n.opt.done(r):e(s[s.indexOf(t)+1])})}(s[0])}},{key:"markRanges",value:function(e,t){var n=this;this.opt=t;var r=0,i=this.checkRanges(e);i&&i.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(i)),this.wrapRangeFromIndex(i,function(e,t,r,i){return n.opt.filter(e,t,r,i)},function(e,t){r++,n.opt.each(e,t)},function(){n.opt.done(r)})):this.opt.done(r)}},{key:"unmark",value:function(e){var t=this;this.opt=e;var n=this.opt.element?this.opt.element:"*";n+="[data-markjs]",this.opt.className&&(n+="."+this.opt.className),this.log('Removal selector "'+n+'"'),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,function(e){t.unwrapMatches(e)},function(e){var r=i.matches(e,n),o=t.matchesExclude(e);return!r||o?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}},{key:"opt",set:function(e){this._opt=r({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,acrossElements:!1,ignoreGroups:0,each:function(){},noMatch:function(){},filter:function(){return!0},done:function(){},debug:!1,log:window.console},e)},get:function(){return this._opt}},{key:"iterator",get:function(){return new i(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}}]),a}();return function(e){var t=this,n=new a(e);return this.mark=function(e,r){return n.mark(e,r),t},this.markRegExp=function(e,r){return n.markRegExp(e,r),t},this.markRanges=function(e,r){return n.markRanges(e,r),t},this.unmark=function(e){return n.unmark(e),t},this}});
diff --git a/book/en/mark-09e88c2c.min.js.gz b/book/en/mark-09e88c2c.min.js.gz
deleted file mode 100644
index 6c4a8a5..0000000
--- a/book/en/mark-09e88c2c.min.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/nat-traversal.html b/book/en/nat-traversal.html
deleted file mode 100644
index 72fd1bc..0000000
--- a/book/en/nat-traversal.html
+++ /dev/null
@@ -1,334 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>NAT Traversal - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="nat-traversal"><a class="header" href="#nat-traversal">NAT Traversal</a></h1>
-<p>Most devices on the internet sit behind a <strong>NAT</strong> (Network Address Translator). Your router assigns your device a private address (like <code>192.168.1.100</code>) and translates it to a public address when you connect outward. This works fine for browsing the web, but it creates a problem for P2P networks: two devices behind different NATs cannot directly connect to each other without help.</p>
-<p>Tesseras solves this with a three-tier approach, trying the cheapest option first:</p>
-<ol>
-<li><strong>Direct connection</strong> — if both nodes have public IPs, they connect directly</li>
-<li><strong>UDP hole punching</strong> — a third node introduces the two peers so they can punch through their NATs</li>
-<li><strong>Relay</strong> — a public-IP node forwards packets between the two peers</li>
-</ol>
-<h2 id="nat-type-discovery"><a class="header" href="#nat-type-discovery">NAT type discovery</a></h2>
-<p>When a node starts, it sends STUN (Session Traversal Utilities for NAT) requests to multiple public servers. By comparing the external addresses these servers report back, the node classifies its NAT:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>NAT Type</th><th>What it means</th><th>Hole punching?</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Public</strong></td><td>No NAT — your device has a public IP</td><td>Not needed</td></tr>
-<tr><td><strong>Cone</strong></td><td>NAT maps the same internal port to the same external port regardless of destination</td><td>Works well (~80%)</td></tr>
-<tr><td><strong>Symmetric</strong></td><td>NAT assigns a different external port for each destination</td><td>Unreliable</td></tr>
-<tr><td><strong>Unknown</strong></td><td>Could not reach STUN servers</td><td>Relay needed</td></tr>
-</tbody>
-</table>
-</div>
-<p>Your node advertises its NAT type in DHT Pong messages, so other nodes know whether hole punching is worth attempting.</p>
-<h2 id="hole-punching"><a class="header" href="#hole-punching">Hole punching</a></h2>
-<p>When node A (behind a Cone NAT) wants to connect to node B (also behind a Cone NAT), neither can directly reach the other. The solution:</p>
-<ol>
-<li>
-<p>A sends a <strong>PunchIntro</strong> message to node I (an introducer — any public-IP node they both know). The message includes A’s external address (from STUN) and an Ed25519 signature proving A’s identity.</p>
-</li>
-<li>
-<p>I verifies the signature and forwards a <strong>PunchRequest</strong> to B, including A’s address and the original signature.</p>
-</li>
-<li>
-<p>B verifies the signature (proving the request really came from A, not a spoofed source). B then sends a UDP packet to A’s external address — this opens a pinhole in B’s NAT. B also sends a <strong>PunchReady</strong> message back to A with B’s external address.</p>
-</li>
-<li>
-<p>A sends a UDP packet to B’s external address. Both NATs now have pinholes, and the two nodes can communicate directly.</p>
-</li>
-</ol>
-<p>The entire process takes 2-5 seconds. The Ed25519 signatures prevent <strong>reflection attacks</strong>, where an attacker replays an old introduction to redirect traffic.</p>
-<h2 id="relay-fallback"><a class="header" href="#relay-fallback">Relay fallback</a></h2>
-<p>When hole punching fails (Symmetric NAT, strict firewalls, or corporate networks), nodes fall back to relaying through a public-IP node:</p>
-<ol>
-<li>A sends a <strong>RelayRequest</strong> to node R (a public-IP node with relay enabled).</li>
-<li>R creates a session and sends a <strong>RelayOffer</strong> to both A and B, containing the relay address and a session token.</li>
-<li>A and B send their packets to R, prefixed with the session token. R strips the token and forwards the payload to the other peer.</li>
-</ol>
-<p>Relay sessions have bandwidth limits:</p>
-<ul>
-<li><strong>256 KB/s</strong> for peers with good reciprocity (they store fragments for others)</li>
-<li><strong>64 KB/s</strong> for peers without reciprocity</li>
-<li>Non-reciprocal sessions are limited to 10 minutes</li>
-</ul>
-<p>This encourages nodes to contribute storage — good network citizens get better relay service.</p>
-<h2 id="address-migration"><a class="header" href="#address-migration">Address migration</a></h2>
-<p>When a mobile device switches networks (Wi-Fi to cellular), its IP address changes. Rather than tearing down and rebuilding relay sessions, the node sends a signed <strong>RelayMigrate</strong> message to update its address in the existing session. This avoids re-establishing connections from scratch.</p>
-<h2 id="configuration"><a class="header" href="#configuration">Configuration</a></h2>
-<p>The <code>[nat]</code> section in the daemon config controls NAT traversal:</p>
-<pre><code class="language-toml">[nat]
-# STUN servers for NAT type detection
-stun_servers = ["stun.l.google.com:19302", "stun.cloudflare.com:3478"]
-
-# Enable relay (forward traffic for other NATed peers)
-relay_enabled = false
-
-# Maximum simultaneous relay sessions
-relay_max_sessions = 50
-
-# Bandwidth limit for reciprocal peers (KB/s)
-relay_reciprocal_kbps = 256
-
-# Bandwidth limit for non-reciprocal peers (KB/s)
-relay_bootstrap_kbps = 64
-
-# Relay session idle timeout (seconds)
-relay_idle_timeout_secs = 60
-</code></pre>
-<p>To run a relay node, set <code>relay_enabled = true</code>. Your node must have a public IP (or a port-forwarded router) to serve as a relay.</p>
-<h2 id="mobile-reconnection"><a class="header" href="#mobile-reconnection">Mobile reconnection</a></h2>
-<p>When the Tesseras app detects a network change on a mobile device, it runs a three-phase reconnection sequence:</p>
-<ol>
-<li><strong>QUIC migration</strong> (0-2s) — QUIC supports connection migration natively. The app tries to migrate all active connections to the new address.</li>
-<li><strong>Re-STUN</strong> (2-5s) — discover the new external address and re-announce to the DHT.</li>
-<li><strong>Re-establish</strong> (5-10s) — reconnect peers that migration couldn’t save, in priority order: bootstrap nodes first, then nodes holding your fragments, then nodes whose fragments you hold.</li>
-</ol>
-<p>The app shows reconnection progress through the <code>NetworkChanged</code> event stream.</p>
-<h2 id="monitoring"><a class="header" href="#monitoring">Monitoring</a></h2>
-<p>NAT traversal exposes Prometheus metrics at <code>/metrics</code>:</p>
-<ul>
-<li><code>tesseras_nat_type</code> — current detected NAT type</li>
-<li><code>tesseras_stun_requests_total</code> / <code>tesseras_stun_failures_total</code> — STUN reliability</li>
-<li><code>tesseras_punch_attempts_total{initiator_nat, target_nat}</code> — punch success rate by NAT pair</li>
-<li><code>tesseras_relay_sessions_active</code> — current relay load</li>
-<li><code>tesseras_relay_bytes_forwarded</code> — total relay bandwidth</li>
-<li><code>tesseras_network_change_total</code> — network change frequency on mobile</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="heir-recovery.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="docker.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="heir-recovery.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="docker.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/nat-traversal.html.gz b/book/en/nat-traversal.html.gz
deleted file mode 100644
index 287a602..0000000
--- a/book/en/nat-traversal.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/network-concepts.html b/book/en/network-concepts.html
deleted file mode 100644
index 823d16d..0000000
--- a/book/en/network-concepts.html
+++ /dev/null
@@ -1,285 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Network Concepts - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="network-concepts"><a class="header" href="#network-concepts">Network Concepts</a></h1>
-<p>This chapter explains how Tesseras nodes find each other and locate tessera pointers on the network. You don’t need to understand these details to use Tesseras, but they help explain what the daemon is doing in the background.</p>
-<h2 id="how-nodes-find-each-other"><a class="header" href="#how-nodes-find-each-other">How nodes find each other</a></h2>
-<p>Tesseras uses a <strong>Kademlia distributed hash table (DHT)</strong> — a proven algorithm used by BitTorrent and other P2P systems for over 20 years. There is no central server. Each node maintains a routing table of peers it knows about, and nodes cooperate to route queries to the right place.</p>
-<p>When your node starts, it contacts one or more <strong>bootstrap nodes</strong> (seed nodes with known addresses). Through these initial connections, your node discovers other peers and builds up its routing table. Over time, your node naturally learns about more peers as it participates in the network.</p>
-<h2 id="what-the-dht-stores"><a class="header" href="#what-the-dht-stores">What the DHT stores</a></h2>
-<p>The DHT stores <strong>pointers</strong>, not data. A pointer is a lightweight record that says “tessera X is held by nodes Y and Z.” When someone wants to retrieve a tessera, they first look up its pointer in the DHT to find out which nodes have it, then connect directly to those nodes to download the actual data.</p>
-<p>This means the DHT stays small and fast — it only tracks who has what, not the content itself.</p>
-<h2 id="node-identity-and-proof-of-work"><a class="header" href="#node-identity-and-proof-of-work">Node identity and proof-of-work</a></h2>
-<p>Every node has a 160-bit <strong>node ID</strong> derived from its public key. To prevent an attacker from cheaply creating thousands of fake nodes (a <strong>Sybil attack</strong>), generating a node ID requires a small proof-of-work: the node must find a nonce such that <code>BLAKE3(public_key || nonce)</code> starts with 8 zero bits.</p>
-<p>This takes about 256 hash attempts — under a second on any device, including a Raspberry Pi. But an attacker trying to create 10,000 fake identities would need millions of attempts, making the attack impractical.</p>
-<h2 id="xor-distance"><a class="header" href="#xor-distance">XOR distance</a></h2>
-<p>Kademlia defines “closeness” between nodes using the <strong>XOR metric</strong>: the distance between two node IDs is their bitwise XOR. Nodes are responsible for storing pointers whose keys are close to their own ID (in XOR distance). This distributes data evenly across the network without any coordination.</p>
-<p>When looking up a tessera pointer, your node asks the peers it knows that are closest to the target key. Those peers point to even closer ones, and so on, until the pointer is found. This <strong>iterative lookup</strong> typically reaches any node in the network within a few hops.</p>
-<h2 id="transport-quic"><a class="header" href="#transport-quic">Transport: QUIC</a></h2>
-<p>All communication between nodes uses <strong>QUIC</strong>, a modern transport protocol built on UDP. QUIC provides:</p>
-<ul>
-<li><strong>Built-in encryption</strong> — every connection uses TLS 1.3</li>
-<li><strong>NAT-friendly</strong> — works through most network address translators since it’s UDP-based</li>
-<li><strong>Multiplexing</strong> — multiple independent operations over one connection without head-of-line blocking</li>
-<li><strong>Connection migration</strong> — survives network changes (e.g., switching from Wi-Fi to mobile data)</li>
-</ul>
-<p>The daemon listens on UDP port <strong>4433</strong> by default.</p>
-<h2 id="bootstrap-process"><a class="header" href="#bootstrap-process">Bootstrap process</a></h2>
-<p>When a node starts, it follows this sequence:</p>
-<ol>
-<li><strong>Contact seed nodes</strong> — connect to one or more known bootstrap addresses</li>
-<li><strong>Exchange pings</strong> — verify the seed is alive and exchange node identities</li>
-<li><strong>Self-lookup</strong> — ask the seed for nodes close to your own ID, to populate your routing table</li>
-<li><strong>Iterative discovery</strong> — contact the newly discovered nodes, which point you to even more peers</li>
-</ol>
-<p>After bootstrap, the node maintains its routing table automatically: it refreshes buckets periodically and replaces unresponsive peers with new ones.</p>
-<h2 id="node-types"><a class="header" href="#node-types">Node types</a></h2>
-<p>Not every device participates in the network the same way:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Type</th><th>Description</th><th>Always on?</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Full node</strong></td><td>Desktop, server, or Raspberry Pi running <code>tesseras-daemon</code>. Participates fully in the DHT and stores data for other nodes.</td><td>Yes</td></tr>
-<tr><td><strong>Mobile node</strong></td><td>Phone or tablet running the Tesseras app. Participates in the DHT when the app is active.</td><td>No</td></tr>
-<tr><td><strong>Browser node</strong></td><td>Web browser running the WASM client. Connects via a relay node. Read-only.</td><td>No</td></tr>
-<tr><td><strong>IoT node</strong></td><td>ESP32 or similar device on the local network. Stores fragments passively, does not participate in the DHT.</td><td>Yes</td></tr>
-</tbody>
-</table>
-</div>
-<p>The full node daemon is the backbone of the network. The more full nodes running, the more resilient the network becomes.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="configuration.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="replication.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="configuration.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="replication.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/network-concepts.html.gz b/book/en/network-concepts.html.gz
deleted file mode 100644
index 75e5621..0000000
--- a/book/en/network-concepts.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/print.html b/book/en/print.html
deleted file mode 100644
index 8a6bb42..0000000
--- a/book/en/print.html
+++ /dev/null
@@ -1,1532 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Tesseras User Guide</title>
- <meta name="robots" content="noindex">
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="introduction"><a class="header" href="#introduction">Introduction</a></h1>
-<p>Tesseras is a peer-to-peer network for preserving human memories across millennia. Each person creates a <strong>tessera</strong> — a self-contained time capsule of memories (photos, audio, video, text) that survives independently of any software, company, or infrastructure.</p>
-<h2 id="what-is-a-tessera"><a class="header" href="#what-is-a-tessera">What is a tessera?</a></h2>
-<p>The word <em>tessera</em> comes from the small tiles used to make mosaics in the ancient world. In Tesseras, each tessera is a collection of memories packaged into a format designed to be understood even thousands of years from now, without any special software.</p>
-<p>A tessera contains:</p>
-<ul>
-<li><strong>Memories</strong> — photos (JPEG), audio recordings (WAV), video (WebM), and text (plain UTF-8)</li>
-<li><strong>Metadata</strong> — when and where each memory was created, who it involves, and what it means</li>
-<li><strong>Identity</strong> — cryptographic signatures proving who created it</li>
-<li><strong>Decoding instructions</strong> — plain-text explanations of every format used, so future humans can read the contents</li>
-</ul>
-<h2 id="core-philosophy"><a class="header" href="#core-philosophy">Core philosophy</a></h2>
-<ul>
-<li><strong>No company dependency</strong> — your memories are yours, stored locally and replicated across a peer-to-peer network</li>
-<li><strong>No format lock-in</strong> — every tessera includes instructions for decoding its contents</li>
-<li><strong>Availability over secrecy</strong> — public memories are not encrypted, because long-term accessibility matters more than hiding things</li>
-<li><strong>Minimal encryption</strong> — only private and sealed content is encrypted; everything else is open</li>
-<li><strong>Quantum-resistant</strong> — dual signatures (Ed25519 + ML-DSA) protect integrity even against future quantum computers</li>
-</ul>
-<h2 id="current-status-phase-4"><a class="header" href="#current-status-phase-4">Current status: Phase 4</a></h2>
-<p>Tesseras has completed through <strong>Phase 4</strong> — encryption and sealed tesseras. The project now covers local tessera management, networking, replication, a mobile app, and cryptographic privacy.</p>
-<p>What’s available today:</p>
-<ul>
-<li>Identity generation (Ed25519 keypair with proof-of-work)</li>
-<li>Tessera creation from local files</li>
-<li>Content-addressed storage (BLAKE3 hashing)</li>
-<li>Integrity verification and self-contained export</li>
-<li>Full node daemon with QUIC transport</li>
-<li>Peer discovery via Kademlia DHT</li>
-<li>Tessera pointer publishing and lookup across the network</li>
-<li>Reed-Solomon erasure coding with automatic fragment repair</li>
-<li>Flutter mobile app with embedded Rust P2P node</li>
-<li><strong>Private tesseras</strong> — encrypted content only the owner can access</li>
-<li><strong>Sealed tesseras</strong> — time-locked content that opens after a specific date</li>
-<li><strong>Hybrid post-quantum encryption</strong> — X25519 + ML-KEM-768 key encapsulation</li>
-<li><strong>AES-256-GCM</strong> content encryption with AAD binding</li>
-</ul>
-<h2 id="key-concepts"><a class="header" href="#key-concepts">Key concepts</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Concept</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Tessera</strong></td><td>A self-contained time capsule of memories</td></tr>
-<tr><td><strong>Memory</strong></td><td>A single item (photo, recording, video, or text) within a tessera</td></tr>
-<tr><td><strong>Content hash</strong></td><td>A BLAKE3 hash that uniquely identifies a tessera by its contents</td></tr>
-<tr><td><strong>Visibility</strong></td><td>Controls who can access a tessera: public, private, sealed, or circle</td></tr>
-<tr><td><strong>Sealed tessera</strong></td><td>A time capsule that can only be opened after a specific date</td></tr>
-<tr><td><strong>MANIFEST</strong></td><td>A plain-text index listing every file in the tessera with its checksum</td></tr>
-<tr><td><strong>Memory type</strong></td><td>Categorizes a memory: moment, reflection, daily, relation, or object</td></tr>
-<tr><td><strong>Node</strong></td><td>A device running the Tesseras daemon, participating in the P2P network</td></tr>
-<tr><td><strong>DHT</strong></td><td>Distributed hash table — how nodes find tessera pointers without a central server</td></tr>
-<tr><td><strong>Bootstrap</strong></td><td>The process of joining the network by contacting known seed nodes</td></tr>
-</tbody>
-</table>
-</div>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="installation"><a class="header" href="#installation">Installation</a></h1>
-<p>Tesseras is currently available by building from source.</p>
-<h2 id="prerequisites"><a class="header" href="#prerequisites">Prerequisites</a></h2>
-<h3 id="rust"><a class="header" href="#rust">Rust</a></h3>
-<p>Tesseras requires <strong>Rust 1.85 or higher</strong>. The recommended way to install Rust is via <a href="https://rustup.rs/">rustup</a>:</p>
-<pre><code class="language-bash">curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
-</code></pre>
-<p>After installation, make sure <code>~/.cargo/bin</code> is in your <code>PATH</code>. The installer usually adds it automatically. Verify with:</p>
-<pre><code class="language-bash">rustc --version
-cargo --version
-</code></pre>
-<p>If you already have Rust installed, update to the latest version:</p>
-<pre><code class="language-bash">rustup update stable
-</code></pre>
-<h3 id="sqlite"><a class="header" href="#sqlite">SQLite</a></h3>
-<p>Tesseras uses SQLite for local storage. You have two options:</p>
-<p><strong>Option 1: System SQLite (recommended)</strong></p>
-<p>Install SQLite development libraries via your system package manager:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Distribution</th><th>Command</th></tr>
-</thead>
-<tbody>
-<tr><td>Arch Linux</td><td><code>sudo pacman -S sqlite</code></td></tr>
-<tr><td>Debian / Ubuntu</td><td><code>sudo apt install libsqlite3-dev</code></td></tr>
-<tr><td>Fedora</td><td><code>sudo dnf install sqlite-devel</code></td></tr>
-<tr><td>Alpine</td><td><code>apk add sqlite-dev</code></td></tr>
-<tr><td>macOS (Homebrew)</td><td><code>brew install sqlite</code></td></tr>
-<tr><td>FreeBSD</td><td><code>pkg install sqlite3</code></td></tr>
-<tr><td>OpenBSD</td><td>Included in the base system</td></tr>
-</tbody>
-</table>
-</div>
-<p><strong>Option 2: Bundled SQLite</strong></p>
-<p>If you prefer not to install SQLite on your system, use the <code>bundled-sqlite</code> feature flag during compilation. This compiles SQLite alongside Tesseras:</p>
-<pre><code class="language-bash">cargo install --path crates/tesseras-cli --features bundled-sqlite
-cargo install --path crates/tesseras-daemon --features bundled-sqlite
-</code></pre>
-<h3 id="optional-tools"><a class="header" href="#optional-tools">Optional tools</a></h3>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Tool</th><th>Purpose</th><th>Installation</th></tr>
-</thead>
-<tbody>
-<tr><td><a href="https://github.com/casey/just">just</a></td><td>Run project build commands</td><td><code>cargo install just</code></td></tr>
-<tr><td><a href="https://rust-lang.github.io/mdBook/">mdBook</a></td><td>Build the documentation</td><td><code>cargo install mdbook</code></td></tr>
-<tr><td><a href="https://docs.docker.com/get-docker/">Docker</a></td><td>Run nodes in containers</td><td>See <a href="#docker">Docker</a></td></tr>
-<tr><td><a href="https://flutter.dev/docs/get-started/install">Flutter</a></td><td>Build the mobile/desktop app</td><td>See <a href="#flutter-app">Flutter App</a></td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="build-from-source"><a class="header" href="#build-from-source">Build from source</a></h2>
-<p>Clone the repository and install the binaries:</p>
-<pre><code class="language-bash">git clone https://git.sr.ht/~ijanc/tesseras
-cd tesseras
-cargo install --path crates/tesseras-cli
-cargo install --path crates/tesseras-daemon
-</code></pre>
-<p>Or, if you have <code>just</code> installed:</p>
-<pre><code class="language-bash">just install
-</code></pre>
-<p>This installs two binaries to <code>~/.cargo/bin/</code> and configures shell auto-completions:</p>
-<ul>
-<li><code>tes</code> — CLI tool for creating, verifying, and exporting tesseras</li>
-<li><code>tesseras-daemon</code> — full node daemon that participates in the P2P network</li>
-</ul>
-<h2 id="verify-installation"><a class="header" href="#verify-installation">Verify installation</a></h2>
-<pre><code class="language-bash">tes --help
-</code></pre>
-<p>You should see:</p>
-<pre><code>Create and preserve human memories
-
-Usage: tes [OPTIONS] &lt;COMMAND&gt;
-
-Commands:
- init Initialize identity and local database
- create Create a tessera from a directory of files
- verify Verify integrity of a stored tessera
- export Export tessera to a self-contained directory
- list List local tesseras
- help Print this message or the help of the given subcommand(s)
-
-Options:
- --data-dir &lt;DATA_DIR&gt; Base directory for data storage [default: ~/.tesseras]
- -h, --help Print help
-</code></pre>
-<h2 id="shell-completions"><a class="header" href="#shell-completions">Shell completions</a></h2>
-<p>The <code>just install</code> command configures completions automatically. If you installed manually, generate completions for your shell:</p>
-<pre><code class="language-bash"># Fish
-tes completions fish &gt; ~/.config/fish/completions/tes.fish
-
-# Zsh
-tes completions zsh &gt; "${XDG_DATA_HOME:-$HOME/.local/share}/zsh/site-functions/_tes"
-
-# Bash
-tes completions bash &gt; "${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion/completions/tes"
-</code></pre>
-<h2 id="flutter-app"><a class="header" href="#flutter-app">Flutter App</a></h2>
-<p>To build the mobile or desktop app, you need additional dependencies:</p>
-<h3 id="flutter-prerequisites"><a class="header" href="#flutter-prerequisites">Flutter prerequisites</a></h3>
-<ol>
-<li><strong>Flutter SDK</strong> — install following the <a href="https://flutter.dev/docs/get-started/install">official guide</a></li>
-<li><strong>Rust</strong> — already installed as above</li>
-<li><strong>Platform dependencies:</strong></li>
-</ol>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Platform</th><th>Dependencies</th></tr>
-</thead>
-<tbody>
-<tr><td>Android</td><td>Android SDK, Android NDK, Java 17+</td></tr>
-<tr><td>iOS</td><td>Xcode, CocoaPods</td></tr>
-<tr><td>Linux desktop</td><td>GTK 3.0+, pkg-config (<code>sudo apt install libgtk-3-dev pkg-config</code> on Debian/Ubuntu)</td></tr>
-<tr><td>macOS desktop</td><td>Xcode Command Line Tools</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="build-the-app"><a class="header" href="#build-the-app">Build the app</a></h3>
-<pre><code class="language-bash">cd apps/flutter
-flutter pub get
-
-# Linux desktop
-flutter build linux --debug
-
-# Android
-flutter build apk --debug
-
-# iOS
-flutter build ios --debug
-
-# Tests
-flutter test
-</code></pre>
-<p>Or using <code>just</code> from the repository root:</p>
-<pre><code class="language-bash">just build-linux # Linux desktop
-just build-android # Android APK
-just test-flutter # Tests
-</code></pre>
-<h2 id="network-ports"><a class="header" href="#network-ports">Network ports</a></h2>
-<p>The Tesseras daemon uses QUIC (protocol over UDP). If you are behind a firewall, allow traffic on the port:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Protocol</th><th>Port</th><th>Direction</th></tr>
-</thead>
-<tbody>
-<tr><td>UDP</td><td>4433</td><td>Inbound and outbound</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="next-steps"><a class="header" href="#next-steps">Next steps</a></h2>
-<ul>
-<li><a href="#quick-start">Quick Start</a> — create your first tessera</li>
-<li><a href="#running-a-node">Running a Node</a> — configure and run the daemon</li>
-<li><a href="#configuration">Configuration</a> — configuration options</li>
-<li><a href="#docker">Docker</a> — run in containers</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="quick-start"><a class="header" href="#quick-start">Quick Start</a></h1>
-<p>This tutorial walks you through a complete workflow: creating an identity, building a tessera from files, verifying it, and exporting it.</p>
-<h2 id="1-initialize-your-identity"><a class="header" href="#1-initialize-your-identity">1. Initialize your identity</a></h2>
-<p>First, set up your local identity and database:</p>
-<pre><code class="language-bash">tes init
-</code></pre>
-<pre><code>Generated Ed25519 identity
-Database initialized
-Config written to /home/user/.tesseras/config.toml
-Tesseras initialized at /home/user/.tesseras
-</code></pre>
-<p>This creates:</p>
-<ul>
-<li><code>~/.tesseras/identity/</code> — your Ed25519 keypair</li>
-<li><code>~/.tesseras/db/</code> — SQLite database for indexing</li>
-<li><code>~/.tesseras/blobs/</code> — storage for memory files</li>
-<li><code>~/.tesseras/config.toml</code> — configuration file</li>
-</ul>
-<h2 id="2-prepare-your-files"><a class="header" href="#2-prepare-your-files">2. Prepare your files</a></h2>
-<p>Create a directory with the memories you want to preserve:</p>
-<pre><code class="language-bash">mkdir my-memories
-cp ~/photos/family-dinner.jpg my-memories/
-cp ~/photos/garden.jpg my-memories/
-echo "A warm Sunday afternoon with the family." &gt; my-memories/reflection.txt
-</code></pre>
-<p>Supported formats: <code>.jpg</code>, <code>.jpeg</code>, <code>.png</code> (images), <code>.wav</code> (audio), <code>.webm</code> (video), <code>.txt</code> (text).</p>
-<h2 id="3-preview-with-dry-run"><a class="header" href="#3-preview-with-dry-run">3. Preview with dry run</a></h2>
-<p>See what would be included without creating anything:</p>
-<pre><code class="language-bash">tes create my-memories --dry-run
-</code></pre>
-<h2 id="4-create-a-tessera"><a class="header" href="#4-create-a-tessera">4. Create a tessera</a></h2>
-<pre><code class="language-bash">tes create my-memories --tags "family,sunday" --location "Home"
-</code></pre>
-<p>The output includes the content hash — a 64-character hex string that uniquely identifies your tessera. Copy it for the next steps.</p>
-<h2 id="5-list-your-tesseras"><a class="header" href="#5-list-your-tesseras">5. List your tesseras</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>Hash Created Memories Size Visibility
-9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public
-</code></pre>
-<h2 id="6-verify-integrity"><a class="header" href="#6-verify-integrity">6. Verify integrity</a></h2>
-<p>Use the content hash to verify that all files are intact and the signature is valid:</p>
-<pre><code class="language-bash">tes verify 9f2c4a1b3e7d8f0c...
-</code></pre>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0c...
-Signature: VALID
- [OK] memories/a1b2c3/media.jpg
- [OK] memories/d4e5f6/media.jpg
- [OK] memories/g7h8i9/media.txt
-Verification: PASSED
-</code></pre>
-<h2 id="7-export-a-self-contained-copy"><a class="header" href="#7-export-a-self-contained-copy">7. Export a self-contained copy</a></h2>
-<p>Export the tessera to a directory that can be read without Tesseras:</p>
-<pre><code class="language-bash">tes export 9f2c4a1b3e7d8f0c... ./backup
-</code></pre>
-<pre><code>Exported to ./backup/tessera-9f2c4a1b3e7d8f0c...
-</code></pre>
-<h2 id="8-inspect-the-export"><a class="header" href="#8-inspect-the-export">8. Inspect the export</a></h2>
-<p>The exported directory is fully self-contained:</p>
-<pre><code>tessera-9f2c4a1b3e7d8f0c.../
-├── MANIFEST # Plain text index with checksums
-├── README.decode # How to read this tessera without software
-├── identity/
-│ ├── creator.pub.ed25519 # Your public key
-│ └── signature.ed25519.sig # Signature of the MANIFEST
-├── memories/
-│ ├── &lt;hash&gt;/
-│ │ ├── media.jpg # The photo
-│ │ ├── context.txt # Description in plain text
-│ │ └── meta.json # Structured metadata
-│ └── .../
-└── decode/
- ├── formats.txt # Explanation of all formats used
- ├── jpeg.txt # How to decode JPEG
- └── json.txt # How to decode JSON
-</code></pre>
-<p>Everything a future reader needs to understand the contents is included in the directory itself — no Tesseras software required.</p>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="tes-init"><a class="header" href="#tes-init">tes init</a></h1>
-<p>Initialize identity and local database.</p>
-<h2 id="usage"><a class="header" href="#usage">Usage</a></h2>
-<pre><code class="language-bash">tes init
-</code></pre>
-<h2 id="description"><a class="header" href="#description">Description</a></h2>
-<p>Sets up your local Tesseras environment. This is the first command you should run after installing Tesseras.</p>
-<p>The command creates:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Path</th><th>Contents</th></tr>
-</thead>
-<tbody>
-<tr><td><code>~/.tesseras/identity/</code></td><td>Ed25519 keypair for signing tesseras</td></tr>
-<tr><td><code>~/.tesseras/db/</code></td><td>SQLite database for indexing</td></tr>
-<tr><td><code>~/.tesseras/blobs/</code></td><td>Blob storage for memory files</td></tr>
-<tr><td><code>~/.tesseras/config.toml</code></td><td>Configuration file</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="options"><a class="header" href="#options">Options</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;PATH&gt;</code></td><td>Base directory for data storage (default: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="idempotent"><a class="header" href="#idempotent">Idempotent</a></h2>
-<p>Running <code>init</code> again is safe. If an identity already exists, it is preserved:</p>
-<pre><code class="language-bash">tes init
-</code></pre>
-<pre><code>Ed25519 identity already exists
-Database initialized
-Tesseras initialized at /home/user/.tesseras
-</code></pre>
-<h2 id="custom-data-directory"><a class="header" href="#custom-data-directory">Custom data directory</a></h2>
-<pre><code class="language-bash">tes --data-dir /mnt/usb/tesseras init
-</code></pre>
-<p>This creates the full directory structure under <code>/mnt/usb/tesseras/</code> instead of the default location.</p>
-<h2 id="what-happens-under-the-hood"><a class="header" href="#what-happens-under-the-hood">What happens under the hood</a></h2>
-<ol>
-<li>Creates the directory structure (<code>identity/</code>, <code>db/</code>, <code>blobs/</code>)</li>
-<li>Generates an Ed25519 keypair (private key stays local, public key identifies you)</li>
-<li>Runs SQLite migrations to set up the database schema</li>
-<li>Writes a default <code>config.toml</code></li>
-</ol>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="tes-create"><a class="header" href="#tes-create">tes create</a></h1>
-<p>Create a tessera from a directory of files.</p>
-<h2 id="usage-1"><a class="header" href="#usage-1">Usage</a></h2>
-<pre><code class="language-bash">tes create &lt;PATH&gt; [OPTIONS]
-</code></pre>
-<h2 id="arguments"><a class="header" href="#arguments">Arguments</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argument</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;PATH&gt;</code></td><td>Directory containing files to include</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="options-1"><a class="header" href="#options-1">Options</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th><th>Default</th></tr>
-</thead>
-<tbody>
-<tr><td><code>-n, --non-interactive</code></td><td>Skip prompts</td><td>off</td></tr>
-<tr><td><code>--dry-run</code></td><td>Preview what would be included</td><td>off</td></tr>
-<tr><td><code>--visibility &lt;VALUE&gt;</code></td><td>Visibility level: <code>public</code>, <code>private</code>, <code>circle</code></td><td><code>public</code></td></tr>
-<tr><td><code>--language &lt;CODE&gt;</code></td><td>Language code (e.g., <code>en</code>, <code>pt-BR</code>)</td><td><code>en</code></td></tr>
-<tr><td><code>--tags &lt;LIST&gt;</code></td><td>Comma-separated tags</td><td>none</td></tr>
-<tr><td><code>--location &lt;DESC&gt;</code></td><td>Location description</td><td>none</td></tr>
-<tr><td><code>--data-dir &lt;PATH&gt;</code></td><td>Base directory for data storage</td><td><code>~/.tesseras</code></td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="supported-file-formats"><a class="header" href="#supported-file-formats">Supported file formats</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Extension</th><th>Type</th><th>Memory type</th></tr>
-</thead>
-<tbody>
-<tr><td><code>.jpg</code>, <code>.jpeg</code></td><td>Image (JPEG)</td><td>Moment</td></tr>
-<tr><td><code>.png</code></td><td>Image (PNG)</td><td>Moment</td></tr>
-<tr><td><code>.wav</code></td><td>Audio (WAV PCM)</td><td>Moment</td></tr>
-<tr><td><code>.webm</code></td><td>Video (WebM)</td><td>Moment</td></tr>
-<tr><td><code>.txt</code></td><td>Plain text (UTF-8)</td><td>Reflection</td></tr>
-</tbody>
-</table>
-</div>
-<p>Files with other extensions are ignored.</p>
-<h2 id="memory-type-inference"><a class="header" href="#memory-type-inference">Memory type inference</a></h2>
-<p>The command automatically assigns a memory type based on the file format:</p>
-<ul>
-<li><strong>Text files</strong> (<code>.txt</code>) are classified as <strong>Reflection</strong> — thoughts, beliefs, or opinions</li>
-<li><strong>All other formats</strong> are classified as <strong>Moment</strong> — a photo, recording, or video of something happening</li>
-</ul>
-<h2 id="examples"><a class="header" href="#examples">Examples</a></h2>
-<h3 id="preview-before-creating"><a class="header" href="#preview-before-creating">Preview before creating</a></h3>
-<pre><code class="language-bash">tes create ./my-photos --dry-run
-</code></pre>
-<h3 id="create-with-metadata"><a class="header" href="#create-with-metadata">Create with metadata</a></h3>
-<pre><code class="language-bash">tes create ./vacation-2026 \
- --tags "vacation,summer,beach" \
- --location "Florianópolis, Brazil" \
- --language pt-BR \
- --visibility public
-</code></pre>
-<h3 id="non-interactive-mode"><a class="header" href="#non-interactive-mode">Non-interactive mode</a></h3>
-<pre><code class="language-bash">tes create ./daily-log --non-interactive --tags "daily"
-</code></pre>
-<h2 id="visibility-levels"><a class="header" href="#visibility-levels">Visibility levels</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Level</th><th>Who can access</th></tr>
-</thead>
-<tbody>
-<tr><td><code>public</code></td><td>Anyone (default)</td></tr>
-<tr><td><code>private</code></td><td>Only you (and designated heirs)</td></tr>
-<tr><td><code>circle</code></td><td>Explicitly chosen people</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="what-happens-under-the-hood-1"><a class="header" href="#what-happens-under-the-hood-1">What happens under the hood</a></h2>
-<ol>
-<li>Scans the directory for supported files</li>
-<li>Computes a BLAKE3 hash for each file</li>
-<li>Assigns a memory type based on file extension</li>
-<li>Generates a MANIFEST listing all files with their checksums</li>
-<li>Signs the MANIFEST with your Ed25519 private key</li>
-<li>Stores the files and metadata in the local database</li>
-<li>Outputs the content hash that uniquely identifies this tessera</li>
-</ol>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="tes-verify"><a class="header" href="#tes-verify">tes verify</a></h1>
-<p>Verify integrity of a stored tessera.</p>
-<h2 id="usage-2"><a class="header" href="#usage-2">Usage</a></h2>
-<pre><code class="language-bash">tes verify &lt;HASH&gt;
-</code></pre>
-<h2 id="arguments-1"><a class="header" href="#arguments-1">Arguments</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argument</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;HASH&gt;</code></td><td>Tessera content hash (64 hex characters)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="options-2"><a class="header" href="#options-2">Options</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;PATH&gt;</code></td><td>Base directory for data storage (default: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="what-it-checks"><a class="header" href="#what-it-checks">What it checks</a></h2>
-<ol>
-<li><strong>Signature validity</strong> — verifies the Ed25519 signature over the MANIFEST</li>
-<li><strong>File integrity</strong> — recomputes the BLAKE3 hash of every file and compares it against the MANIFEST</li>
-</ol>
-<h2 id="exit-codes"><a class="header" href="#exit-codes">Exit codes</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Code</th><th>Meaning</th></tr>
-</thead>
-<tbody>
-<tr><td><code>0</code></td><td>Verification passed — all files intact, signature valid</td></tr>
-<tr><td><code>1</code></td><td>Verification failed — corrupted files or invalid signature</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="examples-1"><a class="header" href="#examples-1">Examples</a></h2>
-<h3 id="successful-verification"><a class="header" href="#successful-verification">Successful verification</a></h3>
-<pre><code class="language-bash">tes verify 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-</code></pre>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-Signature: VALID
- [OK] memories/a1b2c3d4/media.jpg
- [OK] memories/e5f6a7b8/media.txt
- [OK] memories/c9d0e1f2/media.wav
-Verification: PASSED
-</code></pre>
-<h3 id="failed-verification"><a class="header" href="#failed-verification">Failed verification</a></h3>
-<p>If a file has been modified or corrupted:</p>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-Signature: VALID
- [OK] memories/a1b2c3d4/media.jpg
- [FAILED] memories/e5f6a7b8/media.txt
- [OK] memories/c9d0e1f2/media.wav
-Verification: FAILED
-</code></pre>
-<h2 id="use-cases"><a class="header" href="#use-cases">Use cases</a></h2>
-<ul>
-<li><strong>Routine integrity checks</strong> — periodically verify that your stored tesseras haven’t been corrupted</li>
-<li><strong>After transfer</strong> — verify after copying tesseras to a new device or storage medium</li>
-<li><strong>Trust verification</strong> — confirm that a tessera received from someone else hasn’t been tampered with</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="tes-export"><a class="header" href="#tes-export">tes export</a></h1>
-<p>Export a tessera as a self-contained directory.</p>
-<h2 id="usage-3"><a class="header" href="#usage-3">Usage</a></h2>
-<pre><code class="language-bash">tes export &lt;HASH&gt; &lt;DEST&gt;
-</code></pre>
-<h2 id="arguments-2"><a class="header" href="#arguments-2">Arguments</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argument</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;HASH&gt;</code></td><td>Tessera content hash (64 hex characters)</td></tr>
-<tr><td><code>&lt;DEST&gt;</code></td><td>Destination directory</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="options-3"><a class="header" href="#options-3">Options</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;PATH&gt;</code></td><td>Base directory for data storage (default: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="output-structure"><a class="header" href="#output-structure">Output structure</a></h2>
-<p>The export creates a directory named <code>tessera-&lt;hash&gt;</code> inside the destination:</p>
-<pre><code>tessera-9f2c4a1b.../
-├── MANIFEST # Plain text index with checksums
-├── README.decode # Human-readable decoding instructions
-├── identity/
-│ ├── creator.pub.ed25519 # Creator's public key
-│ └── signature.ed25519.sig # Signature of the MANIFEST
-├── memories/
-│ ├── &lt;content-hash&gt;/
-│ │ ├── media.jpg # Primary media file
-│ │ ├── context.txt # Human context in plain UTF-8
-│ │ └── meta.json # Structured metadata
-│ └── .../
-├── schema/
-│ └── v1.json # JSON schema for metadata validation
-└── decode/
- ├── formats.txt # Explanation of all formats used
- ├── jpeg.txt # How to decode JPEG
- ├── wav.txt # How to decode WAV
- └── json.txt # How to decode JSON
-</code></pre>
-<h2 id="example"><a class="header" href="#example">Example</a></h2>
-<pre><code class="language-bash">tes export 9f2c4a1b3e7d8f0cabc123def4567890... ./backup
-</code></pre>
-<pre><code>Exported to ./backup/tessera-9f2c4a1b3e7d8f0cabc123def4567890...
-</code></pre>
-<h2 id="key-feature-self-contained"><a class="header" href="#key-feature-self-contained">Key feature: self-contained</a></h2>
-<p>The exported directory is designed to be readable <strong>without Tesseras software</strong>. It includes:</p>
-<ul>
-<li><strong>MANIFEST</strong> — a plain-text file listing every file with its BLAKE3 checksum, readable by any text editor</li>
-<li><strong>README.decode</strong> — human-readable instructions for understanding the contents</li>
-<li><strong>decode/</strong> — detailed explanations of every file format used (JPEG, WAV, JSON, UTF-8)</li>
-</ul>
-<p>This means someone thousands of years from now, with no knowledge of Tesseras, can still understand and access the memories.</p>
-<h2 id="use-cases-1"><a class="header" href="#use-cases-1">Use cases</a></h2>
-<ul>
-<li><strong>Backup</strong> — export to an external drive, USB stick, or cloud storage</li>
-<li><strong>Sharing</strong> — give someone a complete copy of a tessera</li>
-<li><strong>Archival</strong> — store on write-once media (DVD, Blu-ray, tape)</li>
-<li><strong>Migration</strong> — move tesseras between machines without needing the database</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="tes-list"><a class="header" href="#tes-list">tes list</a></h1>
-<p>List all local tesseras.</p>
-<h2 id="usage-4"><a class="header" href="#usage-4">Usage</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<h2 id="options-4"><a class="header" href="#options-4">Options</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;PATH&gt;</code></td><td>Base directory for data storage (default: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="output"><a class="header" href="#output">Output</a></h2>
-<p>Displays a table with the following columns:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Column</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Hash</strong></td><td>First 16 characters of the content hash</td></tr>
-<tr><td><strong>Created</strong></td><td>Creation date (YYYY-MM-DD)</td></tr>
-<tr><td><strong>Memories</strong></td><td>Number of memories in the tessera</td></tr>
-<tr><td><strong>Size</strong></td><td>Total size (B, KB, MB, or GB)</td></tr>
-<tr><td><strong>Visibility</strong></td><td>Visibility level (public, private, or circle)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="example-1"><a class="header" href="#example-1">Example</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>Hash Created Memories Size Visibility
-9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public
-a3b7c2d9e4f01823 2026-02-10 1 12 KB private
-f8e7d6c5b4a39201 2026-01-28 12 4 MB public
-</code></pre>
-<h2 id="empty-database"><a class="header" href="#empty-database">Empty database</a></h2>
-<p>If no tesseras have been created yet:</p>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>No tesseras found.
-</code></pre>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="running-a-node"><a class="header" href="#running-a-node">Running a Node</a></h1>
-<p>The <code>tesseras-daemon</code> binary runs a full Tesseras node that participates in the peer-to-peer network. It listens for connections over QUIC, joins the distributed hash table (DHT), and enables other nodes to discover and find tessera pointers.</p>
-<h2 id="starting-the-daemon"><a class="header" href="#starting-the-daemon">Starting the daemon</a></h2>
-<pre><code class="language-bash">tesseras-daemon
-</code></pre>
-<p>On first run, the daemon:</p>
-<ol>
-<li>Creates the data directory (<code>~/.local/share/tesseras</code> on Linux, <code>~/Library/Application Support/tesseras</code> on macOS)</li>
-<li>Generates a node identity with proof-of-work (takes about 1 second)</li>
-<li>Binds a QUIC listener on <code>0.0.0.0:4433</code></li>
-<li>Bootstraps into the network by contacting seed nodes</li>
-<li>Prints <code>daemon ready</code> when fully operational</li>
-</ol>
-<h2 id="command-line-options"><a class="header" href="#command-line-options">Command-line options</a></h2>
-<pre><code>tesseras-daemon [OPTIONS]
-</code></pre>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th><th>Default</th></tr>
-</thead>
-<tbody>
-<tr><td><code>-c, --config &lt;PATH&gt;</code></td><td>Path to a TOML config file</td><td>None (uses built-in defaults)</td></tr>
-<tr><td><code>-l, --listen &lt;ADDR&gt;</code></td><td>Address and port to listen on</td><td><code>0.0.0.0:4433</code></td></tr>
-<tr><td><code>-b, --bootstrap &lt;ADDRS&gt;</code></td><td>Comma-separated bootstrap addresses</td><td><code>boot1.tesseras.net:4433,boot2.tesseras.net:4433</code></td></tr>
-<tr><td><code>-d, --data-dir &lt;PATH&gt;</code></td><td>Data directory</td><td>Platform-specific (see above)</td></tr>
-</tbody>
-</table>
-</div>
-<p>CLI options override values from the config file.</p>
-<h2 id="examples-2"><a class="header" href="#examples-2">Examples</a></h2>
-<p>Run with defaults (join the public network):</p>
-<pre><code class="language-bash">tesseras-daemon
-</code></pre>
-<p>Run as a seed node (no bootstrap, other nodes connect to you):</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap ""
-</code></pre>
-<p>Run on a custom port with a specific data directory:</p>
-<pre><code class="language-bash">tesseras-daemon --listen 0.0.0.0:5000 --data-dir /var/lib/tesseras
-</code></pre>
-<p>Bootstrap from a specific node:</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap "192.168.1.50:4433"
-</code></pre>
-<p>Join a local network of multiple nodes:</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap "192.168.1.10:4433,192.168.1.11:4433"
-</code></pre>
-<h2 id="node-identity"><a class="header" href="#node-identity">Node identity</a></h2>
-<p>Each node has a unique identity stored in <code>&lt;data-dir&gt;/identity.key</code>. This file contains a 32-byte public key and an 8-byte proof-of-work nonce.</p>
-<p>The node ID is derived from the public key: <code>BLAKE3(pubkey || nonce)</code> truncated to 20 bytes. The nonce must produce a hash with 8 leading zero bits, which takes about 256 hash attempts. This lightweight proof-of-work makes creating thousands of fake identities expensive while costing legitimate users less than a second.</p>
-<p>The identity is generated automatically on first run and reused on subsequent runs. If you delete <code>identity.key</code>, a new identity will be generated.</p>
-<h2 id="logging"><a class="header" href="#logging">Logging</a></h2>
-<p>The daemon uses structured logging via <code>tracing</code>. Control the log level with the <code>RUST_LOG</code> environment variable:</p>
-<pre><code class="language-bash"># Default (info level)
-tesseras-daemon
-
-# Debug logging
-RUST_LOG=debug tesseras-daemon
-
-# Only show warnings and errors
-RUST_LOG=warn tesseras-daemon
-
-# Debug for DHT, info for everything else
-RUST_LOG=info,tesseras_dht=debug tesseras-daemon
-</code></pre>
-<h2 id="shutting-down"><a class="header" href="#shutting-down">Shutting down</a></h2>
-<p>Press <strong>Ctrl+C</strong> to initiate graceful shutdown. The daemon will:</p>
-<ol>
-<li>Stop accepting new connections</li>
-<li>Finish in-flight operations (up to 5 seconds)</li>
-<li>Close all QUIC connections</li>
-<li>Exit cleanly</li>
-</ol>
-<h2 id="firewall"><a class="header" href="#firewall">Firewall</a></h2>
-<p>The daemon communicates over UDP port 4433 (QUIC). If you’re behind a firewall, ensure this port is open for both inbound and outbound UDP traffic.</p>
-<pre><code class="language-bash"># Example: Linux with ufw
-sudo ufw allow 4433/udp
-</code></pre>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="configuration"><a class="header" href="#configuration">Configuration</a></h1>
-<p>The daemon can be configured via a TOML file. Pass the path with <code>--config</code>:</p>
-<pre><code class="language-bash">tesseras-daemon --config /etc/tesseras/config.toml
-</code></pre>
-<p>If no config file is given, the daemon uses sensible defaults. CLI options (<code>--listen</code>, <code>--bootstrap</code>, <code>--data-dir</code>) override the corresponding config values.</p>
-<h2 id="full-example"><a class="header" href="#full-example">Full example</a></h2>
-<pre><code class="language-toml">[node]
-data_dir = "~/.local/share/tesseras"
-listen_addr = "0.0.0.0:4433"
-
-[dht]
-k = 20
-alpha = 3
-bucket_refresh_interval_secs = 3600
-republish_interval_secs = 3600
-pointer_ttl_secs = 86400
-max_stored_pointers = 100000
-ping_failure_threshold = 3
-
-[bootstrap]
-dns_domain = "_tesseras._udp.tesseras.net"
-hardcoded = [
- "boot1.tesseras.net:4433",
- "boot2.tesseras.net:4433",
-]
-
-[network]
-enable_mdns = true
-
-[observability]
-metrics_addr = "127.0.0.1:9190"
-log_format = "json"
-</code></pre>
-<h2 id="sections"><a class="header" href="#sections">Sections</a></h2>
-<h3 id="node"><a class="header" href="#node"><code>[node]</code></a></h3>
-<p>Basic node settings.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key</th><th>Type</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>data_dir</code></td><td>path</td><td>Platform-specific</td><td>Where to store identity, database, and blobs</td></tr>
-<tr><td><code>listen_addr</code></td><td>address</td><td><code>0.0.0.0:4433</code></td><td>QUIC listener address</td></tr>
-</tbody>
-</table>
-</div>
-<p>The default <code>data_dir</code> is <code>~/.local/share/tesseras</code> on Linux and <code>~/Library/Application Support/tesseras</code> on macOS.</p>
-<h3 id="dht"><a class="header" href="#dht"><code>[dht]</code></a></h3>
-<p>Kademlia DHT tuning parameters. The defaults work well for most deployments.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key</th><th>Type</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>k</code></td><td>integer</td><td><code>20</code></td><td>Maximum entries per routing table bucket</td></tr>
-<tr><td><code>alpha</code></td><td>integer</td><td><code>3</code></td><td>Parallelism for iterative lookups</td></tr>
-<tr><td><code>bucket_refresh_interval_secs</code></td><td>integer</td><td><code>3600</code></td><td>How often to refresh routing table buckets (seconds)</td></tr>
-<tr><td><code>republish_interval_secs</code></td><td>integer</td><td><code>3600</code></td><td>How often to republish stored pointers (seconds)</td></tr>
-<tr><td><code>pointer_ttl_secs</code></td><td>integer</td><td><code>86400</code></td><td>How long to keep a pointer before it expires (seconds)</td></tr>
-<tr><td><code>max_stored_pointers</code></td><td>integer</td><td><code>100000</code></td><td>Maximum number of pointers to store locally</td></tr>
-<tr><td><code>ping_failure_threshold</code></td><td>integer</td><td><code>3</code></td><td>How many consecutive ping failures before removing a peer</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="bootstrap"><a class="header" href="#bootstrap"><code>[bootstrap]</code></a></h3>
-<p>How the node discovers its first peers when joining the network.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key</th><th>Type</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>dns_domain</code></td><td>string</td><td><code>_tesseras._udp.tesseras.net</code></td><td>DNS domain for TXT-record-based peer discovery</td></tr>
-<tr><td><code>hardcoded</code></td><td>list of strings</td><td><code>["boot1.tesseras.net:4433", "boot2.tesseras.net:4433"]</code></td><td>Fallback bootstrap addresses</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="network"><a class="header" href="#network"><code>[network]</code></a></h3>
-<p>Network-level features.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key</th><th>Type</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>enable_mdns</code></td><td>boolean</td><td><code>true</code></td><td>Enable local network discovery via mDNS</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="observability"><a class="header" href="#observability"><code>[observability]</code></a></h3>
-<p>Monitoring and logging.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key</th><th>Type</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td><code>metrics_addr</code></td><td>address</td><td><code>127.0.0.1:9190</code></td><td>Address for the Prometheus metrics endpoint</td></tr>
-<tr><td><code>log_format</code></td><td>string</td><td><code>json</code></td><td>Log output format (<code>json</code> or <code>text</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="ipv6-support"><a class="header" href="#ipv6-support">IPv6 Support</a></h2>
-<p>Tesseras supports IPv6 natively. The <code>listen_addr</code> and <code>listen_addrs</code> fields accept both IPv4 and IPv6 addresses.</p>
-<h3 id="listening-on-ipv6"><a class="header" href="#listening-on-ipv6">Listening on IPv6</a></h3>
-<p>To listen on all IPv6 interfaces:</p>
-<pre><code class="language-toml">[node]
-listen_addr = "[::]:4433"
-</code></pre>
-<p>On Linux and most BSDs, binding to <code>[::]</code> also accepts IPv4 connections (dual-stack) by default. On some systems (notably OpenBSD), <code>[::]</code> is IPv6-only due to <code>IPV6_V6ONLY</code> being enabled by default. To guarantee both IPv4 and IPv6 on all platforms, use <code>listen_addrs</code> with explicit addresses:</p>
-<pre><code class="language-toml">[node]
-listen_addrs = ["0.0.0.0:4433", "[::]:4433"]
-</code></pre>
-<p>For IPv6 loopback only (testing):</p>
-<pre><code class="language-toml">[node]
-listen_addr = "[::1]:4433"
-</code></pre>
-<h3 id="bootstrap-with-ipv6"><a class="header" href="#bootstrap-with-ipv6">Bootstrap with IPv6</a></h3>
-<p>Bootstrap addresses can be IPv6:</p>
-<pre><code class="language-toml">[bootstrap]
-hardcoded = [
- "boot1.tesseras.net:4433",
- "[2001:db8::1]:4433",
-]
-</code></pre>
-<p>DNS hostnames with both A and AAAA records are resolved to all addresses, so the daemon will connect over whichever protocol is reachable.</p>
-<h3 id="ipv6_v6only-behavior-by-os"><a class="header" href="#ipv6_v6only-behavior-by-os"><code>IPV6_V6ONLY</code> behavior by OS</a></h3>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>OS</th><th><code>[::]</code> accepts IPv4?</th><th>Notes</th></tr>
-</thead>
-<tbody>
-<tr><td>Linux</td><td>Yes (dual-stack)</td><td><code>IPV6_V6ONLY</code> defaults to 0</td></tr>
-<tr><td>macOS</td><td>Yes (dual-stack)</td><td><code>IPV6_V6ONLY</code> defaults to 0</td></tr>
-<tr><td>FreeBSD</td><td>Yes (dual-stack)</td><td><code>IPV6_V6ONLY</code> defaults to 0</td></tr>
-<tr><td>OpenBSD</td><td>No (IPv6-only)</td><td><code>IPV6_V6ONLY</code> always 1</td></tr>
-<tr><td>Windows</td><td>Yes (dual-stack)</td><td><code>IPV6_V6ONLY</code> defaults to 0</td></tr>
-</tbody>
-</table>
-</div>
-<p>If you need explicit control, use <code>listen_addrs</code> with both an IPv4 and IPv6 address.</p>
-<h2 id="minimal-config"><a class="header" href="#minimal-config">Minimal config</a></h2>
-<p>Most users don’t need a config file at all. If you do, a minimal config overriding only what you need is enough:</p>
-<pre><code class="language-toml">[node]
-listen_addr = "0.0.0.0:5000"
-
-[bootstrap]
-hardcoded = ["192.168.1.10:4433"]
-</code></pre>
-<p>All other values use their defaults.</p>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="network-concepts"><a class="header" href="#network-concepts">Network Concepts</a></h1>
-<p>This chapter explains how Tesseras nodes find each other and locate tessera pointers on the network. You don’t need to understand these details to use Tesseras, but they help explain what the daemon is doing in the background.</p>
-<h2 id="how-nodes-find-each-other"><a class="header" href="#how-nodes-find-each-other">How nodes find each other</a></h2>
-<p>Tesseras uses a <strong>Kademlia distributed hash table (DHT)</strong> — a proven algorithm used by BitTorrent and other P2P systems for over 20 years. There is no central server. Each node maintains a routing table of peers it knows about, and nodes cooperate to route queries to the right place.</p>
-<p>When your node starts, it contacts one or more <strong>bootstrap nodes</strong> (seed nodes with known addresses). Through these initial connections, your node discovers other peers and builds up its routing table. Over time, your node naturally learns about more peers as it participates in the network.</p>
-<h2 id="what-the-dht-stores"><a class="header" href="#what-the-dht-stores">What the DHT stores</a></h2>
-<p>The DHT stores <strong>pointers</strong>, not data. A pointer is a lightweight record that says “tessera X is held by nodes Y and Z.” When someone wants to retrieve a tessera, they first look up its pointer in the DHT to find out which nodes have it, then connect directly to those nodes to download the actual data.</p>
-<p>This means the DHT stays small and fast — it only tracks who has what, not the content itself.</p>
-<h2 id="node-identity-and-proof-of-work"><a class="header" href="#node-identity-and-proof-of-work">Node identity and proof-of-work</a></h2>
-<p>Every node has a 160-bit <strong>node ID</strong> derived from its public key. To prevent an attacker from cheaply creating thousands of fake nodes (a <strong>Sybil attack</strong>), generating a node ID requires a small proof-of-work: the node must find a nonce such that <code>BLAKE3(public_key || nonce)</code> starts with 8 zero bits.</p>
-<p>This takes about 256 hash attempts — under a second on any device, including a Raspberry Pi. But an attacker trying to create 10,000 fake identities would need millions of attempts, making the attack impractical.</p>
-<h2 id="xor-distance"><a class="header" href="#xor-distance">XOR distance</a></h2>
-<p>Kademlia defines “closeness” between nodes using the <strong>XOR metric</strong>: the distance between two node IDs is their bitwise XOR. Nodes are responsible for storing pointers whose keys are close to their own ID (in XOR distance). This distributes data evenly across the network without any coordination.</p>
-<p>When looking up a tessera pointer, your node asks the peers it knows that are closest to the target key. Those peers point to even closer ones, and so on, until the pointer is found. This <strong>iterative lookup</strong> typically reaches any node in the network within a few hops.</p>
-<h2 id="transport-quic"><a class="header" href="#transport-quic">Transport: QUIC</a></h2>
-<p>All communication between nodes uses <strong>QUIC</strong>, a modern transport protocol built on UDP. QUIC provides:</p>
-<ul>
-<li><strong>Built-in encryption</strong> — every connection uses TLS 1.3</li>
-<li><strong>NAT-friendly</strong> — works through most network address translators since it’s UDP-based</li>
-<li><strong>Multiplexing</strong> — multiple independent operations over one connection without head-of-line blocking</li>
-<li><strong>Connection migration</strong> — survives network changes (e.g., switching from Wi-Fi to mobile data)</li>
-</ul>
-<p>The daemon listens on UDP port <strong>4433</strong> by default.</p>
-<h2 id="bootstrap-process"><a class="header" href="#bootstrap-process">Bootstrap process</a></h2>
-<p>When a node starts, it follows this sequence:</p>
-<ol>
-<li><strong>Contact seed nodes</strong> — connect to one or more known bootstrap addresses</li>
-<li><strong>Exchange pings</strong> — verify the seed is alive and exchange node identities</li>
-<li><strong>Self-lookup</strong> — ask the seed for nodes close to your own ID, to populate your routing table</li>
-<li><strong>Iterative discovery</strong> — contact the newly discovered nodes, which point you to even more peers</li>
-</ol>
-<p>After bootstrap, the node maintains its routing table automatically: it refreshes buckets periodically and replaces unresponsive peers with new ones.</p>
-<h2 id="node-types"><a class="header" href="#node-types">Node types</a></h2>
-<p>Not every device participates in the network the same way:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Type</th><th>Description</th><th>Always on?</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Full node</strong></td><td>Desktop, server, or Raspberry Pi running <code>tesseras-daemon</code>. Participates fully in the DHT and stores data for other nodes.</td><td>Yes</td></tr>
-<tr><td><strong>Mobile node</strong></td><td>Phone or tablet running the Tesseras app. Participates in the DHT when the app is active.</td><td>No</td></tr>
-<tr><td><strong>Browser node</strong></td><td>Web browser running the WASM client. Connects via a relay node. Read-only.</td><td>No</td></tr>
-<tr><td><strong>IoT node</strong></td><td>ESP32 or similar device on the local network. Stores fragments passively, does not participate in the DHT.</td><td>Yes</td></tr>
-</tbody>
-</table>
-</div>
-<p>The full node daemon is the backbone of the network. The more full nodes running, the more resilient the network becomes.</p>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="replication-and-repair"><a class="header" href="#replication-and-repair">Replication and Repair</a></h1>
-<p>This chapter explains how Tesseras keeps your memories safe even when individual nodes go offline or suffer hardware failures. You don’t need to understand these details to use Tesseras — the daemon handles everything automatically.</p>
-<h2 id="why-replication-matters"><a class="header" href="#why-replication-matters">Why replication matters</a></h2>
-<p>A tessera stored on a single machine dies when that machine dies. Tesseras solves this by splitting data into fragments, spreading them across multiple peers, and continuously verifying that enough copies exist. If some fragments disappear, the network repairs itself automatically.</p>
-<h2 id="erasure-coding"><a class="header" href="#erasure-coding">Erasure coding</a></h2>
-<p>Tesseras uses <strong>Reed-Solomon erasure coding</strong> to create redundant fragments. The idea is simple: from N data fragments, generate M extra parity fragments. Any N of the N+M total fragments can reconstruct the original data.</p>
-<p>This is far more storage-efficient than simple replication. Storing 3 complete copies of a 100 MB file costs 300 MB. With 16 data + 8 parity fragments, you get stronger protection (can lose up to 8 of 24 fragments — 33%) for only 150 MB total.</p>
-<h2 id="fragmentation-tiers"><a class="header" href="#fragmentation-tiers">Fragmentation tiers</a></h2>
-<p>Not every tessera is treated the same way. Small files don’t benefit from erasure coding overhead, so Tesseras uses three tiers:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Tier</th><th>Size</th><th>Strategy</th><th>Fragments</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Small</strong></td><td>&lt; 4 MB</td><td>Whole-file replication</td><td>7 copies of the complete file</td></tr>
-<tr><td><strong>Medium</strong></td><td>4–256 MB</td><td>Reed-Solomon 16+8</td><td>16 data + 8 parity = 24 fragments</td></tr>
-<tr><td><strong>Large</strong></td><td>≥ 256 MB</td><td>Reed-Solomon 48+24</td><td>48 data + 24 parity = 72 fragments</td></tr>
-</tbody>
-</table>
-</div>
-<p>All tiers target a <strong>replication factor of 7</strong> — meaning fragments are distributed to 7 different peers.</p>
-<h2 id="how-distribution-works"><a class="header" href="#how-distribution-works">How distribution works</a></h2>
-<p>When you create a tessera and the daemon replicates it, this is what happens:</p>
-<ol>
-<li><strong>Encode</strong> — the tessera data is split into fragments according to its size tier</li>
-<li><strong>Find peers</strong> — the daemon queries the DHT for the closest nodes to the tessera’s hash</li>
-<li><strong>Subnet diversity</strong> — peers are filtered so that no more than a few come from the same network subnet (to avoid correlated failures if a datacenter goes down)</li>
-<li><strong>Distribute</strong> — fragments are pushed to the selected peers in round-robin order</li>
-<li><strong>Acknowledge</strong> — each peer validates the fragment’s checksum and confirms receipt</li>
-</ol>
-<p>The tessera owner pushes fragments to peers. Peers don’t pull — this keeps the protocol simple and ensures immediate distribution.</p>
-<h2 id="fragment-verification"><a class="header" href="#fragment-verification">Fragment verification</a></h2>
-<p>Every fragment carries a BLAKE3 checksum. When a node receives a fragment, it recomputes the hash and compares it to the expected checksum. If they don’t match, the fragment is rejected. This catches both transmission errors and deliberate tampering.</p>
-<p>Fragments are stored in a <strong>content-addressable store (CAS)</strong> where each unique piece of data exists exactly once on disk, keyed by its BLAKE3 hash. A SQLite reference table maps logical fragment identifiers to CAS hashes, enabling automatic deduplication — if two tesseras share identical fragment data, only one copy is stored. Reference counting ensures data is cleaned up only when no tessera references it.</p>
-<h2 id="repair-loop"><a class="header" href="#repair-loop">Repair loop</a></h2>
-<p>The daemon runs a background repair loop every 24 hours (with random jitter to avoid network-wide storms). For each tessera it’s responsible for, the repair loop:</p>
-<ol>
-<li><strong>Requests attestations</strong> from known holders — each holder proves it still has the fragments by reporting their checksums</li>
-<li><strong>Falls back to ping</strong> if attestation fails — to distinguish between “node is down” and “node lost the data”</li>
-<li><strong>Checks local fragments</strong> — verifies integrity of any fragments stored locally by recomputing BLAKE3 checksums</li>
-<li><strong>Decides action</strong>:
-<ul>
-<li><strong>Healthy</strong> — all holders responded, all checksums valid, nothing to do</li>
-<li><strong>Needs replication</strong> — some holders are gone, find new peers and redistribute missing fragments</li>
-<li><strong>Corrupt local</strong> — a local fragment has bad data, fetch a replacement from the network</li>
-</ul>
-</li>
-</ol>
-<h2 id="reciprocity"><a class="header" href="#reciprocity">Reciprocity</a></h2>
-<p>Tesseras uses a <strong>bilateral reciprocity ledger</strong> to ensure fair storage exchange. There is no cryptocurrency, no blockchain, no global consensus — each node simply tracks its balance with each peer locally:</p>
-<pre><code>peer_a: +500 MB (they store 500 MB of mine)
-peer_b: -200 MB (I store 200 MB more of theirs than they store of mine)
-peer_c: 0 MB (balanced)
-</code></pre>
-<p>The rules are simple:</p>
-<ul>
-<li>Store 1 GB on the network → you should store roughly 1 GB for others</li>
-<li>Nodes with a positive balance (they store more for you) get priority when you need to distribute new fragments</li>
-<li>Free riders gradually lose redundancy — their fragments are deprioritized for repair, but never deleted</li>
-<li>When receiving a fragment, a node checks the sender’s deficit. If the sender owes too much storage, the fragment is rejected</li>
-<li>Institutional nodes (universities, archives) can operate altruistically with imbalanced ratios</li>
-</ul>
-<h2 id="maximum-tessera-size"><a class="header" href="#maximum-tessera-size">Maximum tessera size</a></h2>
-<p>The maximum tessera size is <strong>1 GB</strong>. This is a practical limit that keeps fragment sizes manageable and replication fast. For larger collections of memories, create multiple tesseras.</p>
-<h2 id="configuration-1"><a class="header" href="#configuration-1">Configuration</a></h2>
-<p>The daemon’s replication behavior can be tuned through configuration:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Parameter</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>Repair interval</td><td>24 hours</td><td>How often the repair loop runs</td></tr>
-<tr><td>Repair jitter</td><td>2 hours</td><td>Random delay added to avoid network-wide storms</td></tr>
-<tr><td>Concurrent transfers</td><td>4</td><td>Maximum parallel fragment transfers</td></tr>
-<tr><td>Minimum free space</td><td>1 GB</td><td>Stop accepting fragments below this threshold</td></tr>
-<tr><td>Deficit allowance</td><td>256 MB</td><td>Maximum storage deficit before rejecting a peer’s fragments</td></tr>
-<tr><td>Per-peer limit</td><td>1 GB</td><td>Maximum total storage for any single peer</td></tr>
-</tbody>
-</table>
-</div>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="encryption-and-sealed-tesseras"><a class="header" href="#encryption-and-sealed-tesseras">Encryption and Sealed Tesseras</a></h1>
-<p>Most tesseras are public — designed to be accessible to anyone, forever. But some memories need privacy. Tesseras supports two encrypted visibility modes:</p>
-<ul>
-<li><strong>Private</strong> — only the creator (and their heirs) can ever access the content</li>
-<li><strong>Sealed</strong> — the content is time-locked and becomes accessible after a specific date</li>
-</ul>
-<p>Public tesseras are never encrypted. Availability is more important than secrecy for preservation.</p>
-<h2 id="how-encryption-works"><a class="header" href="#how-encryption-works">How encryption works</a></h2>
-<p>When you create a private or sealed tessera, the following happens:</p>
-<ol>
-<li>A random <strong>content key</strong> (256-bit) is generated</li>
-<li>Each memory file is encrypted with <strong>AES-256-GCM</strong> using that content key</li>
-<li>The content key is wrapped in a <strong>sealed key envelope</strong> using your encryption public key</li>
-<li>The wrapped key is stored alongside the encrypted content</li>
-</ol>
-<p>Only the holder of the corresponding private key can unwrap the content key and decrypt the content.</p>
-<h2 id="hybrid-post-quantum-key-encapsulation"><a class="header" href="#hybrid-post-quantum-key-encapsulation">Hybrid post-quantum key encapsulation</a></h2>
-<p>The sealed key envelope uses a <strong>hybrid Key Encapsulation Mechanism (KEM)</strong> combining two algorithms:</p>
-<ul>
-<li><strong>X25519</strong> — a well-tested classical elliptic curve key exchange</li>
-<li><strong>ML-KEM-768</strong> — a NIST-standardized post-quantum lattice-based KEM (formerly Kyber)</li>
-</ul>
-<p>Both algorithms produce shared secrets that are combined using BLAKE3 key derivation. An attacker must break <strong>both</strong> algorithms to recover the content key. This follows the same principle as Tesseras’ dual signatures (Ed25519 + ML-DSA): we don’t know which cryptographic assumptions will hold over centuries, so we hedge our bets.</p>
-<h2 id="authenticated-associated-data-aad"><a class="header" href="#authenticated-associated-data-aad">Authenticated associated data (AAD)</a></h2>
-<p>AES-256-GCM supports authenticated associated data — extra information that is verified during decryption but not encrypted. Tesseras binds the following into the AAD:</p>
-<ul>
-<li>The <strong>content hash</strong> of the tessera (always)</li>
-<li>The <strong>open_after timestamp</strong> (for sealed tesseras only)</li>
-</ul>
-<p>This prevents <strong>ciphertext swapping attacks</strong>: an attacker cannot copy encrypted content from one tessera to another, because the AAD will not match and decryption will fail. For sealed tesseras, this also means you cannot change the seal date — the timestamp is cryptographically bound to the ciphertext.</p>
-<h2 id="sealed-tesseras-time-capsules"><a class="header" href="#sealed-tesseras-time-capsules">Sealed tesseras: time capsules</a></h2>
-<p>A sealed tessera is a true time capsule. When you create one, you specify an <code>open_after</code> date. The content is encrypted and the key is sealed in an envelope that only you can open.</p>
-<p>When the <code>open_after</code> date passes, the owner publishes the content key as a signed <strong>Key Publication</strong> — a standalone artifact containing the key, the tessera hash, and the owner’s signature. Other nodes can verify the signature and use the published key to decrypt the content.</p>
-<p>The tessera’s manifest is never modified. The Key Publication is a separate document, preserving the immutable, content-addressed nature of tesseras.</p>
-<h2 id="what-about-the-keys"><a class="header" href="#what-about-the-keys">What about the keys?</a></h2>
-<p>Each identity now includes an <strong>encryption keypair</strong> alongside the signing keypair:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Key type</th><th>Algorithm</th><th>Purpose</th></tr>
-</thead>
-<tbody>
-<tr><td>Ed25519</td><td>Classical</td><td>Signing manifests and key publications</td></tr>
-<tr><td>ML-DSA</td><td>Post-quantum</td><td>Signing (when enabled)</td></tr>
-<tr><td>X25519</td><td>Classical</td><td>Key encapsulation (encryption)</td></tr>
-<tr><td>ML-KEM-768</td><td>Post-quantum</td><td>Key encapsulation (encryption)</td></tr>
-</tbody>
-</table>
-</div>
-<p>The encryption keypair is generated when the identity is created. The public half is stored in the tessera’s identity directory; the private half stays on the owner’s device.</p>
-<h2 id="design-principles"><a class="header" href="#design-principles">Design principles</a></h2>
-<ul>
-<li><strong>Encrypt as little as possible</strong> — only private and sealed content is encrypted. Public memories stay open for long-term accessibility.</li>
-<li><strong>Dual algorithms from day one</strong> — both classical and post-quantum cryptography, so content is protected even if one algorithm is broken.</li>
-<li><strong>Immutable manifests</strong> — keys are published separately, never by modifying existing data.</li>
-<li><strong>Fail closed</strong> — the system rejects attempts to create private or sealed tesseras without encryption keys.</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="heir-key-recovery"><a class="header" href="#heir-key-recovery">Heir Key Recovery</a></h1>
-<p>Your tesseras can survive infrastructure failures, quantum computers, and centuries of time. But what happens when you can no longer access your own keys? Tesseras uses <strong>Shamir’s Secret Sharing</strong> to let you distribute your cryptographic identity to trusted heirs.</p>
-<h2 id="how-it-works"><a class="header" href="#how-it-works">How it works</a></h2>
-<p>Shamir’s Secret Sharing splits a secret into N shares with a threshold T. Any T shares can reconstruct the original secret. Fewer than T shares reveal <strong>nothing</strong> — this is information-theoretically secure, not just computationally hard to break.</p>
-<p>For example, with threshold 2 and 3 total shares:</p>
-<ul>
-<li>Give share 1 to your spouse</li>
-<li>Give share 2 to your sibling</li>
-<li>Give share 3 to your lawyer</li>
-</ul>
-<p>Any two of them can recover your identity. A single share alone is useless.</p>
-<h2 id="creating-heir-shares"><a class="header" href="#creating-heir-shares">Creating heir shares</a></h2>
-<pre><code class="language-bash">tes heir create --threshold 2 --shares 3
-</code></pre>
-<p>This splits your Ed25519 identity key into 3 shares (requiring 2 to reconstruct) and saves them to <code>./heir-shares/</code>:</p>
-<pre><code>heir-shares/
-├── heir_share_1.bin # MessagePack binary
-├── heir_share_1.txt # Human-readable base64 text
-├── heir_share_2.bin
-├── heir_share_2.txt
-├── heir_share_3.bin
-└── heir_share_3.txt
-</code></pre>
-<p>Each share is generated in two formats:</p>
-<ul>
-<li><strong>Binary</strong> (<code>.bin</code>) — compact MessagePack, suitable for USB drives or digital storage</li>
-<li><strong>Text</strong> (<code>.txt</code>) — base64 with human-readable header, suitable for printing on paper</li>
-</ul>
-<p>The text format looks like this:</p>
-<pre><code>--- TESSERAS HEIR SHARE ---
-Format: v1
-Owner: a1b2c3d4e5f6a7b8 (fingerprint)
-Share: 1 of 3 (threshold: 2)
-Session: 9f8e7d6c5b4a3210
-Created: 2026-02-15
-
-&lt;base64-encoded data&gt;
---- END HEIR SHARE ---
-</code></pre>
-<h2 id="reconstructing-from-shares"><a class="header" href="#reconstructing-from-shares">Reconstructing from shares</a></h2>
-<p>When heirs need to recover the identity:</p>
-<pre><code class="language-bash">tes heir reconstruct heir_share_1.txt heir_share_2.bin --output-dir ./recovered-keys
-</code></pre>
-<p>The command auto-detects whether each file is binary or text format. It validates that all shares belong to the same session and owner, verifies checksums, and reconstructs the Ed25519 keypair.</p>
-<p>To install the recovered keys as the active identity:</p>
-<pre><code class="language-bash">tes heir reconstruct share1.txt share2.txt --output-dir ./recovered --install
-</code></pre>
-<p>This backs up the current identity before replacing it.</p>
-<h2 id="inspecting-a-share"><a class="header" href="#inspecting-a-share">Inspecting a share</a></h2>
-<p>To view metadata about a share without exposing secret data:</p>
-<pre><code class="language-bash">tes heir info heir_share_1.txt
-</code></pre>
-<p>Output:</p>
-<pre><code>Heir Share Information:
- Format version: 1
- Share: 1 of 3 (threshold: 2)
- Session: 9f8e7d6c5b4a3210
- Owner fingerprint: a1b2c3d4e5f6a7b8
- Share data size: 34 bytes
- Checksum: valid
-</code></pre>
-<h2 id="security-considerations"><a class="header" href="#security-considerations">Security considerations</a></h2>
-<ul>
-<li><strong>Threshold choice</strong>: a threshold of 2-of-3 or 3-of-5 is recommended for most people. Higher thresholds are more secure but require more heirs to cooperate.</li>
-<li><strong>Physical storage</strong>: print the <code>.txt</code> files on acid-free paper and store in separate physical locations (safe deposit boxes, different homes). Paper survives decades without degradation.</li>
-<li><strong>Never store shares together</strong>: the entire point of splitting is distribution. Keeping all shares in one place defeats the purpose.</li>
-<li><strong>Session isolation</strong>: each <code>heir create</code> call generates a fresh session ID. Shares from different sessions cannot be mixed — this prevents confusion after key rotations.</li>
-<li><strong>Checksum verification</strong>: each share includes a BLAKE3 checksum. Corrupted shares (OCR errors, bit rot) are detected before reconstruction is attempted.</li>
-<li><strong>Re-split after key changes</strong>: if you regenerate your identity, create new heir shares and securely destroy the old ones.</li>
-</ul>
-<h2 id="design-principles-1"><a class="header" href="#design-principles-1">Design principles</a></h2>
-<ul>
-<li><strong>Information-theoretic security</strong> — T-1 shares reveal exactly zero information about the secret. This is not a computational assumption; it is mathematically proven.</li>
-<li><strong>Corruption detection</strong> — BLAKE3 checksums catch bit rot, OCR errors, and truncation before any reconstruction attempt.</li>
-<li><strong>Format resilience</strong> — dual output (binary + text) ensures shares survive different storage media failure modes.</li>
-<li><strong>Backward compatibility</strong> — the secret blob is versioned, so future versions can include additional key material without breaking existing shares.</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="nat-traversal"><a class="header" href="#nat-traversal">NAT Traversal</a></h1>
-<p>Most devices on the internet sit behind a <strong>NAT</strong> (Network Address Translator). Your router assigns your device a private address (like <code>192.168.1.100</code>) and translates it to a public address when you connect outward. This works fine for browsing the web, but it creates a problem for P2P networks: two devices behind different NATs cannot directly connect to each other without help.</p>
-<p>Tesseras solves this with a three-tier approach, trying the cheapest option first:</p>
-<ol>
-<li><strong>Direct connection</strong> — if both nodes have public IPs, they connect directly</li>
-<li><strong>UDP hole punching</strong> — a third node introduces the two peers so they can punch through their NATs</li>
-<li><strong>Relay</strong> — a public-IP node forwards packets between the two peers</li>
-</ol>
-<h2 id="nat-type-discovery"><a class="header" href="#nat-type-discovery">NAT type discovery</a></h2>
-<p>When a node starts, it sends STUN (Session Traversal Utilities for NAT) requests to multiple public servers. By comparing the external addresses these servers report back, the node classifies its NAT:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>NAT Type</th><th>What it means</th><th>Hole punching?</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Public</strong></td><td>No NAT — your device has a public IP</td><td>Not needed</td></tr>
-<tr><td><strong>Cone</strong></td><td>NAT maps the same internal port to the same external port regardless of destination</td><td>Works well (~80%)</td></tr>
-<tr><td><strong>Symmetric</strong></td><td>NAT assigns a different external port for each destination</td><td>Unreliable</td></tr>
-<tr><td><strong>Unknown</strong></td><td>Could not reach STUN servers</td><td>Relay needed</td></tr>
-</tbody>
-</table>
-</div>
-<p>Your node advertises its NAT type in DHT Pong messages, so other nodes know whether hole punching is worth attempting.</p>
-<h2 id="hole-punching"><a class="header" href="#hole-punching">Hole punching</a></h2>
-<p>When node A (behind a Cone NAT) wants to connect to node B (also behind a Cone NAT), neither can directly reach the other. The solution:</p>
-<ol>
-<li>
-<p>A sends a <strong>PunchIntro</strong> message to node I (an introducer — any public-IP node they both know). The message includes A’s external address (from STUN) and an Ed25519 signature proving A’s identity.</p>
-</li>
-<li>
-<p>I verifies the signature and forwards a <strong>PunchRequest</strong> to B, including A’s address and the original signature.</p>
-</li>
-<li>
-<p>B verifies the signature (proving the request really came from A, not a spoofed source). B then sends a UDP packet to A’s external address — this opens a pinhole in B’s NAT. B also sends a <strong>PunchReady</strong> message back to A with B’s external address.</p>
-</li>
-<li>
-<p>A sends a UDP packet to B’s external address. Both NATs now have pinholes, and the two nodes can communicate directly.</p>
-</li>
-</ol>
-<p>The entire process takes 2-5 seconds. The Ed25519 signatures prevent <strong>reflection attacks</strong>, where an attacker replays an old introduction to redirect traffic.</p>
-<h2 id="relay-fallback"><a class="header" href="#relay-fallback">Relay fallback</a></h2>
-<p>When hole punching fails (Symmetric NAT, strict firewalls, or corporate networks), nodes fall back to relaying through a public-IP node:</p>
-<ol>
-<li>A sends a <strong>RelayRequest</strong> to node R (a public-IP node with relay enabled).</li>
-<li>R creates a session and sends a <strong>RelayOffer</strong> to both A and B, containing the relay address and a session token.</li>
-<li>A and B send their packets to R, prefixed with the session token. R strips the token and forwards the payload to the other peer.</li>
-</ol>
-<p>Relay sessions have bandwidth limits:</p>
-<ul>
-<li><strong>256 KB/s</strong> for peers with good reciprocity (they store fragments for others)</li>
-<li><strong>64 KB/s</strong> for peers without reciprocity</li>
-<li>Non-reciprocal sessions are limited to 10 minutes</li>
-</ul>
-<p>This encourages nodes to contribute storage — good network citizens get better relay service.</p>
-<h2 id="address-migration"><a class="header" href="#address-migration">Address migration</a></h2>
-<p>When a mobile device switches networks (Wi-Fi to cellular), its IP address changes. Rather than tearing down and rebuilding relay sessions, the node sends a signed <strong>RelayMigrate</strong> message to update its address in the existing session. This avoids re-establishing connections from scratch.</p>
-<h2 id="configuration-2"><a class="header" href="#configuration-2">Configuration</a></h2>
-<p>The <code>[nat]</code> section in the daemon config controls NAT traversal:</p>
-<pre><code class="language-toml">[nat]
-# STUN servers for NAT type detection
-stun_servers = ["stun.l.google.com:19302", "stun.cloudflare.com:3478"]
-
-# Enable relay (forward traffic for other NATed peers)
-relay_enabled = false
-
-# Maximum simultaneous relay sessions
-relay_max_sessions = 50
-
-# Bandwidth limit for reciprocal peers (KB/s)
-relay_reciprocal_kbps = 256
-
-# Bandwidth limit for non-reciprocal peers (KB/s)
-relay_bootstrap_kbps = 64
-
-# Relay session idle timeout (seconds)
-relay_idle_timeout_secs = 60
-</code></pre>
-<p>To run a relay node, set <code>relay_enabled = true</code>. Your node must have a public IP (or a port-forwarded router) to serve as a relay.</p>
-<h2 id="mobile-reconnection"><a class="header" href="#mobile-reconnection">Mobile reconnection</a></h2>
-<p>When the Tesseras app detects a network change on a mobile device, it runs a three-phase reconnection sequence:</p>
-<ol>
-<li><strong>QUIC migration</strong> (0-2s) — QUIC supports connection migration natively. The app tries to migrate all active connections to the new address.</li>
-<li><strong>Re-STUN</strong> (2-5s) — discover the new external address and re-announce to the DHT.</li>
-<li><strong>Re-establish</strong> (5-10s) — reconnect peers that migration couldn’t save, in priority order: bootstrap nodes first, then nodes holding your fragments, then nodes whose fragments you hold.</li>
-</ol>
-<p>The app shows reconnection progress through the <code>NetworkChanged</code> event stream.</p>
-<h2 id="monitoring"><a class="header" href="#monitoring">Monitoring</a></h2>
-<p>NAT traversal exposes Prometheus metrics at <code>/metrics</code>:</p>
-<ul>
-<li><code>tesseras_nat_type</code> — current detected NAT type</li>
-<li><code>tesseras_stun_requests_total</code> / <code>tesseras_stun_failures_total</code> — STUN reliability</li>
-<li><code>tesseras_punch_attempts_total{initiator_nat, target_nat}</code> — punch success rate by NAT pair</li>
-<li><code>tesseras_relay_sessions_active</code> — current relay load</li>
-<li><code>tesseras_relay_bytes_forwarded</code> — total relay bandwidth</li>
-<li><code>tesseras_network_change_total</code> — network change frequency on mobile</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="docker"><a class="header" href="#docker">Docker</a></h1>
-<p>Tesseras provides a Docker image for running the daemon in containers. This is useful for servers, testing multi-node networks, and CI environments.</p>
-<h2 id="building-the-image"><a class="header" href="#building-the-image">Building the image</a></h2>
-<p>From the repository root:</p>
-<pre><code class="language-bash">docker build -t tesseras-daemon .
-</code></pre>
-<p>The multi-stage Dockerfile uses <code>rust:1.85</code> to compile and <code>debian:bookworm-slim</code> as the runtime base. The resulting image is small and contains only the daemon binary and CA certificates.</p>
-<h2 id="running-a-single-node"><a class="header" href="#running-a-single-node">Running a single node</a></h2>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- tesseras-daemon
-</code></pre>
-<p>This starts a node that:</p>
-<ul>
-<li>Listens on UDP port 4433</li>
-<li>Bootstraps from the default seed nodes</li>
-<li>Stores data inside the container (ephemeral)</li>
-</ul>
-<p>To persist data across container restarts, mount a volume:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- -v tesseras-data:/root/.local/share/tesseras \
- tesseras-daemon
-</code></pre>
-<h2 id="running-as-a-seed-node"><a class="header" href="#running-as-a-seed-node">Running as a seed node</a></h2>
-<p>To run a seed node that doesn’t bootstrap from anyone else:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras-seed \
- -p 4433:4433/udp \
- tesseras-daemon --listen 0.0.0.0:4433 --bootstrap ""
-</code></pre>
-<h2 id="multi-node-network-with-docker-compose"><a class="header" href="#multi-node-network-with-docker-compose">Multi-node network with Docker Compose</a></h2>
-<p>The repository includes a Docker Compose file for testing a 3-node network:</p>
-<pre><code class="language-yaml">services:
- boot1:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", ""]
- ports: ["4433:4433/udp"]
-
- boot2:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", "boot1:4433"]
- depends_on: [boot1]
-
- client:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", "boot2:4433"]
- depends_on: [boot2]
-</code></pre>
-<p>Start the network:</p>
-<pre><code class="language-bash">cd tests/smoke
-docker compose up --build -d
-</code></pre>
-<p>Check that all nodes are running:</p>
-<pre><code class="language-bash">docker compose logs --tail=5
-</code></pre>
-<p>You should see <code>daemon ready</code> in the logs for each node, and <code>bootstrap successful</code> for <code>boot2</code> and <code>client</code>.</p>
-<p>Stop the network:</p>
-<pre><code class="language-bash">docker compose down
-</code></pre>
-<h2 id="custom-configuration"><a class="header" href="#custom-configuration">Custom configuration</a></h2>
-<p>To use a config file with Docker, mount it into the container:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- -v ./config.toml:/etc/tesseras/config.toml:ro \
- -v tesseras-data:/root/.local/share/tesseras \
- tesseras-daemon --config /etc/tesseras/config.toml
-</code></pre>
-<p>See the <a href="#configuration">Configuration</a> chapter for all available options.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
-
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
-
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
- <script>
- window.addEventListener('load', function() {
- window.setTimeout(window.print, 100);
- });
- </script>
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/print.html.gz b/book/en/print.html.gz
deleted file mode 100644
index e421425..0000000
--- a/book/en/print.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/quick-start.html b/book/en/quick-start.html
deleted file mode 100644
index fd6a47a..0000000
--- a/book/en/quick-start.html
+++ /dev/null
@@ -1,314 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Quick Start - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="quick-start"><a class="header" href="#quick-start">Quick Start</a></h1>
-<p>This tutorial walks you through a complete workflow: creating an identity, building a tessera from files, verifying it, and exporting it.</p>
-<h2 id="1-initialize-your-identity"><a class="header" href="#1-initialize-your-identity">1. Initialize your identity</a></h2>
-<p>First, set up your local identity and database:</p>
-<pre><code class="language-bash">tes init
-</code></pre>
-<pre><code>Generated Ed25519 identity
-Database initialized
-Config written to /home/user/.tesseras/config.toml
-Tesseras initialized at /home/user/.tesseras
-</code></pre>
-<p>This creates:</p>
-<ul>
-<li><code>~/.tesseras/identity/</code> — your Ed25519 keypair</li>
-<li><code>~/.tesseras/db/</code> — SQLite database for indexing</li>
-<li><code>~/.tesseras/blobs/</code> — storage for memory files</li>
-<li><code>~/.tesseras/config.toml</code> — configuration file</li>
-</ul>
-<h2 id="2-prepare-your-files"><a class="header" href="#2-prepare-your-files">2. Prepare your files</a></h2>
-<p>Create a directory with the memories you want to preserve:</p>
-<pre><code class="language-bash">mkdir my-memories
-cp ~/photos/family-dinner.jpg my-memories/
-cp ~/photos/garden.jpg my-memories/
-echo "A warm Sunday afternoon with the family." &gt; my-memories/reflection.txt
-</code></pre>
-<p>Supported formats: <code>.jpg</code>, <code>.jpeg</code>, <code>.png</code> (images), <code>.wav</code> (audio), <code>.webm</code> (video), <code>.txt</code> (text).</p>
-<h2 id="3-preview-with-dry-run"><a class="header" href="#3-preview-with-dry-run">3. Preview with dry run</a></h2>
-<p>See what would be included without creating anything:</p>
-<pre><code class="language-bash">tes create my-memories --dry-run
-</code></pre>
-<h2 id="4-create-a-tessera"><a class="header" href="#4-create-a-tessera">4. Create a tessera</a></h2>
-<pre><code class="language-bash">tes create my-memories --tags "family,sunday" --location "Home"
-</code></pre>
-<p>The output includes the content hash — a 64-character hex string that uniquely identifies your tessera. Copy it for the next steps.</p>
-<h2 id="5-list-your-tesseras"><a class="header" href="#5-list-your-tesseras">5. List your tesseras</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>Hash Created Memories Size Visibility
-9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public
-</code></pre>
-<h2 id="6-verify-integrity"><a class="header" href="#6-verify-integrity">6. Verify integrity</a></h2>
-<p>Use the content hash to verify that all files are intact and the signature is valid:</p>
-<pre><code class="language-bash">tes verify 9f2c4a1b3e7d8f0c...
-</code></pre>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0c...
-Signature: VALID
- [OK] memories/a1b2c3/media.jpg
- [OK] memories/d4e5f6/media.jpg
- [OK] memories/g7h8i9/media.txt
-Verification: PASSED
-</code></pre>
-<h2 id="7-export-a-self-contained-copy"><a class="header" href="#7-export-a-self-contained-copy">7. Export a self-contained copy</a></h2>
-<p>Export the tessera to a directory that can be read without Tesseras:</p>
-<pre><code class="language-bash">tes export 9f2c4a1b3e7d8f0c... ./backup
-</code></pre>
-<pre><code>Exported to ./backup/tessera-9f2c4a1b3e7d8f0c...
-</code></pre>
-<h2 id="8-inspect-the-export"><a class="header" href="#8-inspect-the-export">8. Inspect the export</a></h2>
-<p>The exported directory is fully self-contained:</p>
-<pre><code>tessera-9f2c4a1b3e7d8f0c.../
-├── MANIFEST # Plain text index with checksums
-├── README.decode # How to read this tessera without software
-├── identity/
-│ ├── creator.pub.ed25519 # Your public key
-│ └── signature.ed25519.sig # Signature of the MANIFEST
-├── memories/
-│ ├── &lt;hash&gt;/
-│ │ ├── media.jpg # The photo
-│ │ ├── context.txt # Description in plain text
-│ │ └── meta.json # Structured metadata
-│ └── .../
-└── decode/
- ├── formats.txt # Explanation of all formats used
- ├── jpeg.txt # How to decode JPEG
- └── json.txt # How to decode JSON
-</code></pre>
-<p>Everything a future reader needs to understand the contents is included in the directory itself — no Tesseras software required.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="installation.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="commands/init.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="installation.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="commands/init.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/quick-start.html.gz b/book/en/quick-start.html.gz
deleted file mode 100644
index 394a124..0000000
--- a/book/en/quick-start.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/replication.html b/book/en/replication.html
deleted file mode 100644
index 328d0ea..0000000
--- a/book/en/replication.html
+++ /dev/null
@@ -1,319 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Replication and Repair - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="replication-and-repair"><a class="header" href="#replication-and-repair">Replication and Repair</a></h1>
-<p>This chapter explains how Tesseras keeps your memories safe even when individual nodes go offline or suffer hardware failures. You don’t need to understand these details to use Tesseras — the daemon handles everything automatically.</p>
-<h2 id="why-replication-matters"><a class="header" href="#why-replication-matters">Why replication matters</a></h2>
-<p>A tessera stored on a single machine dies when that machine dies. Tesseras solves this by splitting data into fragments, spreading them across multiple peers, and continuously verifying that enough copies exist. If some fragments disappear, the network repairs itself automatically.</p>
-<h2 id="erasure-coding"><a class="header" href="#erasure-coding">Erasure coding</a></h2>
-<p>Tesseras uses <strong>Reed-Solomon erasure coding</strong> to create redundant fragments. The idea is simple: from N data fragments, generate M extra parity fragments. Any N of the N+M total fragments can reconstruct the original data.</p>
-<p>This is far more storage-efficient than simple replication. Storing 3 complete copies of a 100 MB file costs 300 MB. With 16 data + 8 parity fragments, you get stronger protection (can lose up to 8 of 24 fragments — 33%) for only 150 MB total.</p>
-<h2 id="fragmentation-tiers"><a class="header" href="#fragmentation-tiers">Fragmentation tiers</a></h2>
-<p>Not every tessera is treated the same way. Small files don’t benefit from erasure coding overhead, so Tesseras uses three tiers:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Tier</th><th>Size</th><th>Strategy</th><th>Fragments</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Small</strong></td><td>&lt; 4 MB</td><td>Whole-file replication</td><td>7 copies of the complete file</td></tr>
-<tr><td><strong>Medium</strong></td><td>4–256 MB</td><td>Reed-Solomon 16+8</td><td>16 data + 8 parity = 24 fragments</td></tr>
-<tr><td><strong>Large</strong></td><td>≥ 256 MB</td><td>Reed-Solomon 48+24</td><td>48 data + 24 parity = 72 fragments</td></tr>
-</tbody>
-</table>
-</div>
-<p>All tiers target a <strong>replication factor of 7</strong> — meaning fragments are distributed to 7 different peers.</p>
-<h2 id="how-distribution-works"><a class="header" href="#how-distribution-works">How distribution works</a></h2>
-<p>When you create a tessera and the daemon replicates it, this is what happens:</p>
-<ol>
-<li><strong>Encode</strong> — the tessera data is split into fragments according to its size tier</li>
-<li><strong>Find peers</strong> — the daemon queries the DHT for the closest nodes to the tessera’s hash</li>
-<li><strong>Subnet diversity</strong> — peers are filtered so that no more than a few come from the same network subnet (to avoid correlated failures if a datacenter goes down)</li>
-<li><strong>Distribute</strong> — fragments are pushed to the selected peers in round-robin order</li>
-<li><strong>Acknowledge</strong> — each peer validates the fragment’s checksum and confirms receipt</li>
-</ol>
-<p>The tessera owner pushes fragments to peers. Peers don’t pull — this keeps the protocol simple and ensures immediate distribution.</p>
-<h2 id="fragment-verification"><a class="header" href="#fragment-verification">Fragment verification</a></h2>
-<p>Every fragment carries a BLAKE3 checksum. When a node receives a fragment, it recomputes the hash and compares it to the expected checksum. If they don’t match, the fragment is rejected. This catches both transmission errors and deliberate tampering.</p>
-<p>Fragments are stored in a <strong>content-addressable store (CAS)</strong> where each unique piece of data exists exactly once on disk, keyed by its BLAKE3 hash. A SQLite reference table maps logical fragment identifiers to CAS hashes, enabling automatic deduplication — if two tesseras share identical fragment data, only one copy is stored. Reference counting ensures data is cleaned up only when no tessera references it.</p>
-<h2 id="repair-loop"><a class="header" href="#repair-loop">Repair loop</a></h2>
-<p>The daemon runs a background repair loop every 24 hours (with random jitter to avoid network-wide storms). For each tessera it’s responsible for, the repair loop:</p>
-<ol>
-<li><strong>Requests attestations</strong> from known holders — each holder proves it still has the fragments by reporting their checksums</li>
-<li><strong>Falls back to ping</strong> if attestation fails — to distinguish between “node is down” and “node lost the data”</li>
-<li><strong>Checks local fragments</strong> — verifies integrity of any fragments stored locally by recomputing BLAKE3 checksums</li>
-<li><strong>Decides action</strong>:
-<ul>
-<li><strong>Healthy</strong> — all holders responded, all checksums valid, nothing to do</li>
-<li><strong>Needs replication</strong> — some holders are gone, find new peers and redistribute missing fragments</li>
-<li><strong>Corrupt local</strong> — a local fragment has bad data, fetch a replacement from the network</li>
-</ul>
-</li>
-</ol>
-<h2 id="reciprocity"><a class="header" href="#reciprocity">Reciprocity</a></h2>
-<p>Tesseras uses a <strong>bilateral reciprocity ledger</strong> to ensure fair storage exchange. There is no cryptocurrency, no blockchain, no global consensus — each node simply tracks its balance with each peer locally:</p>
-<pre><code>peer_a: +500 MB (they store 500 MB of mine)
-peer_b: -200 MB (I store 200 MB more of theirs than they store of mine)
-peer_c: 0 MB (balanced)
-</code></pre>
-<p>The rules are simple:</p>
-<ul>
-<li>Store 1 GB on the network → you should store roughly 1 GB for others</li>
-<li>Nodes with a positive balance (they store more for you) get priority when you need to distribute new fragments</li>
-<li>Free riders gradually lose redundancy — their fragments are deprioritized for repair, but never deleted</li>
-<li>When receiving a fragment, a node checks the sender’s deficit. If the sender owes too much storage, the fragment is rejected</li>
-<li>Institutional nodes (universities, archives) can operate altruistically with imbalanced ratios</li>
-</ul>
-<h2 id="maximum-tessera-size"><a class="header" href="#maximum-tessera-size">Maximum tessera size</a></h2>
-<p>The maximum tessera size is <strong>1 GB</strong>. This is a practical limit that keeps fragment sizes manageable and replication fast. For larger collections of memories, create multiple tesseras.</p>
-<h2 id="configuration"><a class="header" href="#configuration">Configuration</a></h2>
-<p>The daemon’s replication behavior can be tuned through configuration:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Parameter</th><th>Default</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>Repair interval</td><td>24 hours</td><td>How often the repair loop runs</td></tr>
-<tr><td>Repair jitter</td><td>2 hours</td><td>Random delay added to avoid network-wide storms</td></tr>
-<tr><td>Concurrent transfers</td><td>4</td><td>Maximum parallel fragment transfers</td></tr>
-<tr><td>Minimum free space</td><td>1 GB</td><td>Stop accepting fragments below this threshold</td></tr>
-<tr><td>Deficit allowance</td><td>256 MB</td><td>Maximum storage deficit before rejecting a peer’s fragments</td></tr>
-<tr><td>Per-peer limit</td><td>1 GB</td><td>Maximum total storage for any single peer</td></tr>
-</tbody>
-</table>
-</div>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="network-concepts.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="encryption.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="network-concepts.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="encryption.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/replication.html.gz b/book/en/replication.html.gz
deleted file mode 100644
index 658dc8f..0000000
--- a/book/en/replication.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/running-a-node.html b/book/en/running-a-node.html
deleted file mode 100644
index 480a611..0000000
--- a/book/en/running-a-node.html
+++ /dev/null
@@ -1,314 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Running a Node - Tesseras User Guide</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-ee09cfdc.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-9150d087.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Tesseras User Guide</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="running-a-node"><a class="header" href="#running-a-node">Running a Node</a></h1>
-<p>The <code>tesseras-daemon</code> binary runs a full Tesseras node that participates in the peer-to-peer network. It listens for connections over QUIC, joins the distributed hash table (DHT), and enables other nodes to discover and find tessera pointers.</p>
-<h2 id="starting-the-daemon"><a class="header" href="#starting-the-daemon">Starting the daemon</a></h2>
-<pre><code class="language-bash">tesseras-daemon
-</code></pre>
-<p>On first run, the daemon:</p>
-<ol>
-<li>Creates the data directory (<code>~/.local/share/tesseras</code> on Linux, <code>~/Library/Application Support/tesseras</code> on macOS)</li>
-<li>Generates a node identity with proof-of-work (takes about 1 second)</li>
-<li>Binds a QUIC listener on <code>0.0.0.0:4433</code></li>
-<li>Bootstraps into the network by contacting seed nodes</li>
-<li>Prints <code>daemon ready</code> when fully operational</li>
-</ol>
-<h2 id="command-line-options"><a class="header" href="#command-line-options">Command-line options</a></h2>
-<pre><code>tesseras-daemon [OPTIONS]
-</code></pre>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Option</th><th>Description</th><th>Default</th></tr>
-</thead>
-<tbody>
-<tr><td><code>-c, --config &lt;PATH&gt;</code></td><td>Path to a TOML config file</td><td>None (uses built-in defaults)</td></tr>
-<tr><td><code>-l, --listen &lt;ADDR&gt;</code></td><td>Address and port to listen on</td><td><code>0.0.0.0:4433</code></td></tr>
-<tr><td><code>-b, --bootstrap &lt;ADDRS&gt;</code></td><td>Comma-separated bootstrap addresses</td><td><code>boot1.tesseras.net:4433,boot2.tesseras.net:4433</code></td></tr>
-<tr><td><code>-d, --data-dir &lt;PATH&gt;</code></td><td>Data directory</td><td>Platform-specific (see above)</td></tr>
-</tbody>
-</table>
-</div>
-<p>CLI options override values from the config file.</p>
-<h2 id="examples"><a class="header" href="#examples">Examples</a></h2>
-<p>Run with defaults (join the public network):</p>
-<pre><code class="language-bash">tesseras-daemon
-</code></pre>
-<p>Run as a seed node (no bootstrap, other nodes connect to you):</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap ""
-</code></pre>
-<p>Run on a custom port with a specific data directory:</p>
-<pre><code class="language-bash">tesseras-daemon --listen 0.0.0.0:5000 --data-dir /var/lib/tesseras
-</code></pre>
-<p>Bootstrap from a specific node:</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap "192.168.1.50:4433"
-</code></pre>
-<p>Join a local network of multiple nodes:</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap "192.168.1.10:4433,192.168.1.11:4433"
-</code></pre>
-<h2 id="node-identity"><a class="header" href="#node-identity">Node identity</a></h2>
-<p>Each node has a unique identity stored in <code>&lt;data-dir&gt;/identity.key</code>. This file contains a 32-byte public key and an 8-byte proof-of-work nonce.</p>
-<p>The node ID is derived from the public key: <code>BLAKE3(pubkey || nonce)</code> truncated to 20 bytes. The nonce must produce a hash with 8 leading zero bits, which takes about 256 hash attempts. This lightweight proof-of-work makes creating thousands of fake identities expensive while costing legitimate users less than a second.</p>
-<p>The identity is generated automatically on first run and reused on subsequent runs. If you delete <code>identity.key</code>, a new identity will be generated.</p>
-<h2 id="logging"><a class="header" href="#logging">Logging</a></h2>
-<p>The daemon uses structured logging via <code>tracing</code>. Control the log level with the <code>RUST_LOG</code> environment variable:</p>
-<pre><code class="language-bash"># Default (info level)
-tesseras-daemon
-
-# Debug logging
-RUST_LOG=debug tesseras-daemon
-
-# Only show warnings and errors
-RUST_LOG=warn tesseras-daemon
-
-# Debug for DHT, info for everything else
-RUST_LOG=info,tesseras_dht=debug tesseras-daemon
-</code></pre>
-<h2 id="shutting-down"><a class="header" href="#shutting-down">Shutting down</a></h2>
-<p>Press <strong>Ctrl+C</strong> to initiate graceful shutdown. The daemon will:</p>
-<ol>
-<li>Stop accepting new connections</li>
-<li>Finish in-flight operations (up to 5 seconds)</li>
-<li>Close all QUIC connections</li>
-<li>Exit cleanly</li>
-</ol>
-<h2 id="firewall"><a class="header" href="#firewall">Firewall</a></h2>
-<p>The daemon communicates over UDP port 4433 (QUIC). If you’re behind a firewall, ensure this port is open for both inbound and outbound UDP traffic.</p>
-<pre><code class="language-bash"># Example: Linux with ufw
-sudo ufw allow 4433/udp
-</code></pre>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="commands/list.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="configuration.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="commands/list.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="configuration.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/en/running-a-node.html.gz b/book/en/running-a-node.html.gz
deleted file mode 100644
index f8181b2..0000000
--- a/book/en/running-a-node.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/searcher-c2a407aa.js b/book/en/searcher-c2a407aa.js
deleted file mode 100644
index 4a70ef4..0000000
--- a/book/en/searcher-c2a407aa.js
+++ /dev/null
@@ -1,555 +0,0 @@
-'use strict';
-
-/* global Mark, elasticlunr, path_to_root */
-
-window.search = window.search || {};
-(function search() {
- // Search functionality
- //
- // You can use !hasFocus() to prevent keyhandling in your key
- // event handlers while the user is typing their search.
-
- if (!Mark || !elasticlunr) {
- return;
- }
-
- // eslint-disable-next-line max-len
- // IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
- if (!String.prototype.startsWith) {
- String.prototype.startsWith = function(search, pos) {
- return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
- };
- }
-
- const search_wrap = document.getElementById('mdbook-search-wrapper'),
- searchbar_outer = document.getElementById('mdbook-searchbar-outer'),
- searchbar = document.getElementById('mdbook-searchbar'),
- searchresults = document.getElementById('mdbook-searchresults'),
- searchresults_outer = document.getElementById('mdbook-searchresults-outer'),
- searchresults_header = document.getElementById('mdbook-searchresults-header'),
- searchicon = document.getElementById('mdbook-search-toggle'),
- content = document.getElementById('mdbook-content'),
-
- // SVG text elements don't render if inside a <mark> tag.
- mark_exclude = ['text'],
- marker = new Mark(content),
- URL_SEARCH_PARAM = 'search',
- URL_MARK_PARAM = 'highlight';
-
- let current_searchterm = '',
- doc_urls = [],
- search_options = {
- bool: 'AND',
- expand: true,
- fields: {
- title: {boost: 1},
- body: {boost: 1},
- breadcrumbs: {boost: 0},
- },
- },
- searchindex = null,
- results_options = {
- teaser_word_count: 30,
- limit_results: 30,
- },
- teaser_count = 0;
-
- function hasFocus() {
- return searchbar === document.activeElement;
- }
-
- function removeChildren(elem) {
- while (elem.firstChild) {
- elem.removeChild(elem.firstChild);
- }
- }
-
- // Helper to parse a url into its building blocks.
- function parseURL(url) {
- const a = document.createElement('a');
- a.href = url;
- return {
- source: url,
- protocol: a.protocol.replace(':', ''),
- host: a.hostname,
- port: a.port,
- params: (function() {
- const ret = {};
- const seg = a.search.replace(/^\?/, '').split('&');
- for (const part of seg) {
- if (!part) {
- continue;
- }
- const s = part.split('=');
- ret[s[0]] = s[1];
- }
- return ret;
- })(),
- file: (a.pathname.match(/\/([^/?#]+)$/i) || ['', ''])[1],
- hash: a.hash.replace('#', ''),
- path: a.pathname.replace(/^([^/])/, '/$1'),
- };
- }
-
- // Helper to recreate a url string from its building blocks.
- function renderURL(urlobject) {
- let url = urlobject.protocol + '://' + urlobject.host;
- if (urlobject.port !== '') {
- url += ':' + urlobject.port;
- }
- url += urlobject.path;
- let joiner = '?';
- for (const prop in urlobject.params) {
- if (Object.prototype.hasOwnProperty.call(urlobject.params, prop)) {
- url += joiner + prop + '=' + urlobject.params[prop];
- joiner = '&';
- }
- }
- if (urlobject.hash !== '') {
- url += '#' + urlobject.hash;
- }
- return url;
- }
-
- // Helper to escape html special chars for displaying the teasers
- const escapeHTML = (function() {
- const MAP = {
- '&': '&amp;',
- '<': '&lt;',
- '>': '&gt;',
- '"': '&#34;',
- '\'': '&#39;',
- };
- const repl = function(c) {
- return MAP[c];
- };
- return function(s) {
- return s.replace(/[&<>'"]/g, repl);
- };
- })();
-
- function formatSearchMetric(count, searchterm) {
- if (count === 1) {
- return count + ' search result for \'' + searchterm + '\':';
- } else if (count === 0) {
- return 'No search results for \'' + searchterm + '\'.';
- } else {
- return count + ' search results for \'' + searchterm + '\':';
- }
- }
-
- function formatSearchResult(result, searchterms) {
- const teaser = makeTeaser(escapeHTML(result.doc.body), searchterms);
- teaser_count++;
-
- // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor
- const url = doc_urls[result.ref].split('#');
- if (url.length === 1) { // no anchor found
- url.push('');
- }
-
- // encodeURIComponent escapes all chars that could allow an XSS except
- // for '. Due to that we also manually replace ' with its url-encoded
- // representation (%27).
- const encoded_search = encodeURIComponent(searchterms.join(' ')).replace(/'/g, '%27');
-
- return '<a href="' + path_to_root + url[0] + '?' + URL_MARK_PARAM + '=' + encoded_search
- + '#' + url[1] + '" aria-details="mdbook-teaser_' + teaser_count + '">'
- + result.doc.breadcrumbs + '</a>'
- + '<span class="teaser" id="mdbook-teaser_' + teaser_count
- + '" aria-label="Search Result Teaser">' + teaser + '</span>';
- }
-
- function makeTeaser(body, searchterms) {
- // The strategy is as follows:
- // First, assign a value to each word in the document:
- // Words that correspond to search terms (stemmer aware): 40
- // Normal words: 2
- // First word in a sentence: 8
- // Then use a sliding window with a constant number of words and count the
- // sum of the values of the words within the window. Then use the window that got the
- // maximum sum. If there are multiple maximas, then get the last one.
- // Enclose the terms in <em>.
- const stemmed_searchterms = searchterms.map(function(w) {
- return elasticlunr.stemmer(w.toLowerCase());
- });
- const searchterm_weight = 40;
- const weighted = []; // contains elements of ["word", weight, index_in_document]
- // split in sentences, then words
- const sentences = body.toLowerCase().split('. ');
- let index = 0;
- let value = 0;
- let searchterm_found = false;
- for (const sentenceindex in sentences) {
- const words = sentences[sentenceindex].split(' ');
- value = 8;
- for (const wordindex in words) {
- const word = words[wordindex];
- if (word.length > 0) {
- for (const searchtermindex in stemmed_searchterms) {
- if (elasticlunr.stemmer(word).startsWith(
- stemmed_searchterms[searchtermindex])
- ) {
- value = searchterm_weight;
- searchterm_found = true;
- }
- }
- weighted.push([word, value, index]);
- value = 2;
- }
- index += word.length;
- index += 1; // ' ' or '.' if last word in sentence
- }
- index += 1; // because we split at a two-char boundary '. '
- }
-
- if (weighted.length === 0) {
- return body;
- }
-
- const window_weight = [];
- const window_size = Math.min(weighted.length, results_options.teaser_word_count);
-
- let cur_sum = 0;
- for (let wordindex = 0; wordindex < window_size; wordindex++) {
- cur_sum += weighted[wordindex][1];
- }
- window_weight.push(cur_sum);
- for (let wordindex = 0; wordindex < weighted.length - window_size; wordindex++) {
- cur_sum -= weighted[wordindex][1];
- cur_sum += weighted[wordindex + window_size][1];
- window_weight.push(cur_sum);
- }
-
- let max_sum_window_index = 0;
- if (searchterm_found) {
- let max_sum = 0;
- // backwards
- for (let i = window_weight.length - 1; i >= 0; i--) {
- if (window_weight[i] > max_sum) {
- max_sum = window_weight[i];
- max_sum_window_index = i;
- }
- }
- } else {
- max_sum_window_index = 0;
- }
-
- // add <em/> around searchterms
- const teaser_split = [];
- index = weighted[max_sum_window_index][2];
- for (let i = max_sum_window_index; i < max_sum_window_index + window_size; i++) {
- const word = weighted[i];
- if (index < word[2]) {
- // missing text from index to start of `word`
- teaser_split.push(body.substring(index, word[2]));
- index = word[2];
- }
- if (word[1] === searchterm_weight) {
- teaser_split.push('<em>');
- }
- index = word[2] + word[0].length;
- teaser_split.push(body.substring(word[2], index));
- if (word[1] === searchterm_weight) {
- teaser_split.push('</em>');
- }
- }
-
- return teaser_split.join('');
- }
-
- function init(config) {
- results_options = config.results_options;
- search_options = config.search_options;
- doc_urls = config.doc_urls;
- searchindex = elasticlunr.Index.load(config.index);
-
- searchbar_outer.classList.remove('searching');
-
- searchbar.focus();
-
- const searchterm = searchbar.value.trim();
- if (searchterm !== '') {
- searchbar.classList.add('active');
- doSearch(searchterm);
- }
- }
-
- function initSearchInteractions(config) {
- // Set up events
- searchicon.addEventListener('click', () => {
- searchIconClickHandler();
- }, false);
- searchbar.addEventListener('keyup', () => {
- searchbarKeyUpHandler();
- }, false);
- document.addEventListener('keydown', e => {
- globalKeyHandler(e);
- }, false);
- // If the user uses the browser buttons, do the same as if a reload happened
- window.onpopstate = () => {
- doSearchOrMarkFromUrl();
- };
- // Suppress "submit" events so the page doesn't reload when the user presses Enter
- document.addEventListener('submit', e => {
- e.preventDefault();
- }, false);
-
- // If reloaded, do the search or mark again, depending on the current url parameters
- doSearchOrMarkFromUrl();
-
- // Exported functions
- config.hasFocus = hasFocus;
- }
-
- initSearchInteractions(window.search);
-
- function unfocusSearchbar() {
- // hacky, but just focusing a div only works once
- const tmp = document.createElement('input');
- tmp.setAttribute('style', 'position: absolute; opacity: 0;');
- searchicon.appendChild(tmp);
- tmp.focus();
- tmp.remove();
- }
-
- // On reload or browser history backwards/forwards events, parse the url and do search or mark
- function doSearchOrMarkFromUrl() {
- // Check current URL for search request
- const url = parseURL(window.location.href);
- if (Object.prototype.hasOwnProperty.call(url.params, URL_SEARCH_PARAM)
- && url.params[URL_SEARCH_PARAM] !== '') {
- showSearch(true);
- searchbar.value = decodeURIComponent(
- (url.params[URL_SEARCH_PARAM] + '').replace(/\+/g, '%20'));
- searchbarKeyUpHandler(); // -> doSearch()
- } else {
- showSearch(false);
- }
-
- if (Object.prototype.hasOwnProperty.call(url.params, URL_MARK_PARAM)) {
- const words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' ');
- marker.mark(words, {
- exclude: mark_exclude,
- });
-
- const markers = document.querySelectorAll('mark');
- const hide = () => {
- for (let i = 0; i < markers.length; i++) {
- markers[i].classList.add('fade-out');
- window.setTimeout(() => {
- marker.unmark();
- }, 300);
- }
- };
-
- for (let i = 0; i < markers.length; i++) {
- markers[i].addEventListener('click', hide);
- }
- }
- }
-
- // Eventhandler for keyevents on `document`
- function globalKeyHandler(e) {
- if (e.altKey ||
- e.ctrlKey ||
- e.metaKey ||
- e.shiftKey ||
- e.target.type === 'textarea' ||
- e.target.type === 'text' ||
- !hasFocus() && /^(?:input|select|textarea)$/i.test(e.target.nodeName)
- ) {
- return;
- }
-
- if (e.key === 'Escape') {
- e.preventDefault();
- searchbar.classList.remove('active');
- setSearchUrlParameters('',
- searchbar.value.trim() !== '' ? 'push' : 'replace');
- if (hasFocus()) {
- unfocusSearchbar();
- }
- showSearch(false);
- marker.unmark();
- } else if (!hasFocus() && (e.key === 's' || e.key === '/')) {
- e.preventDefault();
- showSearch(true);
- window.scrollTo(0, 0);
- searchbar.select();
- } else if (hasFocus() && (e.key === 'ArrowDown'
- || e.key === 'Enter')) {
- e.preventDefault();
- const first = searchresults.firstElementChild;
- if (first !== null) {
- unfocusSearchbar();
- first.classList.add('focus');
- if (e.key === 'Enter') {
- window.location.assign(first.querySelector('a'));
- }
- }
- } else if (!hasFocus() && (e.key === 'ArrowDown'
- || e.key === 'ArrowUp'
- || e.key === 'Enter')) {
- // not `:focus` because browser does annoying scrolling
- const focused = searchresults.querySelector('li.focus');
- if (!focused) {
- return;
- }
- e.preventDefault();
- if (e.key === 'ArrowDown') {
- const next = focused.nextElementSibling;
- if (next) {
- focused.classList.remove('focus');
- next.classList.add('focus');
- }
- } else if (e.key === 'ArrowUp') {
- focused.classList.remove('focus');
- const prev = focused.previousElementSibling;
- if (prev) {
- prev.classList.add('focus');
- } else {
- searchbar.select();
- }
- } else { // Enter
- window.location.assign(focused.querySelector('a'));
- }
- }
- }
-
- function loadSearchScript(url, id) {
- if (document.getElementById(id)) {
- return;
- }
- searchbar_outer.classList.add('searching');
-
- const script = document.createElement('script');
- script.src = url;
- script.id = id;
- script.onload = () => init(window.search);
- script.onerror = error => {
- console.error(`Failed to load \`${url}\`: ${error}`);
- };
- document.head.append(script);
- }
-
- function showSearch(yes) {
- if (yes) {
- loadSearchScript(
- window.path_to_searchindex_js ||
- path_to_root + 'searchindex-ee09cfdc.js',
- 'mdbook-search-index');
- search_wrap.classList.remove('hidden');
- searchicon.setAttribute('aria-expanded', 'true');
- } else {
- search_wrap.classList.add('hidden');
- searchicon.setAttribute('aria-expanded', 'false');
- const results = searchresults.children;
- for (let i = 0; i < results.length; i++) {
- results[i].classList.remove('focus');
- }
- }
- }
-
- function showResults(yes) {
- if (yes) {
- searchresults_outer.classList.remove('hidden');
- } else {
- searchresults_outer.classList.add('hidden');
- }
- }
-
- // Eventhandler for search icon
- function searchIconClickHandler() {
- if (search_wrap.classList.contains('hidden')) {
- showSearch(true);
- window.scrollTo(0, 0);
- searchbar.select();
- } else {
- showSearch(false);
- }
- }
-
- // Eventhandler for keyevents while the searchbar is focused
- function searchbarKeyUpHandler() {
- const searchterm = searchbar.value.trim();
- if (searchterm !== '') {
- searchbar.classList.add('active');
- doSearch(searchterm);
- } else {
- searchbar.classList.remove('active');
- showResults(false);
- removeChildren(searchresults);
- }
-
- setSearchUrlParameters(searchterm, 'push_if_new_search_else_replace');
-
- // Remove marks
- marker.unmark();
- }
-
- // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and
- // `#heading-anchor`. `action` can be one of "push", "replace",
- // "push_if_new_search_else_replace" and replaces or pushes a new browser history item.
- // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet.
- function setSearchUrlParameters(searchterm, action) {
- const url = parseURL(window.location.href);
- const first_search = !Object.prototype.hasOwnProperty.call(url.params, URL_SEARCH_PARAM);
-
- if (searchterm !== '' || action === 'push_if_new_search_else_replace') {
- url.params[URL_SEARCH_PARAM] = searchterm;
- delete url.params[URL_MARK_PARAM];
- url.hash = '';
- } else {
- delete url.params[URL_MARK_PARAM];
- delete url.params[URL_SEARCH_PARAM];
- }
- // A new search will also add a new history item, so the user can go back
- // to the page prior to searching. A updated search term will only replace
- // the url.
- if (action === 'push' || action === 'push_if_new_search_else_replace' && first_search ) {
- history.pushState({}, document.title, renderURL(url));
- } else if (action === 'replace' ||
- action === 'push_if_new_search_else_replace' &&
- !first_search
- ) {
- history.replaceState({}, document.title, renderURL(url));
- }
- }
-
- function doSearch(searchterm) {
- // Don't search the same twice
- if (current_searchterm === searchterm) {
- return;
- }
- searchbar_outer.classList.add('searching');
- if (searchindex === null) {
- return;
- }
-
- current_searchterm = searchterm;
-
- // Do the actual search
- const results = searchindex.search(searchterm, search_options);
- const resultcount = Math.min(results.length, results_options.limit_results);
-
- // Display search metrics
- searchresults_header.innerText = formatSearchMetric(resultcount, searchterm);
-
- // Clear and insert results
- const searchterms = searchterm.split(' ');
- removeChildren(searchresults);
- for (let i = 0; i < resultcount ; i++) {
- const resultElem = document.createElement('li');
- resultElem.innerHTML = formatSearchResult(results[i], searchterms);
- searchresults.appendChild(resultElem);
- }
-
- // Display results
- showResults(true);
- searchbar_outer.classList.remove('searching');
- }
-
- // Exported functions
- search.hasFocus = hasFocus;
-})(window.search);
diff --git a/book/en/searcher-c2a407aa.js.gz b/book/en/searcher-c2a407aa.js.gz
deleted file mode 100644
index 8990f7d..0000000
--- a/book/en/searcher-c2a407aa.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/searchindex-ee09cfdc.js b/book/en/searchindex-ee09cfdc.js
deleted file mode 100644
index a227a71..0000000
--- a/book/en/searchindex-ee09cfdc.js
+++ /dev/null
@@ -1 +0,0 @@
-window.search = Object.assign(window.search, JSON.parse('{"doc_urls":["introduction.html#introduction","introduction.html#what-is-a-tessera","introduction.html#core-philosophy","introduction.html#current-status-phase-4","introduction.html#key-concepts","installation.html#installation","installation.html#prerequisites","installation.html#rust","installation.html#sqlite","installation.html#optional-tools","installation.html#build-from-source","installation.html#verify-installation","installation.html#shell-completions","installation.html#flutter-app","installation.html#flutter-prerequisites","installation.html#build-the-app","installation.html#network-ports","installation.html#next-steps","quick-start.html#quick-start","quick-start.html#1-initialize-your-identity","quick-start.html#2-prepare-your-files","quick-start.html#3-preview-with-dry-run","quick-start.html#4-create-a-tessera","quick-start.html#5-list-your-tesseras","quick-start.html#6-verify-integrity","quick-start.html#7-export-a-self-contained-copy","quick-start.html#8-inspect-the-export","commands/init.html#tes-init","commands/init.html#usage","commands/init.html#description","commands/init.html#options","commands/init.html#idempotent","commands/init.html#custom-data-directory","commands/init.html#what-happens-under-the-hood","commands/create.html#tes-create","commands/create.html#usage","commands/create.html#arguments","commands/create.html#options","commands/create.html#supported-file-formats","commands/create.html#memory-type-inference","commands/create.html#examples","commands/create.html#preview-before-creating","commands/create.html#create-with-metadata","commands/create.html#non-interactive-mode","commands/create.html#visibility-levels","commands/create.html#what-happens-under-the-hood","commands/verify.html#tes-verify","commands/verify.html#usage","commands/verify.html#arguments","commands/verify.html#options","commands/verify.html#what-it-checks","commands/verify.html#exit-codes","commands/verify.html#examples","commands/verify.html#successful-verification","commands/verify.html#failed-verification","commands/verify.html#use-cases","commands/export.html#tes-export","commands/export.html#usage","commands/export.html#arguments","commands/export.html#options","commands/export.html#output-structure","commands/export.html#example","commands/export.html#key-feature-self-contained","commands/export.html#use-cases","commands/list.html#tes-list","commands/list.html#usage","commands/list.html#options","commands/list.html#output","commands/list.html#example","commands/list.html#empty-database","running-a-node.html#running-a-node","running-a-node.html#starting-the-daemon","running-a-node.html#command-line-options","running-a-node.html#examples","running-a-node.html#node-identity","running-a-node.html#logging","running-a-node.html#shutting-down","running-a-node.html#firewall","configuration.html#configuration","configuration.html#full-example","configuration.html#sections","configuration.html#node","configuration.html#dht","configuration.html#bootstrap","configuration.html#network","configuration.html#observability","configuration.html#ipv6-support","configuration.html#listening-on-ipv6","configuration.html#bootstrap-with-ipv6","configuration.html#ipv6_v6only-behavior-by-os","configuration.html#minimal-config","network-concepts.html#network-concepts","network-concepts.html#how-nodes-find-each-other","network-concepts.html#what-the-dht-stores","network-concepts.html#node-identity-and-proof-of-work","network-concepts.html#xor-distance","network-concepts.html#transport-quic","network-concepts.html#bootstrap-process","network-concepts.html#node-types","replication.html#replication-and-repair","replication.html#why-replication-matters","replication.html#erasure-coding","replication.html#fragmentation-tiers","replication.html#how-distribution-works","replication.html#fragment-verification","replication.html#repair-loop","replication.html#reciprocity","replication.html#maximum-tessera-size","replication.html#configuration","encryption.html#encryption-and-sealed-tesseras","encryption.html#how-encryption-works","encryption.html#hybrid-post-quantum-key-encapsulation","encryption.html#authenticated-associated-data-aad","encryption.html#sealed-tesseras-time-capsules","encryption.html#what-about-the-keys","encryption.html#design-principles","heir-recovery.html#heir-key-recovery","heir-recovery.html#how-it-works","heir-recovery.html#creating-heir-shares","heir-recovery.html#reconstructing-from-shares","heir-recovery.html#inspecting-a-share","heir-recovery.html#security-considerations","heir-recovery.html#design-principles","nat-traversal.html#nat-traversal","nat-traversal.html#nat-type-discovery","nat-traversal.html#hole-punching","nat-traversal.html#relay-fallback","nat-traversal.html#address-migration","nat-traversal.html#configuration","nat-traversal.html#mobile-reconnection","nat-traversal.html#monitoring","docker.html#docker","docker.html#building-the-image","docker.html#running-a-single-node","docker.html#running-as-a-seed-node","docker.html#multi-node-network-with-docker-compose","docker.html#custom-configuration"],"index":{"documentStore":{"docInfo":{"0":{"body":26,"breadcrumbs":2,"title":1},"1":{"body":62,"breadcrumbs":2,"title":1},"10":{"body":44,"breadcrumbs":3,"title":2},"100":{"body":26,"breadcrumbs":4,"title":2},"101":{"body":58,"breadcrumbs":4,"title":2},"102":{"body":64,"breadcrumbs":4,"title":2},"103":{"body":68,"breadcrumbs":4,"title":2},"104":{"body":68,"breadcrumbs":4,"title":2},"105":{"body":80,"breadcrumbs":4,"title":2},"106":{"body":93,"breadcrumbs":3,"title":1},"107":{"body":19,"breadcrumbs":5,"title":3},"108":{"body":65,"breadcrumbs":3,"title":1},"109":{"body":37,"breadcrumbs":6,"title":3},"11":{"body":57,"breadcrumbs":3,"title":2},"110":{"body":47,"breadcrumbs":5,"title":2},"111":{"body":67,"breadcrumbs":8,"title":5},"112":{"body":50,"breadcrumbs":7,"title":4},"113":{"body":56,"breadcrumbs":7,"title":4},"114":{"body":54,"breadcrumbs":4,"title":1},"115":{"body":50,"breadcrumbs":5,"title":2},"116":{"body":22,"breadcrumbs":6,"title":3},"117":{"body":50,"breadcrumbs":4,"title":1},"118":{"body":84,"breadcrumbs":6,"title":3},"119":{"body":53,"breadcrumbs":5,"title":2},"12":{"body":29,"breadcrumbs":3,"title":2},"120":{"body":35,"breadcrumbs":5,"title":2},"121":{"body":102,"breadcrumbs":5,"title":2},"122":{"body":57,"breadcrumbs":5,"title":2},"123":{"body":74,"breadcrumbs":4,"title":2},"124":{"body":75,"breadcrumbs":5,"title":3},"125":{"body":103,"breadcrumbs":4,"title":2},"126":{"body":84,"breadcrumbs":4,"title":2},"127":{"body":29,"breadcrumbs":4,"title":2},"128":{"body":66,"breadcrumbs":3,"title":1},"129":{"body":68,"breadcrumbs":4,"title":2},"13":{"body":7,"breadcrumbs":3,"title":2},"130":{"body":35,"breadcrumbs":3,"title":1},"131":{"body":15,"breadcrumbs":2,"title":1},"132":{"body":25,"breadcrumbs":3,"title":2},"133":{"body":42,"breadcrumbs":4,"title":3},"134":{"body":19,"breadcrumbs":4,"title":3},"135":{"body":67,"breadcrumbs":6,"title":5},"136":{"body":27,"breadcrumbs":3,"title":2},"14":{"body":45,"breadcrumbs":3,"title":2},"15":{"body":37,"breadcrumbs":3,"title":2},"16":{"body":19,"breadcrumbs":3,"title":2},"17":{"body":16,"breadcrumbs":3,"title":2},"18":{"body":12,"breadcrumbs":4,"title":2},"19":{"body":34,"breadcrumbs":5,"title":3},"2":{"body":52,"breadcrumbs":3,"title":2},"20":{"body":32,"breadcrumbs":5,"title":3},"21":{"body":10,"breadcrumbs":6,"title":4},"22":{"body":21,"breadcrumbs":5,"title":3},"23":{"body":15,"breadcrumbs":5,"title":3},"24":{"body":23,"breadcrumbs":5,"title":3},"25":{"body":13,"breadcrumbs":7,"title":5},"26":{"body":58,"breadcrumbs":5,"title":3},"27":{"body":4,"breadcrumbs":4,"title":2},"28":{"body":2,"breadcrumbs":3,"title":1},"29":{"body":31,"breadcrumbs":3,"title":1},"3":{"body":103,"breadcrumbs":5,"title":4},"30":{"body":11,"breadcrumbs":3,"title":1},"31":{"body":19,"breadcrumbs":3,"title":1},"32":{"body":14,"breadcrumbs":5,"title":3},"33":{"body":26,"breadcrumbs":5,"title":3},"34":{"body":4,"breadcrumbs":4,"title":2},"35":{"body":4,"breadcrumbs":3,"title":1},"36":{"body":7,"breadcrumbs":3,"title":1},"37":{"body":48,"breadcrumbs":3,"title":1},"38":{"body":31,"breadcrumbs":5,"title":3},"39":{"body":24,"breadcrumbs":5,"title":3},"4":{"body":84,"breadcrumbs":3,"title":2},"40":{"body":0,"breadcrumbs":3,"title":1},"41":{"body":5,"breadcrumbs":5,"title":3},"42":{"body":14,"breadcrumbs":4,"title":2},"43":{"body":8,"breadcrumbs":5,"title":3},"44":{"body":12,"breadcrumbs":4,"title":2},"45":{"body":36,"breadcrumbs":5,"title":3},"46":{"body":4,"breadcrumbs":4,"title":2},"47":{"body":3,"breadcrumbs":3,"title":1},"48":{"body":9,"breadcrumbs":3,"title":1},"49":{"body":11,"breadcrumbs":3,"title":1},"5":{"body":5,"breadcrumbs":2,"title":1},"50":{"body":16,"breadcrumbs":3,"title":1},"51":{"body":16,"breadcrumbs":4,"title":2},"52":{"body":0,"breadcrumbs":3,"title":1},"53":{"body":15,"breadcrumbs":4,"title":2},"54":{"body":15,"breadcrumbs":4,"title":2},"55":{"body":25,"breadcrumbs":4,"title":2},"56":{"body":5,"breadcrumbs":4,"title":2},"57":{"body":4,"breadcrumbs":3,"title":1},"58":{"body":12,"breadcrumbs":3,"title":1},"59":{"body":11,"breadcrumbs":3,"title":1},"6":{"body":0,"breadcrumbs":2,"title":1},"60":{"body":64,"breadcrumbs":4,"title":2},"61":{"body":7,"breadcrumbs":3,"title":1},"62":{"body":47,"breadcrumbs":6,"title":4},"63":{"body":31,"breadcrumbs":4,"title":2},"64":{"body":3,"breadcrumbs":4,"title":2},"65":{"body":2,"breadcrumbs":3,"title":1},"66":{"body":11,"breadcrumbs":3,"title":1},"67":{"body":35,"breadcrumbs":3,"title":1},"68":{"body":31,"breadcrumbs":3,"title":1},"69":{"body":6,"breadcrumbs":4,"title":2},"7":{"body":41,"breadcrumbs":2,"title":1},"70":{"body":26,"breadcrumbs":4,"title":2},"71":{"body":35,"breadcrumbs":4,"title":2},"72":{"body":48,"breadcrumbs":5,"title":3},"73":{"body":45,"breadcrumbs":3,"title":1},"74":{"body":66,"breadcrumbs":4,"title":2},"75":{"body":35,"breadcrumbs":3,"title":1},"76":{"body":21,"breadcrumbs":4,"title":2},"77":{"body":25,"breadcrumbs":3,"title":1},"78":{"body":29,"breadcrumbs":2,"title":1},"79":{"body":34,"breadcrumbs":3,"title":2},"8":{"body":94,"breadcrumbs":2,"title":1},"80":{"body":0,"breadcrumbs":2,"title":1},"81":{"body":28,"breadcrumbs":2,"title":1},"82":{"body":69,"breadcrumbs":2,"title":1},"83":{"body":28,"breadcrumbs":2,"title":1},"84":{"body":16,"breadcrumbs":2,"title":1},"85":{"body":21,"breadcrumbs":2,"title":1},"86":{"body":12,"breadcrumbs":3,"title":2},"87":{"body":43,"breadcrumbs":3,"title":2},"88":{"body":20,"breadcrumbs":3,"title":2},"89":{"body":46,"breadcrumbs":4,"title":3},"9":{"body":28,"breadcrumbs":3,"title":2},"90":{"body":19,"breadcrumbs":3,"title":2},"91":{"body":21,"breadcrumbs":4,"title":2},"92":{"body":61,"breadcrumbs":5,"title":3},"93":{"body":39,"breadcrumbs":4,"title":2},"94":{"body":56,"breadcrumbs":6,"title":4},"95":{"body":60,"breadcrumbs":4,"title":2},"96":{"body":56,"breadcrumbs":4,"title":2},"97":{"body":55,"breadcrumbs":4,"title":2},"98":{"body":73,"breadcrumbs":4,"title":2},"99":{"body":24,"breadcrumbs":4,"title":2}},"docs":{"0":{"body":"Tesseras is a peer-to-peer network for preserving human memories across millennia. Each person creates a tessera — a self-contained time capsule of memories (photos, audio, video, text) that survives independently of any software, company, or infrastructure.","breadcrumbs":"Introduction » Introduction","id":"0","title":"Introduction"},"1":{"body":"The word tessera comes from the small tiles used to make mosaics in the ancient world. In Tesseras, each tessera is a collection of memories packaged into a format designed to be understood even thousands of years from now, without any special software. A tessera contains: Memories — photos (JPEG), audio recordings (WAV), video (WebM), and text (plain UTF-8) Metadata — when and where each memory was created, who it involves, and what it means Identity — cryptographic signatures proving who created it Decoding instructions — plain-text explanations of every format used, so future humans can read the contents","breadcrumbs":"Introduction » What is a tessera?","id":"1","title":"What is a tessera?"},"10":{"body":"Clone the repository and install the binaries: git clone https://git.sr.ht/~ijanc/tesseras\\ncd tesseras\\ncargo install --path crates/tesseras-cli\\ncargo install --path crates/tesseras-daemon Or, if you have just installed: just install This installs two binaries to ~/.cargo/bin/ and configures shell auto-completions: tes — CLI tool for creating, verifying, and exporting tesseras tesseras-daemon — full node daemon that participates in the P2P network","breadcrumbs":"Installation » Build from source","id":"10","title":"Build from source"},"100":{"body":"A tessera stored on a single machine dies when that machine dies. Tesseras solves this by splitting data into fragments, spreading them across multiple peers, and continuously verifying that enough copies exist. If some fragments disappear, the network repairs itself automatically.","breadcrumbs":"Replication and Repair » Why replication matters","id":"100","title":"Why replication matters"},"101":{"body":"Tesseras uses Reed-Solomon erasure coding to create redundant fragments. The idea is simple: from N data fragments, generate M extra parity fragments. Any N of the N+M total fragments can reconstruct the original data. This is far more storage-efficient than simple replication. Storing 3 complete copies of a 100 MB file costs 300 MB. With 16 data + 8 parity fragments, you get stronger protection (can lose up to 8 of 24 fragments — 33%) for only 150 MB total.","breadcrumbs":"Replication and Repair » Erasure coding","id":"101","title":"Erasure coding"},"102":{"body":"Not every tessera is treated the same way. Small files don’t benefit from erasure coding overhead, so Tesseras uses three tiers: Tier Size Strategy Fragments Small < 4 MB Whole-file replication 7 copies of the complete file Medium 4–256 MB Reed-Solomon 16+8 16 data + 8 parity = 24 fragments Large ≥ 256 MB Reed-Solomon 48+24 48 data + 24 parity = 72 fragments All tiers target a replication factor of 7 — meaning fragments are distributed to 7 different peers.","breadcrumbs":"Replication and Repair » Fragmentation tiers","id":"102","title":"Fragmentation tiers"},"103":{"body":"When you create a tessera and the daemon replicates it, this is what happens: Encode — the tessera data is split into fragments according to its size tier Find peers — the daemon queries the DHT for the closest nodes to the tessera’s hash Subnet diversity — peers are filtered so that no more than a few come from the same network subnet (to avoid correlated failures if a datacenter goes down) Distribute — fragments are pushed to the selected peers in round-robin order Acknowledge — each peer validates the fragment’s checksum and confirms receipt The tessera owner pushes fragments to peers. Peers don’t pull — this keeps the protocol simple and ensures immediate distribution.","breadcrumbs":"Replication and Repair » How distribution works","id":"103","title":"How distribution works"},"104":{"body":"Every fragment carries a BLAKE3 checksum. When a node receives a fragment, it recomputes the hash and compares it to the expected checksum. If they don’t match, the fragment is rejected. This catches both transmission errors and deliberate tampering. Fragments are stored in a content-addressable store (CAS) where each unique piece of data exists exactly once on disk, keyed by its BLAKE3 hash. A SQLite reference table maps logical fragment identifiers to CAS hashes, enabling automatic deduplication — if two tesseras share identical fragment data, only one copy is stored. Reference counting ensures data is cleaned up only when no tessera references it.","breadcrumbs":"Replication and Repair » Fragment verification","id":"104","title":"Fragment verification"},"105":{"body":"The daemon runs a background repair loop every 24 hours (with random jitter to avoid network-wide storms). For each tessera it’s responsible for, the repair loop: Requests attestations from known holders — each holder proves it still has the fragments by reporting their checksums Falls back to ping if attestation fails — to distinguish between “node is down” and “node lost the data” Checks local fragments — verifies integrity of any fragments stored locally by recomputing BLAKE3 checksums Decides action: Healthy — all holders responded, all checksums valid, nothing to do Needs replication — some holders are gone, find new peers and redistribute missing fragments Corrupt local — a local fragment has bad data, fetch a replacement from the network","breadcrumbs":"Replication and Repair » Repair loop","id":"105","title":"Repair loop"},"106":{"body":"Tesseras uses a bilateral reciprocity ledger to ensure fair storage exchange. There is no cryptocurrency, no blockchain, no global consensus — each node simply tracks its balance with each peer locally: peer_a: +500 MB (they store 500 MB of mine)\\npeer_b: -200 MB (I store 200 MB more of theirs than they store of mine)\\npeer_c: 0 MB (balanced) The rules are simple: Store 1 GB on the network → you should store roughly 1 GB for others Nodes with a positive balance (they store more for you) get priority when you need to distribute new fragments Free riders gradually lose redundancy — their fragments are deprioritized for repair, but never deleted When receiving a fragment, a node checks the sender’s deficit. If the sender owes too much storage, the fragment is rejected Institutional nodes (universities, archives) can operate altruistically with imbalanced ratios","breadcrumbs":"Replication and Repair » Reciprocity","id":"106","title":"Reciprocity"},"107":{"body":"The maximum tessera size is 1 GB. This is a practical limit that keeps fragment sizes manageable and replication fast. For larger collections of memories, create multiple tesseras.","breadcrumbs":"Replication and Repair » Maximum tessera size","id":"107","title":"Maximum tessera size"},"108":{"body":"The daemon’s replication behavior can be tuned through configuration: Parameter Default Description Repair interval 24 hours How often the repair loop runs Repair jitter 2 hours Random delay added to avoid network-wide storms Concurrent transfers 4 Maximum parallel fragment transfers Minimum free space 1 GB Stop accepting fragments below this threshold Deficit allowance 256 MB Maximum storage deficit before rejecting a peer’s fragments Per-peer limit 1 GB Maximum total storage for any single peer","breadcrumbs":"Replication and Repair » Configuration","id":"108","title":"Configuration"},"109":{"body":"Most tesseras are public — designed to be accessible to anyone, forever. But some memories need privacy. Tesseras supports two encrypted visibility modes: Private — only the creator (and their heirs) can ever access the content Sealed — the content is time-locked and becomes accessible after a specific date Public tesseras are never encrypted. Availability is more important than secrecy for preservation.","breadcrumbs":"Encryption and Sealed Tesseras » Encryption and Sealed Tesseras","id":"109","title":"Encryption and Sealed Tesseras"},"11":{"body":"tes --help You should see: Create and preserve human memories Usage: tes [OPTIONS] <COMMAND> Commands: init Initialize identity and local database create Create a tessera from a directory of files verify Verify integrity of a stored tessera export Export tessera to a self-contained directory list List local tesseras help Print this message or the help of the given subcommand(s) Options: --data-dir <DATA_DIR> Base directory for data storage [default: ~/.tesseras] -h, --help Print help","breadcrumbs":"Installation » Verify installation","id":"11","title":"Verify installation"},"110":{"body":"When you create a private or sealed tessera, the following happens: A random content key (256-bit) is generated Each memory file is encrypted with AES-256-GCM using that content key The content key is wrapped in a sealed key envelope using your encryption public key The wrapped key is stored alongside the encrypted content Only the holder of the corresponding private key can unwrap the content key and decrypt the content.","breadcrumbs":"Encryption and Sealed Tesseras » How encryption works","id":"110","title":"How encryption works"},"111":{"body":"The sealed key envelope uses a hybrid Key Encapsulation Mechanism (KEM) combining two algorithms: X25519 — a well-tested classical elliptic curve key exchange ML-KEM-768 — a NIST-standardized post-quantum lattice-based KEM (formerly Kyber) Both algorithms produce shared secrets that are combined using BLAKE3 key derivation. An attacker must break both algorithms to recover the content key. This follows the same principle as Tesseras’ dual signatures (Ed25519 + ML-DSA): we don’t know which cryptographic assumptions will hold over centuries, so we hedge our bets.","breadcrumbs":"Encryption and Sealed Tesseras » Hybrid post-quantum key encapsulation","id":"111","title":"Hybrid post-quantum key encapsulation"},"112":{"body":"AES-256-GCM supports authenticated associated data — extra information that is verified during decryption but not encrypted. Tesseras binds the following into the AAD: The content hash of the tessera (always) The open_after timestamp (for sealed tesseras only) This prevents ciphertext swapping attacks: an attacker cannot copy encrypted content from one tessera to another, because the AAD will not match and decryption will fail. For sealed tesseras, this also means you cannot change the seal date — the timestamp is cryptographically bound to the ciphertext.","breadcrumbs":"Encryption and Sealed Tesseras » Authenticated associated data (AAD)","id":"112","title":"Authenticated associated data (AAD)"},"113":{"body":"A sealed tessera is a true time capsule. When you create one, you specify an open_after date. The content is encrypted and the key is sealed in an envelope that only you can open. When the open_after date passes, the owner publishes the content key as a signed Key Publication — a standalone artifact containing the key, the tessera hash, and the owner’s signature. Other nodes can verify the signature and use the published key to decrypt the content. The tessera’s manifest is never modified. The Key Publication is a separate document, preserving the immutable, content-addressed nature of tesseras.","breadcrumbs":"Encryption and Sealed Tesseras » Sealed tesseras: time capsules","id":"113","title":"Sealed tesseras: time capsules"},"114":{"body":"Each identity now includes an encryption keypair alongside the signing keypair: Key type Algorithm Purpose Ed25519 Classical Signing manifests and key publications ML-DSA Post-quantum Signing (when enabled) X25519 Classical Key encapsulation (encryption) ML-KEM-768 Post-quantum Key encapsulation (encryption) The encryption keypair is generated when the identity is created. The public half is stored in the tessera’s identity directory; the private half stays on the owner’s device.","breadcrumbs":"Encryption and Sealed Tesseras » What about the keys?","id":"114","title":"What about the keys?"},"115":{"body":"Encrypt as little as possible — only private and sealed content is encrypted. Public memories stay open for long-term accessibility. Dual algorithms from day one — both classical and post-quantum cryptography, so content is protected even if one algorithm is broken. Immutable manifests — keys are published separately, never by modifying existing data. Fail closed — the system rejects attempts to create private or sealed tesseras without encryption keys.","breadcrumbs":"Encryption and Sealed Tesseras » Design principles","id":"115","title":"Design principles"},"116":{"body":"Your tesseras can survive infrastructure failures, quantum computers, and centuries of time. But what happens when you can no longer access your own keys? Tesseras uses Shamir’s Secret Sharing to let you distribute your cryptographic identity to trusted heirs.","breadcrumbs":"Heir Key Recovery » Heir Key Recovery","id":"116","title":"Heir Key Recovery"},"117":{"body":"Shamir’s Secret Sharing splits a secret into N shares with a threshold T. Any T shares can reconstruct the original secret. Fewer than T shares reveal nothing — this is information-theoretically secure, not just computationally hard to break. For example, with threshold 2 and 3 total shares: Give share 1 to your spouse Give share 2 to your sibling Give share 3 to your lawyer Any two of them can recover your identity. A single share alone is useless.","breadcrumbs":"Heir Key Recovery » How it works","id":"117","title":"How it works"},"118":{"body":"tes heir create --threshold 2 --shares 3 This splits your Ed25519 identity key into 3 shares (requiring 2 to reconstruct) and saves them to ./heir-shares/: heir-shares/\\n├── heir_share_1.bin # MessagePack binary\\n├── heir_share_1.txt # Human-readable base64 text\\n├── heir_share_2.bin\\n├── heir_share_2.txt\\n├── heir_share_3.bin\\n└── heir_share_3.txt Each share is generated in two formats: Binary ( .bin) — compact MessagePack, suitable for USB drives or digital storage Text ( .txt) — base64 with human-readable header, suitable for printing on paper The text format looks like this: --- TESSERAS HEIR SHARE ---\\nFormat: v1\\nOwner: a1b2c3d4e5f6a7b8 (fingerprint)\\nShare: 1 of 3 (threshold: 2)\\nSession: 9f8e7d6c5b4a3210\\nCreated: 2026-02-15 <base64-encoded data>\\n--- END HEIR SHARE ---","breadcrumbs":"Heir Key Recovery » Creating heir shares","id":"118","title":"Creating heir shares"},"119":{"body":"When heirs need to recover the identity: tes heir reconstruct heir_share_1.txt heir_share_2.bin --output-dir ./recovered-keys The command auto-detects whether each file is binary or text format. It validates that all shares belong to the same session and owner, verifies checksums, and reconstructs the Ed25519 keypair. To install the recovered keys as the active identity: tes heir reconstruct share1.txt share2.txt --output-dir ./recovered --install This backs up the current identity before replacing it.","breadcrumbs":"Heir Key Recovery » Reconstructing from shares","id":"119","title":"Reconstructing from shares"},"12":{"body":"The just install command configures completions automatically. If you installed manually, generate completions for your shell: # Fish\\ntes completions fish > ~/.config/fish/completions/tes.fish # Zsh\\ntes completions zsh > \\"${XDG_DATA_HOME:-$HOME/.local/share}/zsh/site-functions/_tes\\" # Bash\\ntes completions bash > \\"${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion/completions/tes\\"","breadcrumbs":"Installation » Shell completions","id":"12","title":"Shell completions"},"120":{"body":"To view metadata about a share without exposing secret data: tes heir info heir_share_1.txt Output: Heir Share Information: Format version: 1 Share: 1 of 3 (threshold: 2) Session: 9f8e7d6c5b4a3210 Owner fingerprint: a1b2c3d4e5f6a7b8 Share data size: 34 bytes Checksum: valid","breadcrumbs":"Heir Key Recovery » Inspecting a share","id":"120","title":"Inspecting a share"},"121":{"body":"Threshold choice: a threshold of 2-of-3 or 3-of-5 is recommended for most people. Higher thresholds are more secure but require more heirs to cooperate. Physical storage: print the .txt files on acid-free paper and store in separate physical locations (safe deposit boxes, different homes). Paper survives decades without degradation. Never store shares together: the entire point of splitting is distribution. Keeping all shares in one place defeats the purpose. Session isolation: each heir create call generates a fresh session ID. Shares from different sessions cannot be mixed — this prevents confusion after key rotations. Checksum verification: each share includes a BLAKE3 checksum. Corrupted shares (OCR errors, bit rot) are detected before reconstruction is attempted. Re-split after key changes: if you regenerate your identity, create new heir shares and securely destroy the old ones.","breadcrumbs":"Heir Key Recovery » Security considerations","id":"121","title":"Security considerations"},"122":{"body":"Information-theoretic security — T-1 shares reveal exactly zero information about the secret. This is not a computational assumption; it is mathematically proven. Corruption detection — BLAKE3 checksums catch bit rot, OCR errors, and truncation before any reconstruction attempt. Format resilience — dual output (binary + text) ensures shares survive different storage media failure modes. Backward compatibility — the secret blob is versioned, so future versions can include additional key material without breaking existing shares.","breadcrumbs":"Heir Key Recovery » Design principles","id":"122","title":"Design principles"},"123":{"body":"Most devices on the internet sit behind a NAT (Network Address Translator). Your router assigns your device a private address (like 192.168.1.100) and translates it to a public address when you connect outward. This works fine for browsing the web, but it creates a problem for P2P networks: two devices behind different NATs cannot directly connect to each other without help. Tesseras solves this with a three-tier approach, trying the cheapest option first: Direct connection — if both nodes have public IPs, they connect directly UDP hole punching — a third node introduces the two peers so they can punch through their NATs Relay — a public-IP node forwards packets between the two peers","breadcrumbs":"NAT Traversal » NAT Traversal","id":"123","title":"NAT Traversal"},"124":{"body":"When a node starts, it sends STUN (Session Traversal Utilities for NAT) requests to multiple public servers. By comparing the external addresses these servers report back, the node classifies its NAT: NAT Type What it means Hole punching? Public No NAT — your device has a public IP Not needed Cone NAT maps the same internal port to the same external port regardless of destination Works well (~80%) Symmetric NAT assigns a different external port for each destination Unreliable Unknown Could not reach STUN servers Relay needed Your node advertises its NAT type in DHT Pong messages, so other nodes know whether hole punching is worth attempting.","breadcrumbs":"NAT Traversal » NAT type discovery","id":"124","title":"NAT type discovery"},"125":{"body":"When node A (behind a Cone NAT) wants to connect to node B (also behind a Cone NAT), neither can directly reach the other. The solution: A sends a PunchIntro message to node I (an introducer — any public-IP node they both know). The message includes A’s external address (from STUN) and an Ed25519 signature proving A’s identity. I verifies the signature and forwards a PunchRequest to B, including A’s address and the original signature. B verifies the signature (proving the request really came from A, not a spoofed source). B then sends a UDP packet to A’s external address — this opens a pinhole in B’s NAT. B also sends a PunchReady message back to A with B’s external address. A sends a UDP packet to B’s external address. Both NATs now have pinholes, and the two nodes can communicate directly. The entire process takes 2-5 seconds. The Ed25519 signatures prevent reflection attacks, where an attacker replays an old introduction to redirect traffic.","breadcrumbs":"NAT Traversal » Hole punching","id":"125","title":"Hole punching"},"126":{"body":"When hole punching fails (Symmetric NAT, strict firewalls, or corporate networks), nodes fall back to relaying through a public-IP node: A sends a RelayRequest to node R (a public-IP node with relay enabled). R creates a session and sends a RelayOffer to both A and B, containing the relay address and a session token. A and B send their packets to R, prefixed with the session token. R strips the token and forwards the payload to the other peer. Relay sessions have bandwidth limits: 256 KB/s for peers with good reciprocity (they store fragments for others) 64 KB/s for peers without reciprocity Non-reciprocal sessions are limited to 10 minutes This encourages nodes to contribute storage — good network citizens get better relay service.","breadcrumbs":"NAT Traversal » Relay fallback","id":"126","title":"Relay fallback"},"127":{"body":"When a mobile device switches networks (Wi-Fi to cellular), its IP address changes. Rather than tearing down and rebuilding relay sessions, the node sends a signed RelayMigrate message to update its address in the existing session. This avoids re-establishing connections from scratch.","breadcrumbs":"NAT Traversal » Address migration","id":"127","title":"Address migration"},"128":{"body":"The [nat] section in the daemon config controls NAT traversal: [nat]\\n# STUN servers for NAT type detection\\nstun_servers = [\\"stun.l.google.com:19302\\", \\"stun.cloudflare.com:3478\\"] # Enable relay (forward traffic for other NATed peers)\\nrelay_enabled = false # Maximum simultaneous relay sessions\\nrelay_max_sessions = 50 # Bandwidth limit for reciprocal peers (KB/s)\\nrelay_reciprocal_kbps = 256 # Bandwidth limit for non-reciprocal peers (KB/s)\\nrelay_bootstrap_kbps = 64 # Relay session idle timeout (seconds)\\nrelay_idle_timeout_secs = 60 To run a relay node, set relay_enabled = true. Your node must have a public IP (or a port-forwarded router) to serve as a relay.","breadcrumbs":"NAT Traversal » Configuration","id":"128","title":"Configuration"},"129":{"body":"When the Tesseras app detects a network change on a mobile device, it runs a three-phase reconnection sequence: QUIC migration (0-2s) — QUIC supports connection migration natively. The app tries to migrate all active connections to the new address. Re-STUN (2-5s) — discover the new external address and re-announce to the DHT. Re-establish (5-10s) — reconnect peers that migration couldn’t save, in priority order: bootstrap nodes first, then nodes holding your fragments, then nodes whose fragments you hold. The app shows reconnection progress through the NetworkChanged event stream.","breadcrumbs":"NAT Traversal » Mobile reconnection","id":"129","title":"Mobile reconnection"},"13":{"body":"To build the mobile or desktop app, you need additional dependencies:","breadcrumbs":"Installation » Flutter App","id":"13","title":"Flutter App"},"130":{"body":"NAT traversal exposes Prometheus metrics at /metrics: tesseras_nat_type — current detected NAT type tesseras_stun_requests_total / tesseras_stun_failures_total — STUN reliability tesseras_punch_attempts_total{initiator_nat, target_nat} — punch success rate by NAT pair tesseras_relay_sessions_active — current relay load tesseras_relay_bytes_forwarded — total relay bandwidth tesseras_network_change_total — network change frequency on mobile","breadcrumbs":"NAT Traversal » Monitoring","id":"130","title":"Monitoring"},"131":{"body":"Tesseras provides a Docker image for running the daemon in containers. This is useful for servers, testing multi-node networks, and CI environments.","breadcrumbs":"Docker » Docker","id":"131","title":"Docker"},"132":{"body":"From the repository root: docker build -t tesseras-daemon . The multi-stage Dockerfile uses rust:1.85 to compile and debian:bookworm-slim as the runtime base. The resulting image is small and contains only the daemon binary and CA certificates.","breadcrumbs":"Docker » Building the image","id":"132","title":"Building the image"},"133":{"body":"docker run -d \\\\ --name tesseras \\\\ -p 4433:4433/udp \\\\ tesseras-daemon This starts a node that: Listens on UDP port 4433 Bootstraps from the default seed nodes Stores data inside the container (ephemeral) To persist data across container restarts, mount a volume: docker run -d \\\\ --name tesseras \\\\ -p 4433:4433/udp \\\\ -v tesseras-data:/root/.local/share/tesseras \\\\ tesseras-daemon","breadcrumbs":"Docker » Running a single node","id":"133","title":"Running a single node"},"134":{"body":"To run a seed node that doesn’t bootstrap from anyone else: docker run -d \\\\ --name tesseras-seed \\\\ -p 4433:4433/udp \\\\ tesseras-daemon --listen 0.0.0.0:4433 --bootstrap \\"\\"","breadcrumbs":"Docker » Running as a seed node","id":"134","title":"Running as a seed node"},"135":{"body":"The repository includes a Docker Compose file for testing a 3-node network: services: boot1: build: ../.. command: [\\"--listen\\", \\"0.0.0.0:4433\\", \\"--bootstrap\\", \\"\\"] ports: [\\"4433:4433/udp\\"] boot2: build: ../.. command: [\\"--listen\\", \\"0.0.0.0:4433\\", \\"--bootstrap\\", \\"boot1:4433\\"] depends_on: [boot1] client: build: ../.. command: [\\"--listen\\", \\"0.0.0.0:4433\\", \\"--bootstrap\\", \\"boot2:4433\\"] depends_on: [boot2] Start the network: cd tests/smoke\\ndocker compose up --build -d Check that all nodes are running: docker compose logs --tail=5 You should see daemon ready in the logs for each node, and bootstrap successful for boot2 and client. Stop the network: docker compose down","breadcrumbs":"Docker » Multi-node network with Docker Compose","id":"135","title":"Multi-node network with Docker Compose"},"136":{"body":"To use a config file with Docker, mount it into the container: docker run -d \\\\ --name tesseras \\\\ -p 4433:4433/udp \\\\ -v ./config.toml:/etc/tesseras/config.toml:ro \\\\ -v tesseras-data:/root/.local/share/tesseras \\\\ tesseras-daemon --config /etc/tesseras/config.toml See the Configuration chapter for all available options.","breadcrumbs":"Docker » Custom configuration","id":"136","title":"Custom configuration"},"14":{"body":"Flutter SDK — install following the official guide Rust — already installed as above Platform dependencies: Platform Dependencies Android Android SDK, Android NDK, Java 17+ iOS Xcode, CocoaPods Linux desktop GTK 3.0+, pkg-config ( sudo apt install libgtk-3-dev pkg-config on Debian/Ubuntu) macOS desktop Xcode Command Line Tools","breadcrumbs":"Installation » Flutter prerequisites","id":"14","title":"Flutter prerequisites"},"15":{"body":"cd apps/flutter\\nflutter pub get # Linux desktop\\nflutter build linux --debug # Android\\nflutter build apk --debug # iOS\\nflutter build ios --debug # Tests\\nflutter test Or using just from the repository root: just build-linux # Linux desktop\\njust build-android # Android APK\\njust test-flutter # Tests","breadcrumbs":"Installation » Build the app","id":"15","title":"Build the app"},"16":{"body":"The Tesseras daemon uses QUIC (protocol over UDP). If you are behind a firewall, allow traffic on the port: Protocol Port Direction UDP 4433 Inbound and outbound","breadcrumbs":"Installation » Network ports","id":"16","title":"Network ports"},"17":{"body":"Quick Start — create your first tessera Running a Node — configure and run the daemon Configuration — configuration options Docker — run in containers","breadcrumbs":"Installation » Next steps","id":"17","title":"Next steps"},"18":{"body":"This tutorial walks you through a complete workflow: creating an identity, building a tessera from files, verifying it, and exporting it.","breadcrumbs":"Quick Start » Quick Start","id":"18","title":"Quick Start"},"19":{"body":"First, set up your local identity and database: tes init Generated Ed25519 identity\\nDatabase initialized\\nConfig written to /home/user/.tesseras/config.toml\\nTesseras initialized at /home/user/.tesseras This creates: ~/.tesseras/identity/ — your Ed25519 keypair ~/.tesseras/db/ — SQLite database for indexing ~/.tesseras/blobs/ — storage for memory files ~/.tesseras/config.toml — configuration file","breadcrumbs":"Quick Start » 1. Initialize your identity","id":"19","title":"1. Initialize your identity"},"2":{"body":"No company dependency — your memories are yours, stored locally and replicated across a peer-to-peer network No format lock-in — every tessera includes instructions for decoding its contents Availability over secrecy — public memories are not encrypted, because long-term accessibility matters more than hiding things Minimal encryption — only private and sealed content is encrypted; everything else is open Quantum-resistant — dual signatures (Ed25519 + ML-DSA) protect integrity even against future quantum computers","breadcrumbs":"Introduction » Core philosophy","id":"2","title":"Core philosophy"},"20":{"body":"Create a directory with the memories you want to preserve: mkdir my-memories\\ncp ~/photos/family-dinner.jpg my-memories/\\ncp ~/photos/garden.jpg my-memories/\\necho \\"A warm Sunday afternoon with the family.\\" > my-memories/reflection.txt Supported formats: .jpg, .jpeg, .png (images), .wav (audio), .webm (video), .txt (text).","breadcrumbs":"Quick Start » 2. Prepare your files","id":"20","title":"2. Prepare your files"},"21":{"body":"See what would be included without creating anything: tes create my-memories --dry-run","breadcrumbs":"Quick Start » 3. Preview with dry run","id":"21","title":"3. Preview with dry run"},"22":{"body":"tes create my-memories --tags \\"family,sunday\\" --location \\"Home\\" The output includes the content hash — a 64-character hex string that uniquely identifies your tessera. Copy it for the next steps.","breadcrumbs":"Quick Start » 4. Create a tessera","id":"22","title":"4. Create a tessera"},"23":{"body":"tes list Hash Created Memories Size Visibility\\n9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public","breadcrumbs":"Quick Start » 5. List your tesseras","id":"23","title":"5. List your tesseras"},"24":{"body":"Use the content hash to verify that all files are intact and the signature is valid: tes verify 9f2c4a1b3e7d8f0c... Tessera: 9f2c4a1b3e7d8f0c...\\nSignature: VALID [OK] memories/a1b2c3/media.jpg [OK] memories/d4e5f6/media.jpg [OK] memories/g7h8i9/media.txt\\nVerification: PASSED","breadcrumbs":"Quick Start » 6. Verify integrity","id":"24","title":"6. Verify integrity"},"25":{"body":"Export the tessera to a directory that can be read without Tesseras: tes export 9f2c4a1b3e7d8f0c... ./backup Exported to ./backup/tessera-9f2c4a1b3e7d8f0c...","breadcrumbs":"Quick Start » 7. Export a self-contained copy","id":"25","title":"7. Export a self-contained copy"},"26":{"body":"The exported directory is fully self-contained: tessera-9f2c4a1b3e7d8f0c.../\\n├── MANIFEST # Plain text index with checksums\\n├── README.decode # How to read this tessera without software\\n├── identity/\\n│ ├── creator.pub.ed25519 # Your public key\\n│ └── signature.ed25519.sig # Signature of the MANIFEST\\n├── memories/\\n│ ├── <hash>/\\n│ │ ├── media.jpg # The photo\\n│ │ ├── context.txt # Description in plain text\\n│ │ └── meta.json # Structured metadata\\n│ └── .../\\n└── decode/ ├── formats.txt # Explanation of all formats used ├── jpeg.txt # How to decode JPEG └── json.txt # How to decode JSON Everything a future reader needs to understand the contents is included in the directory itself — no Tesseras software required.","breadcrumbs":"Quick Start » 8. Inspect the export","id":"26","title":"8. Inspect the export"},"27":{"body":"Initialize identity and local database.","breadcrumbs":"Commands » init » tes init","id":"27","title":"tes init"},"28":{"body":"tes init","breadcrumbs":"Commands » init » Usage","id":"28","title":"Usage"},"29":{"body":"Sets up your local Tesseras environment. This is the first command you should run after installing Tesseras. The command creates: Path Contents ~/.tesseras/identity/ Ed25519 keypair for signing tesseras ~/.tesseras/db/ SQLite database for indexing ~/.tesseras/blobs/ Blob storage for memory files ~/.tesseras/config.toml Configuration file","breadcrumbs":"Commands » init » Description","id":"29","title":"Description"},"3":{"body":"Tesseras has completed through Phase 4 — encryption and sealed tesseras. The project now covers local tessera management, networking, replication, a mobile app, and cryptographic privacy. What’s available today: Identity generation (Ed25519 keypair with proof-of-work) Tessera creation from local files Content-addressed storage (BLAKE3 hashing) Integrity verification and self-contained export Full node daemon with QUIC transport Peer discovery via Kademlia DHT Tessera pointer publishing and lookup across the network Reed-Solomon erasure coding with automatic fragment repair Flutter mobile app with embedded Rust P2P node Private tesseras — encrypted content only the owner can access Sealed tesseras — time-locked content that opens after a specific date Hybrid post-quantum encryption — X25519 + ML-KEM-768 key encapsulation AES-256-GCM content encryption with AAD binding","breadcrumbs":"Introduction » Current status: Phase 4","id":"3","title":"Current status: Phase 4"},"30":{"body":"Option Description --data-dir <PATH> Base directory for data storage (default: ~/.tesseras)","breadcrumbs":"Commands » init » Options","id":"30","title":"Options"},"31":{"body":"Running init again is safe. If an identity already exists, it is preserved: tes init Ed25519 identity already exists\\nDatabase initialized\\nTesseras initialized at /home/user/.tesseras","breadcrumbs":"Commands » init » Idempotent","id":"31","title":"Idempotent"},"32":{"body":"tes --data-dir /mnt/usb/tesseras init This creates the full directory structure under /mnt/usb/tesseras/ instead of the default location.","breadcrumbs":"Commands » init » Custom data directory","id":"32","title":"Custom data directory"},"33":{"body":"Creates the directory structure ( identity/, db/, blobs/) Generates an Ed25519 keypair (private key stays local, public key identifies you) Runs SQLite migrations to set up the database schema Writes a default config.toml","breadcrumbs":"Commands » init » What happens under the hood","id":"33","title":"What happens under the hood"},"34":{"body":"Create a tessera from a directory of files.","breadcrumbs":"Commands » create » tes create","id":"34","title":"tes create"},"35":{"body":"tes create <PATH> [OPTIONS]","breadcrumbs":"Commands » create » Usage","id":"35","title":"Usage"},"36":{"body":"Argument Description <PATH> Directory containing files to include","breadcrumbs":"Commands » create » Arguments","id":"36","title":"Arguments"},"37":{"body":"Option Description Default -n, --non-interactive Skip prompts off --dry-run Preview what would be included off --visibility <VALUE> Visibility level: public, private, circle public --language <CODE> Language code (e.g., en, pt-BR) en --tags <LIST> Comma-separated tags none --location <DESC> Location description none --data-dir <PATH> Base directory for data storage ~/.tesseras","breadcrumbs":"Commands » create » Options","id":"37","title":"Options"},"38":{"body":"Extension Type Memory type .jpg, .jpeg Image (JPEG) Moment .png Image (PNG) Moment .wav Audio (WAV PCM) Moment .webm Video (WebM) Moment .txt Plain text (UTF-8) Reflection Files with other extensions are ignored.","breadcrumbs":"Commands » create » Supported file formats","id":"38","title":"Supported file formats"},"39":{"body":"The command automatically assigns a memory type based on the file format: Text files ( .txt) are classified as Reflection — thoughts, beliefs, or opinions All other formats are classified as Moment — a photo, recording, or video of something happening","breadcrumbs":"Commands » create » Memory type inference","id":"39","title":"Memory type inference"},"4":{"body":"Concept Description Tessera A self-contained time capsule of memories Memory A single item (photo, recording, video, or text) within a tessera Content hash A BLAKE3 hash that uniquely identifies a tessera by its contents Visibility Controls who can access a tessera: public, private, sealed, or circle Sealed tessera A time capsule that can only be opened after a specific date MANIFEST A plain-text index listing every file in the tessera with its checksum Memory type Categorizes a memory: moment, reflection, daily, relation, or object Node A device running the Tesseras daemon, participating in the P2P network DHT Distributed hash table — how nodes find tessera pointers without a central server Bootstrap The process of joining the network by contacting known seed nodes","breadcrumbs":"Introduction » Key concepts","id":"4","title":"Key concepts"},"40":{"body":"","breadcrumbs":"Commands » create » Examples","id":"40","title":"Examples"},"41":{"body":"tes create ./my-photos --dry-run","breadcrumbs":"Commands » create » Preview before creating","id":"41","title":"Preview before creating"},"42":{"body":"tes create ./vacation-2026 \\\\ --tags \\"vacation,summer,beach\\" \\\\ --location \\"Florianópolis, Brazil\\" \\\\ --language pt-BR \\\\ --visibility public","breadcrumbs":"Commands » create » Create with metadata","id":"42","title":"Create with metadata"},"43":{"body":"tes create ./daily-log --non-interactive --tags \\"daily\\"","breadcrumbs":"Commands » create » Non-interactive mode","id":"43","title":"Non-interactive mode"},"44":{"body":"Level Who can access public Anyone (default) private Only you (and designated heirs) circle Explicitly chosen people","breadcrumbs":"Commands » create » Visibility levels","id":"44","title":"Visibility levels"},"45":{"body":"Scans the directory for supported files Computes a BLAKE3 hash for each file Assigns a memory type based on file extension Generates a MANIFEST listing all files with their checksums Signs the MANIFEST with your Ed25519 private key Stores the files and metadata in the local database Outputs the content hash that uniquely identifies this tessera","breadcrumbs":"Commands » create » What happens under the hood","id":"45","title":"What happens under the hood"},"46":{"body":"Verify integrity of a stored tessera.","breadcrumbs":"Commands » verify » tes verify","id":"46","title":"tes verify"},"47":{"body":"tes verify <HASH>","breadcrumbs":"Commands » verify » Usage","id":"47","title":"Usage"},"48":{"body":"Argument Description <HASH> Tessera content hash (64 hex characters)","breadcrumbs":"Commands » verify » Arguments","id":"48","title":"Arguments"},"49":{"body":"Option Description --data-dir <PATH> Base directory for data storage (default: ~/.tesseras)","breadcrumbs":"Commands » verify » Options","id":"49","title":"Options"},"5":{"body":"Tesseras is currently available by building from source.","breadcrumbs":"Installation » Installation","id":"5","title":"Installation"},"50":{"body":"Signature validity — verifies the Ed25519 signature over the MANIFEST File integrity — recomputes the BLAKE3 hash of every file and compares it against the MANIFEST","breadcrumbs":"Commands » verify » What it checks","id":"50","title":"What it checks"},"51":{"body":"Code Meaning 0 Verification passed — all files intact, signature valid 1 Verification failed — corrupted files or invalid signature","breadcrumbs":"Commands » verify » Exit codes","id":"51","title":"Exit codes"},"52":{"body":"","breadcrumbs":"Commands » verify » Examples","id":"52","title":"Examples"},"53":{"body":"tes verify 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01 Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01\\nSignature: VALID [OK] memories/a1b2c3d4/media.jpg [OK] memories/e5f6a7b8/media.txt [OK] memories/c9d0e1f2/media.wav\\nVerification: PASSED","breadcrumbs":"Commands » verify » Successful verification","id":"53","title":"Successful verification"},"54":{"body":"If a file has been modified or corrupted: Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01\\nSignature: VALID [OK] memories/a1b2c3d4/media.jpg [FAILED] memories/e5f6a7b8/media.txt [OK] memories/c9d0e1f2/media.wav\\nVerification: FAILED","breadcrumbs":"Commands » verify » Failed verification","id":"54","title":"Failed verification"},"55":{"body":"Routine integrity checks — periodically verify that your stored tesseras haven’t been corrupted After transfer — verify after copying tesseras to a new device or storage medium Trust verification — confirm that a tessera received from someone else hasn’t been tampered with","breadcrumbs":"Commands » verify » Use cases","id":"55","title":"Use cases"},"56":{"body":"Export a tessera as a self-contained directory.","breadcrumbs":"Commands » export » tes export","id":"56","title":"tes export"},"57":{"body":"tes export <HASH> <DEST>","breadcrumbs":"Commands » export » Usage","id":"57","title":"Usage"},"58":{"body":"Argument Description <HASH> Tessera content hash (64 hex characters) <DEST> Destination directory","breadcrumbs":"Commands » export » Arguments","id":"58","title":"Arguments"},"59":{"body":"Option Description --data-dir <PATH> Base directory for data storage (default: ~/.tesseras)","breadcrumbs":"Commands » export » Options","id":"59","title":"Options"},"6":{"body":"","breadcrumbs":"Installation » Prerequisites","id":"6","title":"Prerequisites"},"60":{"body":"The export creates a directory named tessera-<hash> inside the destination: tessera-9f2c4a1b.../\\n├── MANIFEST # Plain text index with checksums\\n├── README.decode # Human-readable decoding instructions\\n├── identity/\\n│ ├── creator.pub.ed25519 # Creator\'s public key\\n│ └── signature.ed25519.sig # Signature of the MANIFEST\\n├── memories/\\n│ ├── <content-hash>/\\n│ │ ├── media.jpg # Primary media file\\n│ │ ├── context.txt # Human context in plain UTF-8\\n│ │ └── meta.json # Structured metadata\\n│ └── .../\\n├── schema/\\n│ └── v1.json # JSON schema for metadata validation\\n└── decode/ ├── formats.txt # Explanation of all formats used ├── jpeg.txt # How to decode JPEG ├── wav.txt # How to decode WAV └── json.txt # How to decode JSON","breadcrumbs":"Commands » export » Output structure","id":"60","title":"Output structure"},"61":{"body":"tes export 9f2c4a1b3e7d8f0cabc123def4567890... ./backup Exported to ./backup/tessera-9f2c4a1b3e7d8f0cabc123def4567890...","breadcrumbs":"Commands » export » Example","id":"61","title":"Example"},"62":{"body":"The exported directory is designed to be readable without Tesseras software. It includes: MANIFEST — a plain-text file listing every file with its BLAKE3 checksum, readable by any text editor README.decode — human-readable instructions for understanding the contents decode/ — detailed explanations of every file format used (JPEG, WAV, JSON, UTF-8) This means someone thousands of years from now, with no knowledge of Tesseras, can still understand and access the memories.","breadcrumbs":"Commands » export » Key feature: self-contained","id":"62","title":"Key feature: self-contained"},"63":{"body":"Backup — export to an external drive, USB stick, or cloud storage Sharing — give someone a complete copy of a tessera Archival — store on write-once media (DVD, Blu-ray, tape) Migration — move tesseras between machines without needing the database","breadcrumbs":"Commands » export » Use cases","id":"63","title":"Use cases"},"64":{"body":"List all local tesseras.","breadcrumbs":"Commands » list » tes list","id":"64","title":"tes list"},"65":{"body":"tes list","breadcrumbs":"Commands » list » Usage","id":"65","title":"Usage"},"66":{"body":"Option Description --data-dir <PATH> Base directory for data storage (default: ~/.tesseras)","breadcrumbs":"Commands » list » Options","id":"66","title":"Options"},"67":{"body":"Displays a table with the following columns: Column Description Hash First 16 characters of the content hash Created Creation date (YYYY-MM-DD) Memories Number of memories in the tessera Size Total size (B, KB, MB, or GB) Visibility Visibility level (public, private, or circle)","breadcrumbs":"Commands » list » Output","id":"67","title":"Output"},"68":{"body":"tes list Hash Created Memories Size Visibility\\n9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public\\na3b7c2d9e4f01823 2026-02-10 1 12 KB private\\nf8e7d6c5b4a39201 2026-01-28 12 4 MB public","breadcrumbs":"Commands » list » Example","id":"68","title":"Example"},"69":{"body":"If no tesseras have been created yet: tes list No tesseras found.","breadcrumbs":"Commands » list » Empty database","id":"69","title":"Empty database"},"7":{"body":"Tesseras requires Rust 1.85 or higher. The recommended way to install Rust is via rustup: curl --proto \'=https\' --tlsv1.2 -sSf https://sh.rustup.rs | sh After installation, make sure ~/.cargo/bin is in your PATH. The installer usually adds it automatically. Verify with: rustc --version\\ncargo --version If you already have Rust installed, update to the latest version: rustup update stable","breadcrumbs":"Installation » Rust","id":"7","title":"Rust"},"70":{"body":"The tesseras-daemon binary runs a full Tesseras node that participates in the peer-to-peer network. It listens for connections over QUIC, joins the distributed hash table (DHT), and enables other nodes to discover and find tessera pointers.","breadcrumbs":"Running a Node » Running a Node","id":"70","title":"Running a Node"},"71":{"body":"tesseras-daemon On first run, the daemon: Creates the data directory ( ~/.local/share/tesseras on Linux, ~/Library/Application Support/tesseras on macOS) Generates a node identity with proof-of-work (takes about 1 second) Binds a QUIC listener on 0.0.0.0:4433 Bootstraps into the network by contacting seed nodes Prints daemon ready when fully operational","breadcrumbs":"Running a Node » Starting the daemon","id":"71","title":"Starting the daemon"},"72":{"body":"tesseras-daemon [OPTIONS] Option Description Default -c, --config <PATH> Path to a TOML config file None (uses built-in defaults) -l, --listen <ADDR> Address and port to listen on 0.0.0.0:4433 -b, --bootstrap <ADDRS> Comma-separated bootstrap addresses boot1.tesseras.net:4433,boot2.tesseras.net:4433 -d, --data-dir <PATH> Data directory Platform-specific (see above) CLI options override values from the config file.","breadcrumbs":"Running a Node » Command-line options","id":"72","title":"Command-line options"},"73":{"body":"Run with defaults (join the public network): tesseras-daemon Run as a seed node (no bootstrap, other nodes connect to you): tesseras-daemon --bootstrap \\"\\" Run on a custom port with a specific data directory: tesseras-daemon --listen 0.0.0.0:5000 --data-dir /var/lib/tesseras Bootstrap from a specific node: tesseras-daemon --bootstrap \\"192.168.1.50:4433\\" Join a local network of multiple nodes: tesseras-daemon --bootstrap \\"192.168.1.10:4433,192.168.1.11:4433\\"","breadcrumbs":"Running a Node » Examples","id":"73","title":"Examples"},"74":{"body":"Each node has a unique identity stored in <data-dir>/identity.key. This file contains a 32-byte public key and an 8-byte proof-of-work nonce. The node ID is derived from the public key: BLAKE3(pubkey || nonce) truncated to 20 bytes. The nonce must produce a hash with 8 leading zero bits, which takes about 256 hash attempts. This lightweight proof-of-work makes creating thousands of fake identities expensive while costing legitimate users less than a second. The identity is generated automatically on first run and reused on subsequent runs. If you delete identity.key, a new identity will be generated.","breadcrumbs":"Running a Node » Node identity","id":"74","title":"Node identity"},"75":{"body":"The daemon uses structured logging via tracing. Control the log level with the RUST_LOG environment variable: # Default (info level)\\ntesseras-daemon # Debug logging\\nRUST_LOG=debug tesseras-daemon # Only show warnings and errors\\nRUST_LOG=warn tesseras-daemon # Debug for DHT, info for everything else\\nRUST_LOG=info,tesseras_dht=debug tesseras-daemon","breadcrumbs":"Running a Node » Logging","id":"75","title":"Logging"},"76":{"body":"Press Ctrl+C to initiate graceful shutdown. The daemon will: Stop accepting new connections Finish in-flight operations (up to 5 seconds) Close all QUIC connections Exit cleanly","breadcrumbs":"Running a Node » Shutting down","id":"76","title":"Shutting down"},"77":{"body":"The daemon communicates over UDP port 4433 (QUIC). If you’re behind a firewall, ensure this port is open for both inbound and outbound UDP traffic. # Example: Linux with ufw\\nsudo ufw allow 4433/udp","breadcrumbs":"Running a Node » Firewall","id":"77","title":"Firewall"},"78":{"body":"The daemon can be configured via a TOML file. Pass the path with --config: tesseras-daemon --config /etc/tesseras/config.toml If no config file is given, the daemon uses sensible defaults. CLI options ( --listen, --bootstrap, --data-dir) override the corresponding config values.","breadcrumbs":"Configuration » Configuration","id":"78","title":"Configuration"},"79":{"body":"[node]\\ndata_dir = \\"~/.local/share/tesseras\\"\\nlisten_addr = \\"0.0.0.0:4433\\" [dht]\\nk = 20\\nalpha = 3\\nbucket_refresh_interval_secs = 3600\\nrepublish_interval_secs = 3600\\npointer_ttl_secs = 86400\\nmax_stored_pointers = 100000\\nping_failure_threshold = 3 [bootstrap]\\ndns_domain = \\"_tesseras._udp.tesseras.net\\"\\nhardcoded = [ \\"boot1.tesseras.net:4433\\", \\"boot2.tesseras.net:4433\\",\\n] [network]\\nenable_mdns = true [observability]\\nmetrics_addr = \\"127.0.0.1:9190\\"\\nlog_format = \\"json\\"","breadcrumbs":"Configuration » Full example","id":"79","title":"Full example"},"8":{"body":"Tesseras uses SQLite for local storage. You have two options: Option 1: System SQLite (recommended) Install SQLite development libraries via your system package manager: Distribution Command Arch Linux sudo pacman -S sqlite Debian / Ubuntu sudo apt install libsqlite3-dev Fedora sudo dnf install sqlite-devel Alpine apk add sqlite-dev macOS (Homebrew) brew install sqlite FreeBSD pkg install sqlite3 OpenBSD Included in the base system Option 2: Bundled SQLite If you prefer not to install SQLite on your system, use the bundled-sqlite feature flag during compilation. This compiles SQLite alongside Tesseras: cargo install --path crates/tesseras-cli --features bundled-sqlite\\ncargo install --path crates/tesseras-daemon --features bundled-sqlite","breadcrumbs":"Installation » SQLite","id":"8","title":"SQLite"},"80":{"body":"","breadcrumbs":"Configuration » Sections","id":"80","title":"Sections"},"81":{"body":"Basic node settings. Key Type Default Description data_dir path Platform-specific Where to store identity, database, and blobs listen_addr address 0.0.0.0:4433 QUIC listener address The default data_dir is ~/.local/share/tesseras on Linux and ~/Library/Application Support/tesseras on macOS.","breadcrumbs":"Configuration » [node]","id":"81","title":"[node]"},"82":{"body":"Kademlia DHT tuning parameters. The defaults work well for most deployments. Key Type Default Description k integer 20 Maximum entries per routing table bucket alpha integer 3 Parallelism for iterative lookups bucket_refresh_interval_secs integer 3600 How often to refresh routing table buckets (seconds) republish_interval_secs integer 3600 How often to republish stored pointers (seconds) pointer_ttl_secs integer 86400 How long to keep a pointer before it expires (seconds) max_stored_pointers integer 100000 Maximum number of pointers to store locally ping_failure_threshold integer 3 How many consecutive ping failures before removing a peer","breadcrumbs":"Configuration » [dht]","id":"82","title":"[dht]"},"83":{"body":"How the node discovers its first peers when joining the network. Key Type Default Description dns_domain string _tesseras._udp.tesseras.net DNS domain for TXT-record-based peer discovery hardcoded list of strings [\\"boot1.tesseras.net:4433\\", \\"boot2.tesseras.net:4433\\"] Fallback bootstrap addresses","breadcrumbs":"Configuration » [bootstrap]","id":"83","title":"[bootstrap]"},"84":{"body":"Network-level features. Key Type Default Description enable_mdns boolean true Enable local network discovery via mDNS","breadcrumbs":"Configuration » [network]","id":"84","title":"[network]"},"85":{"body":"Monitoring and logging. Key Type Default Description metrics_addr address 127.0.0.1:9190 Address for the Prometheus metrics endpoint log_format string json Log output format ( json or text)","breadcrumbs":"Configuration » [observability]","id":"85","title":"[observability]"},"86":{"body":"Tesseras supports IPv6 natively. The listen_addr and listen_addrs fields accept both IPv4 and IPv6 addresses.","breadcrumbs":"Configuration » IPv6 Support","id":"86","title":"IPv6 Support"},"87":{"body":"To listen on all IPv6 interfaces: [node]\\nlisten_addr = \\"[::]:4433\\" On Linux and most BSDs, binding to [::] also accepts IPv4 connections (dual-stack) by default. On some systems (notably OpenBSD), [::] is IPv6-only due to IPV6_V6ONLY being enabled by default. To guarantee both IPv4 and IPv6 on all platforms, use listen_addrs with explicit addresses: [node]\\nlisten_addrs = [\\"0.0.0.0:4433\\", \\"[::]:4433\\"] For IPv6 loopback only (testing): [node]\\nlisten_addr = \\"[::1]:4433\\"","breadcrumbs":"Configuration » Listening on IPv6","id":"87","title":"Listening on IPv6"},"88":{"body":"Bootstrap addresses can be IPv6: [bootstrap]\\nhardcoded = [ \\"boot1.tesseras.net:4433\\", \\"[2001:db8::1]:4433\\",\\n] DNS hostnames with both A and AAAA records are resolved to all addresses, so the daemon will connect over whichever protocol is reachable.","breadcrumbs":"Configuration » Bootstrap with IPv6","id":"88","title":"Bootstrap with IPv6"},"89":{"body":"OS [::] accepts IPv4? Notes Linux Yes (dual-stack) IPV6_V6ONLY defaults to 0 macOS Yes (dual-stack) IPV6_V6ONLY defaults to 0 FreeBSD Yes (dual-stack) IPV6_V6ONLY defaults to 0 OpenBSD No (IPv6-only) IPV6_V6ONLY always 1 Windows Yes (dual-stack) IPV6_V6ONLY defaults to 0 If you need explicit control, use listen_addrs with both an IPv4 and IPv6 address.","breadcrumbs":"Configuration » IPV6_V6ONLY behavior by OS","id":"89","title":"IPV6_V6ONLY behavior by OS"},"9":{"body":"Tool Purpose Installation just Run project build commands cargo install just mdBook Build the documentation cargo install mdbook Docker Run nodes in containers See Docker Flutter Build the mobile/desktop app See Flutter App","breadcrumbs":"Installation » Optional tools","id":"9","title":"Optional tools"},"90":{"body":"Most users don’t need a config file at all. If you do, a minimal config overriding only what you need is enough: [node]\\nlisten_addr = \\"0.0.0.0:5000\\" [bootstrap]\\nhardcoded = [\\"192.168.1.10:4433\\"] All other values use their defaults.","breadcrumbs":"Configuration » Minimal config","id":"90","title":"Minimal config"},"91":{"body":"This chapter explains how Tesseras nodes find each other and locate tessera pointers on the network. You don’t need to understand these details to use Tesseras, but they help explain what the daemon is doing in the background.","breadcrumbs":"Network Concepts » Network Concepts","id":"91","title":"Network Concepts"},"92":{"body":"Tesseras uses a Kademlia distributed hash table (DHT) — a proven algorithm used by BitTorrent and other P2P systems for over 20 years. There is no central server. Each node maintains a routing table of peers it knows about, and nodes cooperate to route queries to the right place. When your node starts, it contacts one or more bootstrap nodes (seed nodes with known addresses). Through these initial connections, your node discovers other peers and builds up its routing table. Over time, your node naturally learns about more peers as it participates in the network.","breadcrumbs":"Network Concepts » How nodes find each other","id":"92","title":"How nodes find each other"},"93":{"body":"The DHT stores pointers, not data. A pointer is a lightweight record that says “tessera X is held by nodes Y and Z.” When someone wants to retrieve a tessera, they first look up its pointer in the DHT to find out which nodes have it, then connect directly to those nodes to download the actual data. This means the DHT stays small and fast — it only tracks who has what, not the content itself.","breadcrumbs":"Network Concepts » What the DHT stores","id":"93","title":"What the DHT stores"},"94":{"body":"Every node has a 160-bit node ID derived from its public key. To prevent an attacker from cheaply creating thousands of fake nodes (a Sybil attack), generating a node ID requires a small proof-of-work: the node must find a nonce such that BLAKE3(public_key || nonce) starts with 8 zero bits. This takes about 256 hash attempts — under a second on any device, including a Raspberry Pi. But an attacker trying to create 10,000 fake identities would need millions of attempts, making the attack impractical.","breadcrumbs":"Network Concepts » Node identity and proof-of-work","id":"94","title":"Node identity and proof-of-work"},"95":{"body":"Kademlia defines “closeness” between nodes using the XOR metric: the distance between two node IDs is their bitwise XOR. Nodes are responsible for storing pointers whose keys are close to their own ID (in XOR distance). This distributes data evenly across the network without any coordination. When looking up a tessera pointer, your node asks the peers it knows that are closest to the target key. Those peers point to even closer ones, and so on, until the pointer is found. This iterative lookup typically reaches any node in the network within a few hops.","breadcrumbs":"Network Concepts » XOR distance","id":"95","title":"XOR distance"},"96":{"body":"All communication between nodes uses QUIC, a modern transport protocol built on UDP. QUIC provides: Built-in encryption — every connection uses TLS 1.3 NAT-friendly — works through most network address translators since it’s UDP-based Multiplexing — multiple independent operations over one connection without head-of-line blocking Connection migration — survives network changes (e.g., switching from Wi-Fi to mobile data) The daemon listens on UDP port 4433 by default.","breadcrumbs":"Network Concepts » Transport: QUIC","id":"96","title":"Transport: QUIC"},"97":{"body":"When a node starts, it follows this sequence: Contact seed nodes — connect to one or more known bootstrap addresses Exchange pings — verify the seed is alive and exchange node identities Self-lookup — ask the seed for nodes close to your own ID, to populate your routing table Iterative discovery — contact the newly discovered nodes, which point you to even more peers After bootstrap, the node maintains its routing table automatically: it refreshes buckets periodically and replaces unresponsive peers with new ones.","breadcrumbs":"Network Concepts » Bootstrap process","id":"97","title":"Bootstrap process"},"98":{"body":"Not every device participates in the network the same way: Type Description Always on? Full node Desktop, server, or Raspberry Pi running tesseras-daemon. Participates fully in the DHT and stores data for other nodes. Yes Mobile node Phone or tablet running the Tesseras app. Participates in the DHT when the app is active. No Browser node Web browser running the WASM client. Connects via a relay node. Read-only. No IoT node ESP32 or similar device on the local network. Stores fragments passively, does not participate in the DHT. Yes The full node daemon is the backbone of the network. The more full nodes running, the more resilient the network becomes.","breadcrumbs":"Network Concepts » Node types","id":"98","title":"Node types"},"99":{"body":"This chapter explains how Tesseras keeps your memories safe even when individual nodes go offline or suffer hardware failures. You don’t need to understand these details to use Tesseras — the daemon handles everything automatically.","breadcrumbs":"Replication and Repair » Replication and Repair","id":"99","title":"Replication and Repair"}},"length":137,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"4":{"4":{"3":{"3":{"df":7,"docs":{"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"0":{"0":{"df":2,"docs":{"73":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"68":{"tf":1.0}}},"2":{"df":3,"docs":{"118":{"tf":1.0},"23":{"tf":1.0},"68":{"tf":1.4142135623730951}}},"df":4,"docs":{"106":{"tf":1.0},"129":{"tf":1.0},"51":{"tf":1.0},"89":{"tf":2.0}}},"1":{".":{"3":{"df":1,"docs":{"96":{"tf":1.0}}},"8":{"5":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{",":{"0":{"0":{"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"101":{"tf":1.0}}},"df":3,"docs":{"126":{"tf":1.0},"129":{"tf":1.0},"68":{"tf":1.0}}},"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"9":{"1":{"9":{"0":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"23":{"tf":1.0},"68":{"tf":1.0}}},"5":{"0":{"df":1,"docs":{"101":{"tf":1.0}}},"df":1,"docs":{"118":{"tf":1.0}}},"6":{"+":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.0},"67":{"tf":1.0}}},"7":{"df":1,"docs":{"14":{"tf":1.0}}},"9":{"2":{".":{"1":{"6":{"8":{".":{"1":{".":{"1":{"0":{"0":{"df":1,"docs":{"123":{"tf":1.0}}},":":{"4":{"4":{"3":{"3":{",":{"1":{"9":{"2":{".":{"1":{"6":{"8":{".":{"1":{".":{"1":{"1":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"]":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":1.4142135623730951},"122":{"tf":1.0},"19":{"tf":1.0},"51":{"tf":1.0},"68":{"tf":1.0},"71":{"tf":1.0},"8":{"tf":1.0},"89":{"tf":1.0}}},"2":{"0":{"0":{"1":{":":{"d":{"b":{"8":{":":{":":{"1":{"]":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"2":{"6":{"df":4,"docs":{"118":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"68":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":4,"docs":{"74":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.0},"92":{"tf":1.0}}},"4":{"df":4,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"105":{"tf":1.0},"108":{"tf":1.0}}},"5":{"6":{"df":9,"docs":{"102":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.0},"3":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":2,"docs":{"23":{"tf":1.0},"68":{"tf":1.0}}},"df":1,"docs":{"68":{"tf":1.0}}},"df":9,"docs":{"108":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"120":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"129":{"tf":1.0},"20":{"tf":1.0},"8":{"tf":1.0}},"s":{"df":1,"docs":{"129":{"tf":1.0}}}},"3":{".":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"74":{"tf":1.0}}},"3":{"df":1,"docs":{"101":{"tf":1.0}}},"4":{"df":1,"docs":{"120":{"tf":1.0}}},"6":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"101":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"135":{"tf":1.0},"14":{"tf":1.0},"21":{"tf":1.0},"23":{"tf":1.0},"68":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951}}},"4":{"4":{"3":{"3":{"/":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{"df":1,"docs":{"77":{"tf":1.0}}}},"df":0,"docs":{}}},":":{"4":{"4":{"3":{"3":{"/":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{"df":4,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.0},"87":{"tf":1.4142135623730951},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"+":{"2":{"4":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"102":{"tf":1.0}}},"df":5,"docs":{"102":{"tf":1.0},"108":{"tf":1.0},"22":{"tf":1.0},"3":{"tf":1.4142135623730951},"68":{"tf":1.0}},"–":{"2":{"5":{"6":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"0":{"0":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"df":1,"docs":{"128":{"tf":1.0}}},"df":5,"docs":{"121":{"tf":1.0},"125":{"tf":1.0},"129":{"tf":1.0},"23":{"tf":1.0},"76":{"tf":1.0}},"s":{"df":1,"docs":{"129":{"tf":1.0}}}},"6":{"0":{"df":1,"docs":{"128":{"tf":1.0}}},"4":{"df":5,"docs":{"126":{"tf":1.0},"128":{"tf":1.0},"22":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0}}},"df":1,"docs":{"24":{"tf":1.0}}},"7":{"2":{"df":1,"docs":{"102":{"tf":1.0}}},"6":{"8":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"102":{"tf":1.7320508075688772},"25":{"tf":1.0}}},"8":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"6":{"4":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"1":{"tf":1.0},"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.0}}},"9":{"df":0,"docs":{},"f":{"2":{"c":{"4":{"a":{"1":{"b":{"3":{"df":0,"docs":{},"e":{"7":{"d":{"8":{"df":0,"docs":{},"f":{"0":{"c":{"a":{"b":{"c":{"1":{"2":{"3":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"5":{"6":{"7":{"8":{"9":{"0":{"1":{"2":{"3":{"4":{"5":{"6":{"7":{"8":{"a":{"b":{"c":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"1":{"2":{"3":{"4":{"5":{"6":{"7":{"8":{"9":{"a":{"b":{"c":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"1":{"df":2,"docs":{"53":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"c":{"5":{"b":{"4":{"a":{"3":{"2":{"1":{"0":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"_":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"a":{"1":{"b":{"2":{"c":{"3":{"d":{"4":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"a":{"7":{"b":{"8":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"b":{"7":{"c":{"2":{"d":{"9":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"0":{"1":{"8":{"2":{"3":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"a":{"a":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"d":{"df":2,"docs":{"112":{"tf":1.7320508075688772},"3":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"72":{"tf":1.0}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":5,"docs":{"108":{"tf":1.0},"76":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":8,"docs":{"109":{"tf":1.7320508075688772},"115":{"tf":1.0},"116":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.0},"62":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"105":{"tf":1.0}}}},"v":{"df":3,"docs":{"119":{"tf":1.0},"129":{"tf":1.0},"98":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"d":{"df":2,"docs":{"7":{"tf":1.0},"8":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"122":{"tf":1.0},"13":{"tf":1.0}}}},"r":{"df":1,"docs":{"72":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":20,"docs":{"104":{"tf":1.0},"113":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"125":{"tf":2.23606797749979},"126":{"tf":1.0},"127":{"tf":1.7320508075688772},"129":{"tf":1.4142135623730951},"3":{"tf":1.0},"72":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951},"83":{"tf":1.0},"85":{"tf":1.4142135623730951},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":1,"docs":{"108":{"tf":1.0}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"124":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":3,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"3":{"tf":1.0}}},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"20":{"tf":1.0}}}}}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"31":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"50":{"tf":1.0}}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":4,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"92":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"97":{"tf":1.0}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"108":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"117":{"tf":1.0}},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"110":{"tf":1.0},"114":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"14":{"tf":1.0},"31":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"112":{"tf":1.0},"89":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"129":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"112":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"109":{"tf":1.0},"134":{"tf":1.0},"44":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"k":{"df":2,"docs":{"15":{"tf":1.4142135623730951},"8":{"tf":1.0}}},"p":{"df":6,"docs":{"129":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"3":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"o":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"df":2,"docs":{"14":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"106":{"tf":1.0},"63":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"36":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"58":{"tf":1.4142135623730951}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"k":{"df":2,"docs":{"95":{"tf":1.0},"97":{"tf":1.0}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":4,"docs":{"123":{"tf":1.0},"124":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"111":{"tf":1.0},"122":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":4,"docs":{"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"94":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":6,"docs":{"115":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"124":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"105":{"tf":1.4142135623730951}}}}}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}}}},"o":{"df":2,"docs":{"10":{"tf":1.0},"119":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":9,"docs":{"100":{"tf":1.0},"104":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.0},"39":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":5,"docs":{"109":{"tf":1.0},"136":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":4,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}}}},"’":{"df":1,"docs":{"125":{"tf":2.0}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"98":{"tf":1.0}}}}},"df":5,"docs":{"105":{"tf":1.0},"119":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"105":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"25":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":3,"docs":{"25":{"tf":1.0},"61":{"tf":1.0},"63":{"tf":1.0}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"106":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"126":{"tf":1.0},"128":{"tf":1.4142135623730951},"130":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"6":{"4":{"df":1,"docs":{"118":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":13,"docs":{"11":{"tf":1.0},"111":{"tf":1.0},"132":{"tf":1.0},"30":{"tf":1.0},"37":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"8":{"tf":1.0},"83":{"tf":1.0},"96":{"tf":1.0}}},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"i":{"c":{"df":1,"docs":{"81":{"tf":1.0}}},"df":0,"docs":{}}}},"df":4,"docs":{"125":{"tf":2.23606797749979},"126":{"tf":1.4142135623730951},"67":{"tf":1.0},"72":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"109":{"tf":1.0},"98":{"tf":1.0}}}}},"df":1,"docs":{"87":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"41":{"tf":1.0},"82":{"tf":1.4142135623730951}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"108":{"tf":1.0},"89":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"123":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"16":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"39":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"119":{"tf":1.0}}}},"w":{"df":1,"docs":{"108":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"t":{"df":1,"docs":{"111":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"105":{"tf":1.0},"123":{"tf":1.0},"63":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"122":{"tf":1.0},"132":{"tf":1.0},"70":{"tf":1.0}}}}},"d":{"df":4,"docs":{"112":{"tf":1.0},"3":{"tf":1.0},"71":{"tf":1.0},"87":{"tf":1.0}}},"df":1,"docs":{"118":{"tf":1.0}}},"t":{"df":5,"docs":{"110":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"92":{"tf":1.0}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"95":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"3":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":10,"docs":{"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"111":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0},"62":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"b":{"df":4,"docs":{"122":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"81":{"tf":1.0}}},"c":{"df":0,"docs":{},"k":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"106":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":1,"docs":{"63":{"tf":1.0}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"1":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{",":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":3,"docs":{"79":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"135":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":15,"docs":{"129":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":2.0},"4":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":2.23606797749979},"78":{"tf":1.0},"79":{"tf":1.0},"83":{"tf":1.4142135623730951},"88":{"tf":1.7320508075688772},"90":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"df":11,"docs":{"104":{"tf":1.0},"111":{"tf":1.4142135623730951},"115":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"126":{"tf":1.0},"77":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"121":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":2,"docs":{"37":{"tf":1.0},"42":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"k":{"df":3,"docs":{"111":{"tf":1.0},"117":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{},"w":{"df":1,"docs":{"8":{"tf":1.0}}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"115":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"s":{"df":1,"docs":{"123":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.4142135623730951}}}}}}}},"s":{"d":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"82":{"tf":1.4142135623730951},"97":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":9,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"132":{"tf":1.4142135623730951},"135":{"tf":2.0},"15":{"tf":2.449489742783178},"18":{"tf":1.0},"5":{"tf":1.0},"9":{"tf":1.7320508075688772},"92":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"72":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":2.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"120":{"tf":1.0},"74":{"tf":1.7320508075688772}}}}},"’":{"df":1,"docs":{"125":{"tf":1.7320508075688772}}}},"c":{"a":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"132":{"tf":1.0}},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"121":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"125":{"tf":1.0}}}},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"0":{"tf":1.0},"113":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}},"df":4,"docs":{"10":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"55":{"tf":1.0},"63":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"104":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}},"d":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0}}},"df":1,"docs":{"72":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"4":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"111":{"tf":1.0},"116":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"132":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":6,"docs":{"112":{"tf":1.0},"121":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"96":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"136":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"22":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"135":{"tf":1.0},"50":{"tf":1.0},"55":{"tf":1.0}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":12,"docs":{"103":{"tf":1.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.7320508075688772},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"26":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"44":{"tf":1.0}}}}}}},"i":{"df":1,"docs":{"131":{"tf":1.0}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}}}}}}}},"r":{"c":{"df":0,"docs":{},"l":{"df":4,"docs":{"37":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"126":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"124":{"tf":1.0},"39":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"104":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"76":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"72":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"135":{"tf":1.4142135623730951},"98":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":4,"docs":{"115":{"tf":1.0},"76":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"r":{"df":1,"docs":{"95":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"103":{"tf":1.0},"95":{"tf":1.0}}}}}},"u":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"c":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":5,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"3":{"tf":1.0},"37":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"1":{"tf":1.0},"107":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":1,"docs":{"67":{"tf":1.4142135623730951}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"111":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.0},"103":{"tf":1.0}}},"m":{"a":{"df":2,"docs":{"37":{"tf":1.0},"72":{"tf":1.0}},"n":{"d":{"df":10,"docs":{"11":{"tf":1.4142135623730951},"119":{"tf":1.0},"12":{"tf":1.0},"135":{"tf":1.7320508075688772},"14":{"tf":1.0},"29":{"tf":1.4142135623730951},"39":{"tf":1.0},"72":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":3,"docs":{"125":{"tf":1.0},"77":{"tf":1.0},"96":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}}},"r":{"df":3,"docs":{"104":{"tf":1.0},"124":{"tf":1.0},"50":{"tf":1.0}}},"t":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"132":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":7,"docs":{"10":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"12":{"tf":2.449489742783178},"18":{"tf":1.0},"3":{"tf":1.0},"63":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"135":{"tf":2.23606797749979}}}},"u":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":4,"docs":{"116":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"45":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"91":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{":":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"136":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"33":{"tf":1.0}}}}}}},"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":7,"docs":{"128":{"tf":1.0},"136":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"19":{"tf":1.0},"72":{"tf":1.7320508075688772},"78":{"tf":2.0},"90":{"tf":1.7320508075688772}},"u":{"df":0,"docs":{},"r":{"df":9,"docs":{"10":{"tf":1.0},"108":{"tf":1.4142135623730951},"12":{"tf":1.0},"128":{"tf":1.0},"136":{"tf":1.4142135623730951},"17":{"tf":1.7320508075688772},"19":{"tf":1.0},"29":{"tf":1.0},"78":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"103":{"tf":1.0},"55":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"121":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"123":{"tf":2.0},"125":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"76":{"tf":1.4142135623730951},"87":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"4":{"tf":1.0},"71":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":19,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"11":{"tf":1.0},"113":{"tf":1.0},"126":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"17":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"56":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":22,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"109":{"tf":1.4142135623730951},"110":{"tf":2.449489742783178},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":2.0},"115":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"22":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":1.4142135623730951},"45":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"67":{"tf":1.0},"93":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":1,"docs":{"60":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"100":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":4,"docs":{"128":{"tf":1.0},"4":{"tf":1.0},"75":{"tf":1.0},"89":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"92":{"tf":1.0}}}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"95":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"df":9,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":1.0},"112":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":1.0},"55":{"tf":1.0},"63":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"110":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":6,"docs":{"105":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"51":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"101":{"tf":1.0},"74":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"df":0,"docs":{},"’":{"df":0,"docs":{},"t":{"df":1,"docs":{"129":{"tf":1.0}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"p":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"10":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":37,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.7320508075688772},"110":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":1.7320508075688772},"121":{"tf":1.4142135623730951},"123":{"tf":1.0},"126":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"23":{"tf":1.0},"29":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.4142135623730951},"35":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"67":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"60":{"tf":1.0}}},".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"e":{"d":{"2":{"5":{"5":{"1":{"9":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"109":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":5,"docs":{"1":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"116":{"tf":1.0},"3":{"tf":1.0}},"i":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"+":{"c":{"df":1,"docs":{"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"3":{"tf":1.0},"5":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"111":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"136":{"tf":1.0},"32":{"tf":1.0},"73":{"tf":1.0}}}}}}}},"d":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":28,"docs":{"10":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"105":{"tf":1.0},"128":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":2.0},"72":{"tf":1.0},"73":{"tf":2.23606797749979},"75":{"tf":2.23606797749979},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.7320508075688772},"8":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.4142135623730951},"99":{"tf":1.0}},"’":{"df":1,"docs":{"108":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"4":{"tf":1.0},"43":{"tf":1.4142135623730951}}}}},"t":{"a":{":":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"/":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"s":{"df":10,"docs":{"11":{"tf":1.0},"19":{"tf":1.7320508075688772},"27":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"69":{"tf":1.0},"81":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"103":{"tf":1.0}}}}}},"df":27,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772},"102":{"tf":1.4142135623730951},"103":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"112":{"tf":1.4142135623730951},"115":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951},"37":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"59":{"tf":1.4142135623730951},"66":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.0},"78":{"tf":1.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":6,"docs":{"109":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"67":{"tf":1.0}}}},"y":{"df":1,"docs":{"115":{"tf":1.0}}}},"b":{"df":1,"docs":{"33":{"tf":1.0}}},"d":{"df":1,"docs":{"67":{"tf":1.0}}},"df":5,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"72":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":0,"docs":{}}},":":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"132":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":2,"docs":{"15":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951}}}}},"c":{"a":{"d":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":5,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.7320508075688772},"60":{"tf":2.23606797749979},"62":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"110":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":24,"docs":{"108":{"tf":1.0},"11":{"tf":1.0},"133":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.0},"75":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.4142135623730951},"89":{"tf":2.0},"90":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"106":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"n":{"df":1,"docs":{"95":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"106":{"tf":1.0},"74":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"2":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"82":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"111":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}}},"s":{"c":{"df":1,"docs":{"37":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":20,"docs":{"108":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.4142135623730951},"4":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"72":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"98":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"109":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"44":{"tf":1.0},"62":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"98":{"tf":1.0}}}}}},"t":{"df":2,"docs":{"57":{"tf":1.0},"58":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"124":{"tf":1.4142135623730951},"58":{"tf":1.0},"60":{"tf":1.0}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"121":{"tf":1.0}}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"62":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"119":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":2,"docs":{"14":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"i":{"c":{"df":9,"docs":{"114":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.0},"4":{"tf":1.0},"55":{"tf":1.0},"94":{"tf":1.0},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"t":{"df":12,"docs":{"103":{"tf":1.0},"124":{"tf":1.0},"129":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"75":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":2.0},"98":{"tf":1.7320508075688772}}}},"i":{"df":1,"docs":{"100":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"102":{"tf":1.0},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"r":{">":{"/":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"11":{"tf":1.0},"119":{"tf":1.4142135623730951},"30":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"123":{"tf":1.0},"16":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"123":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":22,"docs":{"11":{"tf":1.7320508075688772},"114":{"tf":1.0},"20":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"30":{"tf":1.0},"32":{"tf":1.4142135623730951},"33":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"100":{"tf":1.0}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":5,"docs":{"129":{"tf":1.0},"70":{"tf":1.0},"83":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"124":{"tf":1.0},"3":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"97":{"tf":1.0}}}}}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"104":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"67":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"95":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"105":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":10,"docs":{"102":{"tf":1.0},"103":{"tf":1.7320508075688772},"106":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.0},"92":{"tf":1.0},"95":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"103":{"tf":1.0}}}}}}},"n":{"df":2,"docs":{"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":1,"docs":{"8":{"tf":1.0}}},"s":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"131":{"tf":1.4142135623730951},"132":{"tf":1.0},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":2.23606797749979},"136":{"tf":1.4142135623730951},"17":{"tf":1.0},"9":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"132":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":1,"docs":{"91":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"’":{"df":0,"docs":{},"t":{"df":1,"docs":{"134":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"’":{"df":0,"docs":{},"t":{"df":7,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"111":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"n":{"df":5,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"127":{"tf":1.0},"135":{"tf":1.0},"76":{"tf":1.0}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"21":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.0}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"118":{"tf":1.0},"63":{"tf":1.0}}}}}},"s":{"a":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"111":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":2.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"87":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"112":{"tf":1.0},"8":{"tf":1.0}}}}},"v":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":2,"docs":{"37":{"tf":1.0},"96":{"tf":1.0}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":18,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951},"110":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.4142135623730951},"123":{"tf":1.0},"124":{"tf":1.0},"135":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"20":{"tf":1.0}}}}},"d":{"2":{"5":{"5":{"1":{"9":{"df":13,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"125":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"2":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"62":{"tf":1.0}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}}}}},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"69":{"tf":1.0}}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":7,"docs":{"104":{"tf":1.0},"114":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.0},"70":{"tf":1.0},"84":{"tf":1.0},"87":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"n":{"df":2,"docs":{"79":{"tf":1.0},"84":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"103":{"tf":1.0},"118":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":9,"docs":{"109":{"tf":1.7320508075688772},"110":{"tf":2.0},"112":{"tf":1.4142135623730951},"113":{"tf":1.0},"114":{"tf":2.0},"115":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"3":{"tf":2.0},"96":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"118":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"85":{"tf":1.0}}}}}}}},"df":1,"docs":{"37":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"100":{"tf":1.0},"90":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"103":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"122":{"tf":1.0},"77":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"125":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"82":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"113":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"131":{"tf":1.0},"29":{"tf":1.0},"75":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"104":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"75":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"3":{"2":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"127":{"tf":1.0},"129":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"136":{"tf":1.0},"78":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"95":{"tf":1.0}}}},"t":{"df":1,"docs":{"129":{"tf":1.0}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"2":{"tf":1.0},"26":{"tf":1.0},"75":{"tf":1.0},"99":{"tf":1.0}}}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"104":{"tf":1.0},"122":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":8,"docs":{"117":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"68":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0},"79":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"106":{"tf":1.0},"111":{"tf":1.0},"97":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":6,"docs":{"100":{"tf":1.0},"104":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"127":{"tf":1.0},"31":{"tf":1.4142135623730951}}}},"t":{"df":2,"docs":{"51":{"tf":1.0},"76":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"74":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"82":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"91":{"tf":1.4142135623730951},"99":{"tf":1.0}}}},"n":{"df":4,"docs":{"1":{"tf":1.0},"26":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"44":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"18":{"tf":1.0},"25":{"tf":2.0},"26":{"tf":1.4142135623730951},"3":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0}}}},"s":{"df":2,"docs":{"120":{"tf":1.0},"130":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"124":{"tf":1.7320508075688772},"125":{"tf":2.0},"129":{"tf":1.0},"63":{"tf":1.0}}}}},"r":{"a":{"df":2,"docs":{"101":{"tf":1.0},"112":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"8":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"c":{"5":{"b":{"4":{"a":{"3":{"9":{"2":{"0":{"1":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":6,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"126":{"tf":1.0},"51":{"tf":1.0},"54":{"tf":1.7320508075688772}},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"103":{"tf":1.0},"116":{"tf":1.0},"122":{"tf":1.0},"82":{"tf":1.0},"99":{"tf":1.0}}}}},"r":{"df":1,"docs":{"106":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"74":{"tf":1.0},"94":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"126":{"tf":1.0},"83":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"105":{"tf":1.0},"126":{"tf":1.0}}},"s":{"df":1,"docs":{"128":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}},"y":{",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"r":{"df":1,"docs":{"101":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"93":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"62":{"tf":1.0},"8":{"tf":1.7320508075688772},"84":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":2,"docs":{"103":{"tf":1.0},"95":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"117":{"tf":1.0}}}}}},"i":{"df":2,"docs":{"127":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"86":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":29,"docs":{"101":{"tf":1.0},"102":{"tf":1.7320508075688772},"11":{"tf":1.0},"110":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"24":{"tf":1.0},"29":{"tf":1.4142135623730951},"3":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":2.23606797749979},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"54":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.7320508075688772},"72":{"tf":1.4142135623730951},"74":{"tf":1.0},"78":{"tf":1.4142135623730951},"90":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"103":{"tf":1.0}}}}}},"n":{"d":{"df":8,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"123":{"tf":1.0}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}}}}}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"76":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":10,"docs":{"123":{"tf":1.0},"129":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"67":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"83":{"tf":1.0},"93":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"76":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"ó":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"3":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":6,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"14":{"tf":1.0},"67":{"tf":1.0},"97":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"109":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"119":{"tf":1.0},"120":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0},"85":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"111":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"123":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"69":{"tf":1.0},"95":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":13,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.449489742783178},"102":{"tf":2.23606797749979},"103":{"tf":1.7320508075688772},"104":{"tf":2.6457513110645907},"105":{"tf":2.23606797749979},"106":{"tf":2.0},"107":{"tf":1.0},"108":{"tf":1.7320508075688772},"126":{"tf":1.0},"129":{"tf":1.4142135623730951},"3":{"tf":1.0},"98":{"tf":1.0}},"’":{"df":1,"docs":{"103":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"s":{"d":{"df":2,"docs":{"8":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"106":{"tf":1.0},"108":{"tf":1.0},"121":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"121":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"96":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":6,"docs":{"10":{"tf":1.0},"3":{"tf":1.0},"32":{"tf":1.0},"70":{"tf":1.0},"79":{"tf":1.0},"98":{"tf":1.7320508075688772}},"i":{"df":3,"docs":{"26":{"tf":1.0},"71":{"tf":1.0},"98":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"_":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.0}}}}}}},"g":{"b":{"df":4,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"67":{"tf":1.0}}},"c":{"df":0,"docs":{},"m":{"df":3,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"101":{"tf":1.0},"110":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"12":{"tf":1.0},"121":{"tf":1.0},"19":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"117":{"tf":1.7320508075688772},"63":{"tf":1.0}},"n":{"df":2,"docs":{"11":{"tf":1.0},"78":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":1,"docs":{"99":{"tf":1.0}},"e":{"df":1,"docs":{"103":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"105":{"tf":1.0}}}},"o":{"d":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"76":{"tf":1.0}}}},"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"87":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"103":{"tf":1.0},"110":{"tf":1.0},"116":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0}}}}}},"r":{"d":{"c":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"79":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"117":{"tf":1.0}},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":23,"docs":{"103":{"tf":1.0},"104":{"tf":1.7320508075688772},"112":{"tf":1.0},"113":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"50":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":1.4142135623730951},"92":{"tf":1.0},"94":{"tf":1.0}}},"n":{"df":0,"docs":{},"’":{"df":0,"docs":{},"t":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"’":{"df":0,"docs":{},"t":{"df":1,"docs":{"55":{"tf":1.0}}}}}}}},"df":1,"docs":{"11":{"tf":1.0}},"e":{"a":{"d":{"df":1,"docs":{"96":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"105":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"1":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0}}}}}},"df":0,"docs":{}},"2":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"118":{"tf":1.0},"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"df":0,"docs":{}},"3":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":7,"docs":{"109":{"tf":1.0},"116":{"tf":1.4142135623730951},"118":{"tf":2.449489742783178},"119":{"tf":1.7320508075688772},"120":{"tf":1.4142135623730951},"121":{"tf":1.7320508075688772},"44":{"tf":1.0}}}},"l":{"d":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":3,"docs":{"11":{"tf":2.23606797749979},"123":{"tf":1.0},"91":{"tf":1.0}}}},"x":{"df":3,"docs":{"22":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"7":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"111":{"tf":1.0},"129":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"105":{"tf":2.0},"110":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":4,"docs":{"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"/":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"}":{"/":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"z":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"19":{"tf":1.0},"31":{"tf":1.0}},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"df":2,"docs":{"121":{"tf":1.0},"22":{"tf":1.0}}}},"o":{"d":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":1,"docs":{"95":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"~":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"n":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"11":{"tf":1.0},"118":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"111":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"d":{"df":5,"docs":{"121":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"e":{"a":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"t":{"df":23,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"11":{"tf":1.0},"114":{"tf":1.7320508075688772},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.7320508075688772},"121":{"tf":1.0},"125":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"26":{"tf":1.0},"27":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.4142135623730951},"33":{"tf":1.0},"60":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":2.23606797749979},"81":{"tf":1.0},"94":{"tf":1.4142135623730951},"97":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":5,"docs":{"104":{"tf":1.0},"22":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0}}}},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":4,"docs":{"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"20":{"tf":1.0},"38":{"tf":1.4142135623730951}}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"115":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"109":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"16":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":14,"docs":{"114":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"125":{"tf":1.4142135623730951},"135":{"tf":1.0},"2":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"62":{"tf":1.0},"8":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"0":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"df":5,"docs":{"19":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.0}}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"39":{"tf":1.0}}}},"o":{"df":2,"docs":{"120":{"tf":1.0},"75":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"m":{"df":4,"docs":{"112":{"tf":1.0},"117":{"tf":1.0},"120":{"tf":1.0},"122":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"0":{"tf":1.0},"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"t":{"df":6,"docs":{"11":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.4142135623730951},"32":{"tf":1.0}},"i":{"df":6,"docs":{"11":{"tf":1.0},"19":{"tf":1.7320508075688772},"27":{"tf":1.0},"31":{"tf":1.4142135623730951},"76":{"tf":1.0},"92":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"133":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"120":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"l":{"df":10,"docs":{"10":{"tf":2.449489742783178},"11":{"tf":1.0},"119":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"29":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":2.8284271247461903},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"51":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"82":{"tf":2.6457513110645907}},"r":{"df":8,"docs":{"105":{"tf":1.0},"11":{"tf":1.0},"2":{"tf":1.0},"24":{"tf":1.0},"3":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0},"55":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"37":{"tf":1.0},"43":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"a":{"c":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":1,"docs":{"124":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}},"v":{"df":1,"docs":{"108":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"123":{"tf":1.0},"125":{"tf":1.0}},"t":{"df":2,"docs":{"0":{"tf":1.0},"125":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"o":{"df":2,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951}},"t":{"df":1,"docs":{"98":{"tf":1.0}}}},"p":{"df":6,"docs":{"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":1.0}},"v":{"4":{"df":3,"docs":{"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}}},"6":{"_":{"df":0,"docs":{},"v":{"6":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{}}},"df":4,"docs":{"86":{"tf":1.7320508075688772},"87":{"tf":2.23606797749979},"88":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"121":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"4":{"tf":1.0}}},"r":{"df":3,"docs":{"82":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"100":{"tf":1.0},"26":{"tf":1.0},"93":{"tf":1.0}}}}}},"’":{"df":2,"docs":{"105":{"tf":1.0},"96":{"tf":1.0}}}}},"j":{"a":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"4":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.4142135623730951},"83":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":6,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0}}}},"g":{"df":2,"docs":{"20":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":5,"docs":{"26":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0},"79":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}}},"k":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":4,"docs":{"3":{"tf":1.0},"82":{"tf":1.0},"92":{"tf":1.0},"95":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"b":{"/":{"df":2,"docs":{"126":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951}}},"df":3,"docs":{"23":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.4142135623730951}}},"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":5,"docs":{"103":{"tf":1.0},"107":{"tf":1.0},"121":{"tf":1.0},"82":{"tf":1.0},"99":{"tf":1.0}}}},"m":{"df":3,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.0},"3":{"tf":1.0}}},"y":{"df":26,"docs":{"104":{"tf":1.0},"110":{"tf":2.8284271247461903},"111":{"tf":2.449489742783178},"113":{"tf":2.449489742783178},"114":{"tf":2.23606797749979},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.4142135623730951},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.4142135623730951}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":6,"docs":{"114":{"tf":1.7320508075688772},"119":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0}}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":5,"docs":{"111":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"92":{"tf":1.0},"95":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"62":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":4,"docs":{"105":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.0}}}}}},"y":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"37":{"tf":1.4142135623730951},"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"102":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"107":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":1,"docs":{"72":{"tf":1.0}},"e":{"a":{"d":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"92":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"74":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"74":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"37":{"tf":1.0},"44":{"tf":1.4142135623730951},"67":{"tf":1.0},"75":{"tf":1.4142135623730951},"84":{"tf":1.0}}}}}},"i":{"b":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"8":{"tf":1.0}}},"y":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"71":{"tf":1.0},"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"3":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":2,"docs":{"74":{"tf":1.0},"93":{"tf":1.0}}}}}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"107":{"tf":1.0},"108":{"tf":1.0},"126":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951}}}}},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"72":{"tf":1.0},"96":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":2.0},"71":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":11,"docs":{"11":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"37":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"62":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0},"83":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":6,"docs":{"79":{"tf":1.0},"81":{"tf":1.0},"86":{"tf":1.4142135623730951},"87":{"tf":2.0},"89":{"tf":1.0},"90":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.4142135623730951},"96":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"o":{"a":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":3,"docs":{"71":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":16,"docs":{"105":{"tf":2.0},"106":{"tf":1.0},"11":{"tf":1.4142135623730951},"19":{"tf":1.0},"2":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.4142135623730951},"33":{"tf":1.0},"45":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.0},"82":{"tf":1.0},"84":{"tf":1.0},"98":{"tf":1.0}}},"t":{"df":6,"docs":{"121":{"tf":1.0},"22":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.4142135623730951},"42":{"tf":1.0},"91":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":3,"docs":{"109":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":4,"docs":{"135":{"tf":1.4142135623730951},"43":{"tf":1.0},"75":{"tf":2.0},"85":{"tf":1.4142135623730951}},"i":{"c":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"115":{"tf":1.0},"2":{"tf":1.0},"82":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"118":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":4,"docs":{"3":{"tf":1.0},"82":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"105":{"tf":1.7320508075688772},"108":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"101":{"tf":1.0},"106":{"tf":1.0}}},"t":{"df":1,"docs":{"105":{"tf":1.0}}}}}},"m":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"63":{"tf":1.0}}}}},"o":{"df":5,"docs":{"14":{"tf":1.0},"71":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"89":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"92":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}}}},"k":{"df":0,"docs":{},"e":{"df":4,"docs":{"1":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"107":{"tf":1.0},"3":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"82":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":9,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"50":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":2,"docs":{"104":{"tf":1.0},"124":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"104":{"tf":1.0},"112":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"122":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"100":{"tf":1.0},"2":{"tf":1.0}}}}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":4,"docs":{"107":{"tf":1.4142135623730951},"108":{"tf":1.7320508075688772},"128":{"tf":1.0},"82":{"tf":1.4142135623730951}}}}}}}},"b":{"df":6,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"106":{"tf":2.23606797749979},"108":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"n":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":1,"docs":{"101":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":7,"docs":{"1":{"tf":1.0},"102":{"tf":1.0},"112":{"tf":1.0},"124":{"tf":1.0},"51":{"tf":1.0},"62":{"tf":1.0},"93":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":3,"docs":{"122":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"102":{"tf":1.0},"55":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":24,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.7320508075688772},"107":{"tf":1.0},"109":{"tf":1.0},"11":{"tf":1.0},"110":{"tf":1.0},"115":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":2.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.4142135623730951},"4":{"tf":2.0},"45":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"67":{"tf":1.4142135623730951},"68":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"a":{"1":{"b":{"2":{"c":{"3":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"4":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"9":{"d":{"0":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"2":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"v":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"4":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"a":{"7":{"b":{"8":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"g":{"7":{"df":0,"docs":{},"h":{"8":{"df":0,"docs":{},"i":{"9":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":4,"docs":{"11":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.7320508075688772},"127":{"tf":1.0}},"e":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":6,"docs":{"1":{"tf":1.0},"120":{"tf":1.0},"26":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":3,"docs":{"130":{"tf":1.4142135623730951},"85":{"tf":1.0},"95":{"tf":1.0}},"s":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"127":{"tf":1.0},"129":{"tf":2.0},"33":{"tf":1.0},"63":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"94":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"2":{"tf":1.0},"90":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"105":{"tf":1.0}}}},"x":{"df":1,"docs":{"121":{"tf":1.0}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":4,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.0}}},"m":{"df":1,"docs":{"67":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"b":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":7,"docs":{"127":{"tf":1.0},"129":{"tf":1.4142135623730951},"13":{"tf":1.0},"130":{"tf":1.0},"3":{"tf":1.4142135623730951},"96":{"tf":1.0},"98":{"tf":1.0}},"e":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"9":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":3,"docs":{"109":{"tf":1.0},"122":{"tf":1.0},"43":{"tf":1.0}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"96":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"38":{"tf":2.0},"39":{"tf":1.0},"4":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"130":{"tf":1.0},"85":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":9,"docs":{"101":{"tf":1.0},"103":{"tf":1.0},"106":{"tf":1.4142135623730951},"109":{"tf":1.0},"121":{"tf":1.4142135623730951},"2":{"tf":1.0},"92":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}}},"s":{"a":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"63":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"131":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":5,"docs":{"100":{"tf":1.0},"107":{"tf":1.0},"124":{"tf":1.0},"73":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"96":{"tf":1.0}}}}}}}}}}},"n":{"+":{"df":0,"docs":{},"m":{"df":1,"docs":{"101":{"tf":1.0}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0},"60":{"tf":1.0}}}},"t":{"df":7,"docs":{"123":{"tf":2.0},"124":{"tf":2.8284271247461903},"125":{"tf":2.0},"126":{"tf":1.0},"128":{"tf":2.0},"130":{"tf":1.7320508075688772},"96":{"tf":1.0}},"e":{"df":1,"docs":{"128":{"tf":1.0}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"129":{"tf":1.0},"86":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"113":{"tf":1.0},"92":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":3,"docs":{"101":{"tf":1.4142135623730951},"117":{"tf":1.0},"37":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"d":{"df":13,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"109":{"tf":1.0},"119":{"tf":1.0},"124":{"tf":1.4142135623730951},"13":{"tf":1.0},"26":{"tf":1.0},"63":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"129":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":29,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"100":{"tf":1.0},"103":{"tf":1.0},"105":{"tf":1.4142135623730951},"106":{"tf":1.0},"108":{"tf":1.0},"123":{"tf":1.4142135623730951},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":2.0},"16":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"70":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.4142135623730951},"79":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.7320508075688772},"91":{"tf":1.4142135623730951},"92":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951},"98":{"tf":2.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"121":{"tf":1.0}}}}},"w":{"df":8,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"121":{"tf":1.0},"129":{"tf":1.4142135623730951},"55":{"tf":1.0},"74":{"tf":1.0},"76":{"tf":1.0},"97":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"97":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"22":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":39,"docs":{"10":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.4142135623730951},"106":{"tf":2.0},"113":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":2.0},"125":{"tf":2.23606797749979},"126":{"tf":2.23606797749979},"127":{"tf":1.0},"128":{"tf":1.4142135623730951},"129":{"tf":1.7320508075688772},"131":{"tf":1.0},"133":{"tf":1.7320508075688772},"134":{"tf":1.4142135623730951},"135":{"tf":2.0},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"70":{"tf":1.7320508075688772},"71":{"tf":1.4142135623730951},"73":{"tf":2.0},"74":{"tf":1.7320508075688772},"79":{"tf":1.0},"81":{"tf":1.4142135623730951},"83":{"tf":1.0},"87":{"tf":1.7320508075688772},"9":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":2.8284271247461903},"93":{"tf":1.7320508075688772},"94":{"tf":2.449489742783178},"95":{"tf":2.23606797749979},"96":{"tf":1.0},"97":{"tf":2.449489742783178},"98":{"tf":3.0},"99":{"tf":1.0}}}},"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"74":{"tf":1.7320508075688772},"94":{"tf":1.4142135623730951}}},"df":4,"docs":{"126":{"tf":1.0},"128":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.4142135623730951}},"e":{"df":2,"docs":{"37":{"tf":1.4142135623730951},"72":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"89":{"tf":1.0}}},"h":{"df":2,"docs":{"105":{"tf":1.0},"117":{"tf":1.0}}}},"w":{"df":5,"docs":{"1":{"tf":1.0},"114":{"tf":1.0},"125":{"tf":1.0},"3":{"tf":1.0},"62":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"67":{"tf":1.0},"82":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"99":{"tf":1.0}}}}}}},"k":{"df":3,"docs":{"24":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}},"l":{"d":{"df":2,"docs":{"121":{"tf":1.0},"125":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":2,"docs":{"104":{"tf":1.0},"63":{"tf":1.0}}},"df":9,"docs":{"104":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"92":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.4142135623730951}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"112":{"tf":1.0},"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"s":{"d":{"df":3,"docs":{"8":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}},"df":7,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"125":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"77":{"tf":1.0}}},"r":{"df":4,"docs":{"106":{"tf":1.0},"71":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":14,"docs":{"11":{"tf":1.4142135623730951},"123":{"tf":1.0},"136":{"tf":1.0},"17":{"tf":1.0},"30":{"tf":1.4142135623730951},"35":{"tf":1.0},"37":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"59":{"tf":1.4142135623730951},"66":{"tf":1.4142135623730951},"72":{"tf":2.0},"78":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"103":{"tf":1.0},"129":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"101":{"tf":1.0},"117":{"tf":1.0},"125":{"tf":1.0}}}}}}},"s":{"df":1,"docs":{"89":{"tf":1.4142135623730951}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"106":{"tf":1.0},"126":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"16":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":1,"docs":{"93":{"tf":1.0}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"119":{"tf":1.4142135623730951},"120":{"tf":1.0},"122":{"tf":1.0},"22":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0},"85":{"tf":1.0}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"123":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":9,"docs":{"111":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"50":{"tf":1.0},"70":{"tf":1.0},"77":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.4142135623730951},"96":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"72":{"tf":1.0},"78":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}}}}},"w":{"df":1,"docs":{"106":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"103":{"tf":1.0},"113":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"3":{"tf":1.0}},"’":{"df":2,"docs":{"113":{"tf":1.0},"114":{"tf":1.0}}}}}}}},"p":{"2":{"df":0,"docs":{},"p":{"df":5,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0}}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"1":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"126":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"130":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"118":{"tf":1.0},"121":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"108":{"tf":1.0},"82":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"108":{"tf":1.0},"82":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":5,"docs":{"10":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"92":{"tf":1.0},"98":{"tf":2.0}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":5,"docs":{"113":{"tf":1.0},"24":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":14,"docs":{"10":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"7":{"tf":1.0},"72":{"tf":1.7320508075688772},"78":{"tf":1.0},"8":{"tf":1.4142135623730951},"81":{"tf":1.0}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"m":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":3,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"b":{"df":1,"docs":{"106":{"tf":1.0}}},"c":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":19,"docs":{"0":{"tf":1.4142135623730951},"100":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":2.449489742783178},"105":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"126":{"tf":1.7320508075688772},"128":{"tf":1.7320508075688772},"129":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"70":{"tf":1.4142135623730951},"82":{"tf":1.0},"83":{"tf":1.4142135623730951},"92":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"’":{"df":1,"docs":{"108":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"121":{"tf":1.0},"44":{"tf":1.0}}}}},"r":{"df":2,"docs":{"108":{"tf":1.0},"82":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"55":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"129":{"tf":1.0},"3":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"98":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"26":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}}}},"df":0,"docs":{}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"121":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"i":{"df":2,"docs":{"94":{"tf":1.0},"98":{"tf":1.0}},"e":{"c":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"105":{"tf":1.0},"82":{"tf":1.0},"97":{"tf":1.0}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"125":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"g":{"df":2,"docs":{"14":{"tf":1.4142135623730951},"8":{"tf":1.0}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"121":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"38":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":4,"docs":{"14":{"tf":1.4142135623730951},"72":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"20":{"tf":1.0},"38":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"121":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":7,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"82":{"tf":1.7320508075688772},"91":{"tf":1.0},"93":{"tf":1.7320508075688772},"95":{"tf":1.7320508075688772}}}}}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"124":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"97":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"124":{"tf":1.7320508075688772},"128":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.7320508075688772},"72":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.4142135623730951},"96":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":4,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"115":{"tf":1.0},"3":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"126":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"14":{"tf":1.0},"6":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":6,"docs":{"0":{"tf":1.0},"109":{"tf":1.0},"11":{"tf":1.0},"113":{"tf":1.0},"20":{"tf":1.0},"31":{"tf":1.0}}}}},"s":{"df":1,"docs":{"76":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"112":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"94":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":3,"docs":{"21":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"111":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"df":4,"docs":{"11":{"tf":1.4142135623730951},"118":{"tf":1.0},"121":{"tf":1.0},"71":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.0},"129":{"tf":1.0}}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"109":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":14,"docs":{"109":{"tf":1.0},"110":{"tf":1.4142135623730951},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"123":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"123":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"125":{"tf":1.0},"4":{"tf":1.0},"97":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"111":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"129":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":2,"docs":{"130":{"tf":1.0},"85":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"37":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"f":{"df":4,"docs":{"3":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"101":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":4,"docs":{"103":{"tf":1.0},"16":{"tf":1.4142135623730951},"88":{"tf":1.0},"96":{"tf":1.0}}}}},"df":1,"docs":{"7":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"105":{"tf":1.0},"125":{"tf":1.4142135623730951}},"n":{"df":2,"docs":{"122":{"tf":1.0},"92":{"tf":1.0}}}},"i":{"d":{"df":2,"docs":{"131":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"df":2,"docs":{"37":{"tf":1.0},"42":{"tf":1.0}}},"u":{"b":{"df":1,"docs":{"15":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":24,"docs":{"109":{"tf":1.4142135623730951},"110":{"tf":1.0},"113":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"115":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.7320508075688772},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"128":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.4142135623730951},"4":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":3,"docs":{"113":{"tf":1.4142135623730951},"115":{"tf":1.0},"3":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}}},"n":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"123":{"tf":1.4142135623730951},"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.0},"130":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":3,"docs":{"114":{"tf":1.0},"121":{"tf":1.0},"9":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"103":{"tf":1.4142135623730951}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"115":{"tf":1.0},"116":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"103":{"tf":1.0},"92":{"tf":1.0}}}}},"i":{"c":{"df":9,"docs":{"129":{"tf":1.4142135623730951},"16":{"tf":1.0},"3":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.0},"96":{"tf":1.7320508075688772}},"k":{"df":2,"docs":{"17":{"tf":1.0},"18":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"105":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"94":{"tf":1.0},"98":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"130":{"tf":1.0}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}},"y":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":1,"docs":{"126":{"tf":2.0}},"e":{"a":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"124":{"tf":1.0},"125":{"tf":1.0},"95":{"tf":1.0}}}},"d":{"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"118":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":4,"docs":{"1":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.0}}}},"i":{"df":2,"docs":{"135":{"tf":1.0},"71":{"tf":1.0}}},"m":{"df":0,"docs":{},"e":{".":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"26":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"125":{"tf":1.0}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"103":{"tf":1.0}}}},"v":{"df":3,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"55":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"106":{"tf":1.4142135623730951},"126":{"tf":1.7320508075688772},"128":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"121":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"50":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"129":{"tf":2.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"101":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":2.0},"121":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"r":{"d":{"df":6,"docs":{"1":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":3,"docs":{"111":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"116":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"105":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"101":{"tf":1.0},"106":{"tf":1.0}}},"df":0,"docs":{}}}},"df":3,"docs":{"121":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.7320508075688772}},"e":{"d":{"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"df":0,"docs":{}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.7320508075688772}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"125":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"82":{"tf":1.0},"97":{"tf":1.0}}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"124":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"121":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.0},"115":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}},"y":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"p":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"128":{"tf":1.4142135623730951}}}},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"128":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"p":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"123":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":2.449489742783178},"127":{"tf":1.0},"128":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"98":{"tf":1.0}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"126":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"82":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":6,"docs":{"100":{"tf":1.0},"105":{"tf":1.7320508075688772},"106":{"tf":1.0},"108":{"tf":1.7320508075688772},"3":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"a":{"c":{"df":3,"docs":{"105":{"tf":1.0},"119":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{},"y":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":10,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"103":{"tf":1.0},"105":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"105":{"tf":1.0},"124":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"10":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0}}}}}}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":1,"docs":{"82":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"105":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":5,"docs":{"118":{"tf":1.0},"121":{"tf":1.0},"26":{"tf":1.0},"7":{"tf":1.0},"94":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"122":{"tf":1.0},"98":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"88":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"105":{"tf":1.0},"95":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"74":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"117":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"92":{"tf":1.0}}}}}},"o":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"103":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"132":{"tf":1.0},"15":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"n":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":3,"docs":{"82":{"tf":1.4142135623730951},"92":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"123":{"tf":1.0},"128":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"55":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"106":{"tf":1.0}}}},"n":{"df":23,"docs":{"105":{"tf":1.0},"108":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.7320508075688772},"134":{"tf":1.7320508075688772},"135":{"tf":1.0},"136":{"tf":1.0},"17":{"tf":1.7320508075688772},"21":{"tf":1.4142135623730951},"29":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"70":{"tf":1.4142135623730951},"71":{"tf":1.0},"73":{"tf":1.7320508075688772},"74":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951},"98":{"tf":2.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"132":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{":":{"1":{".":{"8":{"5":{"df":1,"docs":{"132":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"=":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{",":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"=":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"75":{"tf":1.0}}}}}},"c":{"df":1,"docs":{"7":{"tf":1.0}}},"df":3,"docs":{"14":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":2.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}},"s":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":3,"docs":{"121":{"tf":1.0},"31":{"tf":1.0},"99":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"df":6,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"111":{"tf":1.0},"119":{"tf":1.0},"124":{"tf":1.4142135623730951},"98":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"118":{"tf":1.0},"129":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"33":{"tf":1.0},"60":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":1,"docs":{"8":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"l":{"df":9,"docs":{"109":{"tf":1.4142135623730951},"110":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.7320508075688772},"113":{"tf":1.7320508075688772},"115":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":7,"docs":{"125":{"tf":1.0},"128":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"76":{"tf":1.0},"82":{"tf":1.7320508075688772},"94":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"109":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":5,"docs":{"111":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.7320508075688772},"120":{"tf":1.0},"122":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"128":{"tf":1.0},"80":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"117":{"tf":1.0},"121":{"tf":1.7320508075688772},"122":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"d":{"df":7,"docs":{"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"4":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.7320508075688772}}},"df":6,"docs":{"11":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"21":{"tf":1.0},"72":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}},"f":{"df":9,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"56":{"tf":1.0},"62":{"tf":1.0},"97":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"124":{"tf":1.0},"125":{"tf":2.0},"126":{"tf":1.7320508075688772},"127":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}},"’":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"78":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"121":{"tf":1.0},"37":{"tf":1.0},"72":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"129":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"128":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"124":{"tf":1.7320508075688772},"128":{"tf":1.0},"131":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0},"98":{"tf":1.0}}}},"i":{"c":{"df":2,"docs":{"126":{"tf":1.0},"135":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.7320508075688772},"124":{"tf":1.0},"126":{"tf":2.23606797749979},"127":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951}}}}}}},"t":{"df":5,"docs":{"128":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"81":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"’":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"1":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"df":0,"docs":{}},"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":10,"docs":{"104":{"tf":1.0},"111":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":3.0},"118":{"tf":3.0},"119":{"tf":1.4142135623730951},"120":{"tf":2.23606797749979},"121":{"tf":2.449489742783178},"122":{"tf":1.7320508075688772},"63":{"tf":1.0}}}}},"df":1,"docs":{"7":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"12":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"129":{"tf":1.0},"75":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"76":{"tf":1.0}}}}}},"df":1,"docs":{"76":{"tf":1.0}}}}},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"117":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"1":{"tf":1.0},"111":{"tf":1.0},"113":{"tf":1.4142135623730951},"125":{"tf":2.23606797749979},"2":{"tf":1.0},"24":{"tf":1.4142135623730951},"26":{"tf":1.0},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"53":{"tf":1.0},"54":{"tf":1.0},"60":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"e":{"d":{"2":{"5":{"5":{"1":{"9":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"113":{"tf":1.0},"114":{"tf":1.7320508075688772},"127":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"103":{"tf":1.0},"106":{"tf":1.0}},"i":{"df":1,"docs":{"106":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":5,"docs":{"100":{"tf":1.0},"108":{"tf":1.0},"117":{"tf":1.0},"133":{"tf":1.0},"4":{"tf":1.0}}}}},"t":{"df":1,"docs":{"123":{"tf":1.0}}},"z":{"df":0,"docs":{},"e":{"df":7,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"107":{"tf":1.7320508075688772},"120":{"tf":1.0},"23":{"tf":1.0},"67":{"tf":1.4142135623730951},"68":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"37":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"132":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":5,"docs":{"1":{"tf":1.0},"102":{"tf":1.4142135623730951},"132":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}},"v":{"df":2,"docs":{"100":{"tf":1.0},"123":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"55":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"93":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"39":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"10":{"tf":1.0},"125":{"tf":1.0},"5":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":6,"docs":{"109":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.4142135623730951},"81":{"tf":1.0}},"i":{"df":1,"docs":{"113":{"tf":1.0}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"100":{"tf":1.0},"103":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"121":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"125":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"117":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"100":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"3":{"df":1,"docs":{"8":{"tf":1.0}}},"df":5,"docs":{"104":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"8":{"tf":3.7416573867739413}}}}}}},"s":{"df":0,"docs":{},"f":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":2.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"132":{"tf":1.0}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"113":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"124":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"71":{"tf":1.0},"92":{"tf":1.0},"94":{"tf":1.0},"97":{"tf":1.0}}}},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"3":{"tf":1.0}}}},"y":{"df":4,"docs":{"114":{"tf":1.0},"115":{"tf":1.0},"33":{"tf":1.0},"93":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"17":{"tf":1.0},"22":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"105":{"tf":1.0},"62":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"108":{"tf":1.0},"135":{"tf":1.0},"76":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":19,"docs":{"101":{"tf":1.0},"106":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"11":{"tf":1.0},"118":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"126":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"63":{"tf":1.0},"66":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":22,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.0},"106":{"tf":2.449489742783178},"11":{"tf":1.0},"110":{"tf":1.0},"114":{"tf":1.0},"121":{"tf":1.4142135623730951},"126":{"tf":1.0},"133":{"tf":1.0},"2":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"55":{"tf":1.0},"63":{"tf":1.0},"74":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"98":{"tf":1.4142135623730951}}},"m":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"22":{"tf":1.0},"83":{"tf":1.4142135623730951},"85":{"tf":1.0}}}},"p":{"df":1,"docs":{"126":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"26":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"60":{"tf":1.4142135623730951},"75":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"3":{"4":{"7":{"8":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"1":{"9":{"3":{"0":{"2":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"128":{"tf":1.0}}}}}}},"df":5,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0}}}}},"u":{"b":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"103":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"74":{"tf":1.0}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"130":{"tf":1.0},"135":{"tf":1.0},"53":{"tf":1.0}}}}}},"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"14":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"99":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"71":{"tf":1.0},"81":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":7,"docs":{"109":{"tf":1.0},"112":{"tf":1.0},"129":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.0},"86":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":5,"docs":{"0":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"96":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"127":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"94":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"124":{"tf":1.0},"126":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":4,"docs":{"115":{"tf":1.0},"8":{"tf":2.0},"87":{"tf":1.0},"92":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":7,"docs":{"104":{"tf":1.0},"4":{"tf":1.0},"67":{"tf":1.0},"70":{"tf":1.0},"82":{"tf":1.4142135623730951},"92":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"22":{"tf":1.0},"37":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"=":{"5":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"k":{"df":0,"docs":{},"e":{"df":4,"docs":{"125":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"104":{"tf":1.0},"55":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"63":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"102":{"tf":1.0},"95":{"tf":1.0}}}}}}},"df":3,"docs":{"117":{"tf":1.7320508075688772},"122":{"tf":1.0},"132":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":31,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"12":{"tf":1.7320508075688772},"120":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0},"53":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"115":{"tf":1.0},"2":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":77,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.23606797749979},"10":{"tf":1.7320508075688772},"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"103":{"tf":1.7320508075688772},"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.7320508075688772},"109":{"tf":2.0},"11":{"tf":2.23606797749979},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":2.23606797749979},"113":{"tf":2.0},"115":{"tf":1.0},"116":{"tf":1.4142135623730951},"118":{"tf":1.0},"123":{"tf":1.0},"129":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":2.23606797749979},"134":{"tf":1.4142135623730951},"136":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.0},"22":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.7320508075688772},"29":{"tf":1.7320508075688772},"3":{"tf":2.6457513110645907},"30":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":2.8284271247461903},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.7320508075688772},"56":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.0},"70":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":2.23606797749979},"75":{"tf":2.0},"78":{"tf":1.0},"8":{"tf":1.4142135623730951},"86":{"tf":1.0},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"98":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}},"s":{"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"d":{"b":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"’":{"df":3,"docs":{"103":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":5,"docs":{"111":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":2.0},"87":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"135":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"t":{"df":13,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"119":{"tf":1.0},"122":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.4142135623730951},"85":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"117":{"tf":1.0},"122":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"2":{"tf":1.0}}}},"r":{"d":{"df":1,"docs":{"123":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"93":{"tf":1.0},"95":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"39":{"tf":1.0}}}}},"s":{"a":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"1":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"102":{"tf":1.0},"123":{"tf":1.0},"129":{"tf":1.0}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":5,"docs":{"108":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"120":{"tf":1.0},"121":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":8,"docs":{"108":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.0},"129":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"102":{"tf":2.0},"103":{"tf":1.0},"123":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.4142135623730951},"116":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"92":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"128":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"l":{"df":1,"docs":{"96":{"tf":1.0}},"s":{"df":0,"docs":{},"v":{"1":{".":{"2":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"121":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"126":{"tf":1.7320508075688772}}}}},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"72":{"tf":1.0},"78":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"101":{"tf":1.4142135623730951},"108":{"tf":1.0},"117":{"tf":1.0},"130":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"75":{"tf":1.0}}},"k":{"df":2,"docs":{"106":{"tf":1.0},"93":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"125":{"tf":1.0},"128":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"108":{"tf":1.4142135623730951},"55":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"123":{"tf":1.4142135623730951},"96":{"tf":1.0}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":4,"docs":{"123":{"tf":1.0},"124":{"tf":1.0},"128":{"tf":1.0},"130":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":3,"docs":{"123":{"tf":1.0},"129":{"tf":1.0},"94":{"tf":1.0}}},"u":{"df":0,"docs":{},"e":{"df":4,"docs":{"113":{"tf":1.0},"128":{"tf":1.0},"79":{"tf":1.0},"84":{"tf":1.0}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"122":{"tf":1.0},"74":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"116":{"tf":1.0},"55":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"108":{"tf":1.0},"82":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"o":{"df":10,"docs":{"10":{"tf":1.0},"104":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"123":{"tf":1.7320508075688772},"125":{"tf":1.0},"8":{"tf":1.0},"95":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":6,"docs":{"118":{"tf":1.0},"121":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"83":{"tf":1.0}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":14,"docs":{"114":{"tf":1.0},"124":{"tf":1.7320508075688772},"128":{"tf":1.0},"130":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"98":{"tf":1.4142135623730951}}},"i":{"c":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"p":{"df":6,"docs":{"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"133":{"tf":1.0},"16":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"96":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"w":{"df":1,"docs":{"77":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"32":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"94":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"26":{"tf":1.0},"62":{"tf":1.4142135623730951},"91":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":5,"docs":{"104":{"tf":1.0},"22":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"106":{"tf":1.0}}}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"124":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"124":{"tf":1.0}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"97":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"95":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"127":{"tf":1.0},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":11,"docs":{"101":{"tf":1.0},"104":{"tf":1.0},"119":{"tf":1.0},"135":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"76":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"g":{"df":6,"docs":{"11":{"tf":1.0},"28":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.0},"57":{"tf":1.0},"65":{"tf":1.0}}}},"b":{"df":2,"docs":{"118":{"tf":1.0},"63":{"tf":1.0}}},"df":31,"docs":{"1":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"113":{"tf":1.0},"116":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"136":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"55":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.4142135623730951},"87":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.4142135623730951},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"117":{"tf":1.0}}}}}},"r":{"df":2,"docs":{"74":{"tf":1.0},"90":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":4,"docs":{"1":{"tf":1.0},"38":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"124":{"tf":1.0}}}}}},"v":{"1":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":1,"docs":{"118":{"tf":1.0}}},"a":{"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{",":{"b":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":10,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"24":{"tf":1.4142135623730951},"50":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":4,"docs":{"37":{"tf":1.0},"72":{"tf":1.0},"78":{"tf":1.0},"90":{"tf":1.0}}}},"r":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"75":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":8,"docs":{"104":{"tf":1.0},"121":{"tf":1.0},"24":{"tf":1.0},"3":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951},"55":{"tf":1.0}},"i":{"df":17,"docs":{"10":{"tf":1.0},"100":{"tf":1.0},"105":{"tf":1.0},"11":{"tf":1.7320508075688772},"112":{"tf":1.0},"113":{"tf":1.0},"119":{"tf":1.0},"125":{"tf":1.4142135623730951},"18":{"tf":1.0},"24":{"tf":1.7320508075688772},"46":{"tf":1.4142135623730951},"47":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.0},"55":{"tf":1.4142135623730951},"7":{"tf":1.0},"97":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"120":{"tf":1.0},"122":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772}}}}}}}},"i":{"a":{"df":7,"docs":{"3":{"tf":1.0},"7":{"tf":1.0},"75":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0},"98":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"120":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":8,"docs":{"109":{"tf":1.0},"23":{"tf":1.0},"37":{"tf":1.4142135623730951},"4":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.4142135623730951},"68":{"tf":1.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"18":{"tf":1.0}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"20":{"tf":1.0}}},"n":{"df":1,"docs":{"75":{"tf":1.0}}}},"s":{"df":0,"docs":{},"m":{"df":1,"docs":{"98":{"tf":1.0}}}},"v":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}}},"df":5,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0}}},"y":{"df":3,"docs":{"102":{"tf":1.0},"7":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"df":2,"docs":{"123":{"tf":1.0},"98":{"tf":1.0}},"m":{"df":3,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"111":{"tf":1.0},"124":{"tf":1.0},"82":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"’":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"119":{"tf":1.0},"124":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"88":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"102":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"129":{"tf":1.0},"95":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}}},"df":2,"docs":{"127":{"tf":1.0},"96":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"89":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"4":{"tf":1.0},"95":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":15,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"4":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":11,"docs":{"103":{"tf":1.0},"110":{"tf":1.0},"117":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"3":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.4142135623730951},"82":{"tf":1.0},"94":{"tf":1.4142135623730951},"96":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"l":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"124":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"110":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"33":{"tf":1.0},"63":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"x":{"2":{"5":{"5":{"1":{"9":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"g":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"93":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"95":{"tf":2.0}}}}},"y":{"df":1,"docs":{"93":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"62":{"tf":1.0},"92":{"tf":1.0}}}},"df":2,"docs":{"89":{"tf":2.0},"98":{"tf":1.4142135623730951}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}},"’":{"df":0,"docs":{},"r":{"df":1,"docs":{"77":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"y":{"df":0,"docs":{},"i":{"df":1,"docs":{"67":{"tf":1.0}}}}}},"z":{"df":1,"docs":{"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"122":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}}}},"breadcrumbs":{"root":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"4":{"4":{"3":{"3":{"df":7,"docs":{"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"0":{"0":{"df":2,"docs":{"73":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"68":{"tf":1.0}}},"2":{"df":3,"docs":{"118":{"tf":1.0},"23":{"tf":1.0},"68":{"tf":1.4142135623730951}}},"df":4,"docs":{"106":{"tf":1.0},"129":{"tf":1.0},"51":{"tf":1.0},"89":{"tf":2.0}}},"1":{".":{"3":{"df":1,"docs":{"96":{"tf":1.0}}},"8":{"5":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{",":{"0":{"0":{"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"101":{"tf":1.0}}},"df":3,"docs":{"126":{"tf":1.0},"129":{"tf":1.0},"68":{"tf":1.0}}},"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"9":{"1":{"9":{"0":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"23":{"tf":1.0},"68":{"tf":1.0}}},"5":{"0":{"df":1,"docs":{"101":{"tf":1.0}}},"df":1,"docs":{"118":{"tf":1.0}}},"6":{"+":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.0},"67":{"tf":1.0}}},"7":{"df":1,"docs":{"14":{"tf":1.0}}},"9":{"2":{".":{"1":{"6":{"8":{".":{"1":{".":{"1":{"0":{"0":{"df":1,"docs":{"123":{"tf":1.0}}},":":{"4":{"4":{"3":{"3":{",":{"1":{"9":{"2":{".":{"1":{"6":{"8":{".":{"1":{".":{"1":{"1":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"]":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":1.4142135623730951},"122":{"tf":1.0},"19":{"tf":1.4142135623730951},"51":{"tf":1.0},"68":{"tf":1.0},"71":{"tf":1.0},"8":{"tf":1.0},"89":{"tf":1.0}}},"2":{"0":{"0":{"1":{":":{"d":{"b":{"8":{":":{":":{"1":{"]":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"2":{"6":{"df":4,"docs":{"118":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"68":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":4,"docs":{"74":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.0},"92":{"tf":1.0}}},"4":{"df":4,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"105":{"tf":1.0},"108":{"tf":1.0}}},"5":{"6":{"df":9,"docs":{"102":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.0},"3":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":2,"docs":{"23":{"tf":1.0},"68":{"tf":1.0}}},"df":1,"docs":{"68":{"tf":1.0}}},"df":9,"docs":{"108":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"120":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"129":{"tf":1.0},"20":{"tf":1.4142135623730951},"8":{"tf":1.0}},"s":{"df":1,"docs":{"129":{"tf":1.0}}}},"3":{".":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"74":{"tf":1.0}}},"3":{"df":1,"docs":{"101":{"tf":1.0}}},"4":{"df":1,"docs":{"120":{"tf":1.0}}},"6":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"101":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"135":{"tf":1.0},"14":{"tf":1.0},"21":{"tf":1.4142135623730951},"23":{"tf":1.0},"68":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951}}},"4":{"4":{"3":{"3":{"/":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{"df":1,"docs":{"77":{"tf":1.0}}}},"df":0,"docs":{}}},":":{"4":{"4":{"3":{"3":{"/":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{"df":4,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.0},"87":{"tf":1.4142135623730951},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"+":{"2":{"4":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"102":{"tf":1.0}}},"df":5,"docs":{"102":{"tf":1.0},"108":{"tf":1.0},"22":{"tf":1.4142135623730951},"3":{"tf":1.7320508075688772},"68":{"tf":1.0}},"–":{"2":{"5":{"6":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"0":{"0":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"df":1,"docs":{"128":{"tf":1.0}}},"df":5,"docs":{"121":{"tf":1.0},"125":{"tf":1.0},"129":{"tf":1.0},"23":{"tf":1.4142135623730951},"76":{"tf":1.0}},"s":{"df":1,"docs":{"129":{"tf":1.0}}}},"6":{"0":{"df":1,"docs":{"128":{"tf":1.0}}},"4":{"df":5,"docs":{"126":{"tf":1.0},"128":{"tf":1.0},"22":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0}}},"df":1,"docs":{"24":{"tf":1.4142135623730951}}},"7":{"2":{"df":1,"docs":{"102":{"tf":1.0}}},"6":{"8":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"102":{"tf":1.7320508075688772},"25":{"tf":1.4142135623730951}}},"8":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"6":{"4":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"1":{"tf":1.0},"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"26":{"tf":1.4142135623730951},"38":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.0}}},"9":{"df":0,"docs":{},"f":{"2":{"c":{"4":{"a":{"1":{"b":{"3":{"df":0,"docs":{},"e":{"7":{"d":{"8":{"df":0,"docs":{},"f":{"0":{"c":{"a":{"b":{"c":{"1":{"2":{"3":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"5":{"6":{"7":{"8":{"9":{"0":{"1":{"2":{"3":{"4":{"5":{"6":{"7":{"8":{"a":{"b":{"c":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"1":{"2":{"3":{"4":{"5":{"6":{"7":{"8":{"9":{"a":{"b":{"c":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"1":{"df":2,"docs":{"53":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"c":{"5":{"b":{"4":{"a":{"3":{"2":{"1":{"0":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"_":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"a":{"1":{"b":{"2":{"c":{"3":{"d":{"4":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"a":{"7":{"b":{"8":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"b":{"7":{"c":{"2":{"d":{"9":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"0":{"1":{"8":{"2":{"3":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"a":{"a":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"d":{"df":2,"docs":{"112":{"tf":2.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"14":{"tf":1.0},"72":{"tf":1.0}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":5,"docs":{"108":{"tf":1.0},"76":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":8,"docs":{"109":{"tf":1.7320508075688772},"115":{"tf":1.0},"116":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.0},"62":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"105":{"tf":1.0}}}},"v":{"df":3,"docs":{"119":{"tf":1.0},"129":{"tf":1.0},"98":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"d":{"df":2,"docs":{"7":{"tf":1.0},"8":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"122":{"tf":1.0},"13":{"tf":1.0}}}},"r":{"df":1,"docs":{"72":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":20,"docs":{"104":{"tf":1.0},"113":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"125":{"tf":2.23606797749979},"126":{"tf":1.0},"127":{"tf":2.0},"129":{"tf":1.4142135623730951},"3":{"tf":1.0},"72":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951},"83":{"tf":1.0},"85":{"tf":1.4142135623730951},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":1,"docs":{"108":{"tf":1.0}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"124":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":3,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"3":{"tf":1.0}}},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"20":{"tf":1.0}}}}}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"31":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"50":{"tf":1.0}}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":4,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"92":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"97":{"tf":1.0}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"108":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"117":{"tf":1.0}},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"110":{"tf":1.0},"114":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"14":{"tf":1.0},"31":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"112":{"tf":1.0},"89":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"129":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"112":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"109":{"tf":1.0},"134":{"tf":1.0},"44":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"k":{"df":2,"docs":{"15":{"tf":1.4142135623730951},"8":{"tf":1.0}}},"p":{"df":6,"docs":{"129":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"15":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"o":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"df":2,"docs":{"14":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"106":{"tf":1.0},"63":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"36":{"tf":1.7320508075688772},"48":{"tf":1.7320508075688772},"58":{"tf":1.7320508075688772}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"k":{"df":2,"docs":{"95":{"tf":1.0},"97":{"tf":1.0}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":4,"docs":{"123":{"tf":1.0},"124":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"112":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"111":{"tf":1.0},"122":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":4,"docs":{"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"94":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":6,"docs":{"115":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"124":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"105":{"tf":1.4142135623730951}}}}}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"112":{"tf":1.7320508075688772}}}}}},"o":{"df":2,"docs":{"10":{"tf":1.0},"119":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":9,"docs":{"100":{"tf":1.0},"104":{"tf":1.0},"12":{"tf":1.0},"3":{"tf":1.0},"39":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":5,"docs":{"109":{"tf":1.0},"136":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":4,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}}}},"’":{"df":1,"docs":{"125":{"tf":2.0}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"98":{"tf":1.0}}}}},"df":5,"docs":{"105":{"tf":1.0},"119":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"105":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"25":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":3,"docs":{"25":{"tf":1.0},"61":{"tf":1.0},"63":{"tf":1.0}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"106":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"126":{"tf":1.0},"128":{"tf":1.4142135623730951},"130":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"6":{"4":{"df":1,"docs":{"118":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":13,"docs":{"11":{"tf":1.0},"111":{"tf":1.0},"132":{"tf":1.0},"30":{"tf":1.0},"37":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"8":{"tf":1.0},"83":{"tf":1.0},"96":{"tf":1.0}}},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"i":{"c":{"df":1,"docs":{"81":{"tf":1.0}}},"df":0,"docs":{}}}},"df":4,"docs":{"125":{"tf":2.23606797749979},"126":{"tf":1.4142135623730951},"67":{"tf":1.0},"72":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"109":{"tf":1.0},"98":{"tf":1.0}}}}},"df":1,"docs":{"87":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"41":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"108":{"tf":1.0},"89":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"123":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"16":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":1,"docs":{"39":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"119":{"tf":1.0}}}},"w":{"df":1,"docs":{"108":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"t":{"df":1,"docs":{"111":{"tf":1.0}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"105":{"tf":1.0},"123":{"tf":1.0},"63":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"122":{"tf":1.0},"132":{"tf":1.0},"70":{"tf":1.0}}}}},"d":{"df":4,"docs":{"112":{"tf":1.0},"3":{"tf":1.0},"71":{"tf":1.0},"87":{"tf":1.0}}},"df":1,"docs":{"118":{"tf":1.0}}},"t":{"df":5,"docs":{"110":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"92":{"tf":1.0}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"95":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"3":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":10,"docs":{"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"111":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0},"62":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"b":{"df":4,"docs":{"122":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"81":{"tf":1.0}}},"c":{"df":0,"docs":{},"k":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"106":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":1,"docs":{"63":{"tf":1.0}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"1":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{",":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":3,"docs":{"79":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"135":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":15,"docs":{"129":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":2.0},"4":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":2.23606797749979},"78":{"tf":1.0},"79":{"tf":1.0},"83":{"tf":1.7320508075688772},"88":{"tf":2.0},"90":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"df":11,"docs":{"104":{"tf":1.0},"111":{"tf":1.4142135623730951},"115":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"126":{"tf":1.0},"77":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}}},"x":{"df":1,"docs":{"121":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":2,"docs":{"37":{"tf":1.0},"42":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"k":{"df":3,"docs":{"111":{"tf":1.0},"117":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{},"w":{"df":1,"docs":{"8":{"tf":1.0}}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"115":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"s":{"df":1,"docs":{"123":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.4142135623730951}}}}}}}},"s":{"d":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"82":{"tf":1.4142135623730951},"97":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":9,"docs":{"10":{"tf":1.4142135623730951},"13":{"tf":1.0},"132":{"tf":1.7320508075688772},"135":{"tf":2.0},"15":{"tf":2.6457513110645907},"18":{"tf":1.0},"5":{"tf":1.0},"9":{"tf":1.7320508075688772},"92":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"72":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":2.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"120":{"tf":1.0},"74":{"tf":1.7320508075688772}}}}},"’":{"df":1,"docs":{"125":{"tf":1.7320508075688772}}}},"c":{"a":{"df":2,"docs":{"104":{"tf":1.4142135623730951},"132":{"tf":1.0}},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"121":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"125":{"tf":1.0}}}},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"0":{"tf":1.0},"113":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}},"df":4,"docs":{"10":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"104":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"55":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"104":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}},"d":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0}}},"df":1,"docs":{"72":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"4":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"111":{"tf":1.0},"116":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"132":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":6,"docs":{"112":{"tf":1.0},"121":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"96":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"136":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"22":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"k":{"df":5,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"135":{"tf":1.0},"50":{"tf":1.4142135623730951},"55":{"tf":1.0}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":12,"docs":{"103":{"tf":1.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.7320508075688772},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"26":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"44":{"tf":1.0}}}}}}},"i":{"df":1,"docs":{"131":{"tf":1.0}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}}}}}}}},"r":{"c":{"df":0,"docs":{},"l":{"df":4,"docs":{"37":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"126":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"124":{"tf":1.0},"39":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"104":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"76":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"72":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"135":{"tf":1.4142135623730951},"98":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":4,"docs":{"115":{"tf":1.0},"76":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"r":{"df":1,"docs":{"95":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"103":{"tf":1.0},"95":{"tf":1.0}}}}}},"u":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"c":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":5,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.0},"3":{"tf":1.0},"37":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"1":{"tf":1.0},"107":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":1,"docs":{"67":{"tf":1.4142135623730951}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"111":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.0},"103":{"tf":1.0}}},"m":{"a":{"df":2,"docs":{"37":{"tf":1.0},"72":{"tf":1.0}},"n":{"d":{"df":51,"docs":{"11":{"tf":1.4142135623730951},"119":{"tf":1.0},"12":{"tf":1.0},"135":{"tf":1.7320508075688772},"14":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.7320508075688772},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0},"72":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":3,"docs":{"125":{"tf":1.0},"77":{"tf":1.0},"96":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}}},"r":{"df":3,"docs":{"104":{"tf":1.0},"124":{"tf":1.0},"50":{"tf":1.0}}},"t":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"132":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":7,"docs":{"10":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"12":{"tf":2.6457513110645907},"18":{"tf":1.0},"3":{"tf":1.0},"63":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"135":{"tf":2.449489742783178}}}},"u":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":4,"docs":{"116":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"45":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":9,"docs":{"4":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{":":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"136":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"33":{"tf":1.0}}}}}}},"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":7,"docs":{"128":{"tf":1.0},"136":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"19":{"tf":1.0},"72":{"tf":1.7320508075688772},"78":{"tf":2.0},"90":{"tf":2.0}},"u":{"df":0,"docs":{},"r":{"df":21,"docs":{"10":{"tf":1.0},"108":{"tf":1.7320508075688772},"12":{"tf":1.0},"128":{"tf":1.4142135623730951},"136":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"19":{"tf":1.0},"29":{"tf":1.0},"78":{"tf":2.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"103":{"tf":1.0},"55":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"121":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"123":{"tf":2.0},"125":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.4142135623730951},"70":{"tf":1.0},"73":{"tf":1.0},"76":{"tf":1.4142135623730951},"87":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"121":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"4":{"tf":1.0},"71":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":19,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"11":{"tf":1.0},"113":{"tf":1.0},"126":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"17":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"56":{"tf":1.0},"62":{"tf":1.4142135623730951},"74":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":22,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"109":{"tf":1.4142135623730951},"110":{"tf":2.449489742783178},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":2.0},"115":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"22":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":1.4142135623730951},"45":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"67":{"tf":1.0},"93":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":1,"docs":{"60":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"100":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":4,"docs":{"128":{"tf":1.0},"4":{"tf":1.0},"75":{"tf":1.0},"89":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"92":{"tf":1.0}}}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"95":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"df":9,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":1.0},"112":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":1.4142135623730951},"55":{"tf":1.0},"63":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.4142135623730951}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"110":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":6,"docs":{"105":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"51":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"101":{"tf":1.0},"74":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"df":0,"docs":{},"’":{"df":0,"docs":{},"t":{"df":1,"docs":{"129":{"tf":1.0}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"p":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"10":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":44,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"107":{"tf":1.0},"11":{"tf":1.7320508075688772},"110":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":2.0},"121":{"tf":1.4142135623730951},"123":{"tf":1.0},"126":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.7320508075688772},"23":{"tf":1.0},"29":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":2.0},"35":{"tf":1.4142135623730951},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":2.0},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"67":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"60":{"tf":1.0}}},".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"e":{"d":{"2":{"5":{"5":{"1":{"9":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"109":{"tf":1.0}}}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":5,"docs":{"1":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"116":{"tf":1.0},"3":{"tf":1.0}},"i":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"+":{"c":{"df":1,"docs":{"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"5":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"111":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"136":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951},"73":{"tf":1.0}}}}}}}},"d":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":28,"docs":{"10":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"105":{"tf":1.0},"128":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":2.23606797749979},"72":{"tf":1.0},"73":{"tf":2.23606797749979},"75":{"tf":2.23606797749979},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.7320508075688772},"8":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.4142135623730951},"99":{"tf":1.0}},"’":{"df":1,"docs":{"108":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"4":{"tf":1.0},"43":{"tf":1.4142135623730951}}}}},"t":{"a":{":":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"/":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"s":{"df":10,"docs":{"11":{"tf":1.0},"19":{"tf":1.7320508075688772},"27":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"69":{"tf":1.4142135623730951},"81":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"103":{"tf":1.0}}}}}},"df":27,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772},"102":{"tf":1.4142135623730951},"103":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"112":{"tf":1.7320508075688772},"115":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"32":{"tf":1.7320508075688772},"37":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"59":{"tf":1.4142135623730951},"66":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"74":{"tf":1.0},"78":{"tf":1.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":6,"docs":{"109":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0},"67":{"tf":1.0}}}},"y":{"df":1,"docs":{"115":{"tf":1.0}}}},"b":{"df":1,"docs":{"33":{"tf":1.0}}},"d":{"df":1,"docs":{"67":{"tf":1.0}}},"df":5,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"72":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":0,"docs":{}}},":":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"132":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":2,"docs":{"15":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951}}}}},"c":{"a":{"d":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":5,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.7320508075688772},"60":{"tf":2.23606797749979},"62":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"110":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":24,"docs":{"108":{"tf":1.0},"11":{"tf":1.0},"133":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.0},"75":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.4142135623730951},"89":{"tf":2.0},"90":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"106":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"n":{"df":1,"docs":{"95":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"106":{"tf":1.0},"74":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"2":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"82":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"111":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}}},"s":{"c":{"df":1,"docs":{"37":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":20,"docs":{"108":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.4142135623730951},"30":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.4142135623730951},"4":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"72":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"98":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"109":{"tf":1.0},"115":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"44":{"tf":1.0},"62":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"98":{"tf":1.0}}}}}},"t":{"df":2,"docs":{"57":{"tf":1.0},"58":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"124":{"tf":1.4142135623730951},"58":{"tf":1.0},"60":{"tf":1.0}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"121":{"tf":1.0}}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"62":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"119":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":2,"docs":{"14":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"i":{"c":{"df":9,"docs":{"114":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.0},"4":{"tf":1.0},"55":{"tf":1.0},"94":{"tf":1.0},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"t":{"df":12,"docs":{"103":{"tf":1.0},"124":{"tf":1.0},"129":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"75":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":2.23606797749979},"98":{"tf":1.7320508075688772}}}},"i":{"df":1,"docs":{"100":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"102":{"tf":1.0},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"r":{">":{"/":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"11":{"tf":1.0},"119":{"tf":1.4142135623730951},"30":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"123":{"tf":1.0},"16":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"123":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":22,"docs":{"11":{"tf":1.7320508075688772},"114":{"tf":1.0},"20":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"30":{"tf":1.0},"32":{"tf":1.7320508075688772},"33":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"100":{"tf":1.0}}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":5,"docs":{"129":{"tf":1.0},"70":{"tf":1.0},"83":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"124":{"tf":1.4142135623730951},"3":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"97":{"tf":1.0}}}}}}}},"df":0,"docs":{},"k":{"df":1,"docs":{"104":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"67":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"95":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"105":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":10,"docs":{"102":{"tf":1.0},"103":{"tf":2.0},"106":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.0},"92":{"tf":1.0},"95":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"103":{"tf":1.0}}}}}}},"n":{"df":2,"docs":{"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":1,"docs":{"8":{"tf":1.0}}},"s":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"131":{"tf":2.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.7320508075688772},"134":{"tf":1.4142135623730951},"135":{"tf":2.6457513110645907},"136":{"tf":1.7320508075688772},"17":{"tf":1.0},"9":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"132":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":1,"docs":{"91":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"’":{"df":0,"docs":{},"t":{"df":1,"docs":{"134":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"’":{"df":0,"docs":{},"t":{"df":7,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"111":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"n":{"df":5,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"127":{"tf":1.0},"135":{"tf":1.0},"76":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"21":{"tf":1.7320508075688772},"37":{"tf":1.0},"41":{"tf":1.0}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"118":{"tf":1.0},"63":{"tf":1.0}}}}}},"s":{"a":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"111":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":2.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"87":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"112":{"tf":1.0},"8":{"tf":1.0}}}}},"v":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":2,"docs":{"37":{"tf":1.0},"96":{"tf":1.0}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":18,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951},"110":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.4142135623730951},"123":{"tf":1.0},"124":{"tf":1.0},"135":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"20":{"tf":1.0}}}}},"d":{"2":{"5":{"5":{"1":{"9":{"df":13,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"125":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"2":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"62":{"tf":1.0}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}}}}},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"69":{"tf":1.4142135623730951}}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":7,"docs":{"104":{"tf":1.0},"114":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.0},"70":{"tf":1.0},"84":{"tf":1.0},"87":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"n":{"df":2,"docs":{"79":{"tf":1.0},"84":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"103":{"tf":1.0},"118":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":10,"docs":{"109":{"tf":2.23606797749979},"110":{"tf":2.449489742783178},"111":{"tf":1.0},"112":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"114":{"tf":2.23606797749979},"115":{"tf":2.0},"2":{"tf":1.7320508075688772},"3":{"tf":2.0},"96":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"118":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"85":{"tf":1.0}}}}}}}},"df":1,"docs":{"37":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"100":{"tf":1.0},"90":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"103":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.0},"122":{"tf":1.0},"77":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"125":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"82":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"113":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"131":{"tf":1.0},"29":{"tf":1.0},"75":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"104":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"75":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"3":{"2":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"127":{"tf":1.0},"129":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"136":{"tf":1.0},"78":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"95":{"tf":1.0}}}},"t":{"df":1,"docs":{"129":{"tf":1.0}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"2":{"tf":1.0},"26":{"tf":1.0},"75":{"tf":1.0},"99":{"tf":1.0}}}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"104":{"tf":1.0},"122":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":8,"docs":{"117":{"tf":1.0},"40":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"106":{"tf":1.0},"111":{"tf":1.0},"97":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":6,"docs":{"100":{"tf":1.0},"104":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"127":{"tf":1.0},"31":{"tf":1.4142135623730951}}}},"t":{"df":2,"docs":{"51":{"tf":1.4142135623730951},"76":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"74":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"82":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"91":{"tf":1.4142135623730951},"99":{"tf":1.0}}}},"n":{"df":4,"docs":{"1":{"tf":1.0},"26":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"44":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":14,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"18":{"tf":1.0},"25":{"tf":2.23606797749979},"26":{"tf":1.7320508075688772},"3":{"tf":1.0},"56":{"tf":2.0},"57":{"tf":1.4142135623730951},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"61":{"tf":1.7320508075688772},"62":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951}}}},"s":{"df":2,"docs":{"120":{"tf":1.0},"130":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"124":{"tf":1.7320508075688772},"125":{"tf":2.0},"129":{"tf":1.0},"63":{"tf":1.0}}}}},"r":{"a":{"df":2,"docs":{"101":{"tf":1.0},"112":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"8":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"c":{"5":{"b":{"4":{"a":{"3":{"9":{"2":{"0":{"1":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":6,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"126":{"tf":1.0},"51":{"tf":1.0},"54":{"tf":2.0}},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"103":{"tf":1.0},"116":{"tf":1.0},"122":{"tf":1.0},"82":{"tf":1.0},"99":{"tf":1.0}}}}},"r":{"df":1,"docs":{"106":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"74":{"tf":1.0},"94":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"126":{"tf":1.4142135623730951},"83":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"105":{"tf":1.0},"126":{"tf":1.0}}},"s":{"df":1,"docs":{"128":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}},"y":{",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"r":{"df":1,"docs":{"101":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"93":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"62":{"tf":1.4142135623730951},"8":{"tf":1.7320508075688772},"84":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":2,"docs":{"103":{"tf":1.0},"95":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"117":{"tf":1.0}}}}}},"i":{"df":2,"docs":{"127":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"86":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":29,"docs":{"101":{"tf":1.0},"102":{"tf":1.7320508075688772},"11":{"tf":1.0},"110":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"24":{"tf":1.0},"29":{"tf":1.4142135623730951},"3":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.7320508075688772},"39":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":2.23606797749979},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"54":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.7320508075688772},"72":{"tf":1.4142135623730951},"74":{"tf":1.0},"78":{"tf":1.4142135623730951},"90":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"103":{"tf":1.0}}}}}},"n":{"d":{"df":8,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"123":{"tf":1.0}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}}}}}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"76":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":10,"docs":{"123":{"tf":1.0},"129":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"67":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"83":{"tf":1.0},"93":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"76":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"ó":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":2.449489742783178},"3":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":6,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"14":{"tf":1.0},"67":{"tf":1.0},"97":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"109":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"1":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"119":{"tf":1.0},"120":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0},"85":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"111":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"123":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"69":{"tf":1.0},"95":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":13,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.449489742783178},"102":{"tf":2.449489742783178},"103":{"tf":1.7320508075688772},"104":{"tf":2.8284271247461903},"105":{"tf":2.23606797749979},"106":{"tf":2.0},"107":{"tf":1.0},"108":{"tf":1.7320508075688772},"126":{"tf":1.0},"129":{"tf":1.4142135623730951},"3":{"tf":1.0},"98":{"tf":1.0}},"’":{"df":1,"docs":{"103":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"s":{"d":{"df":2,"docs":{"8":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"106":{"tf":1.0},"108":{"tf":1.0},"121":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"121":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"96":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":6,"docs":{"10":{"tf":1.0},"3":{"tf":1.0},"32":{"tf":1.0},"70":{"tf":1.0},"79":{"tf":1.4142135623730951},"98":{"tf":1.7320508075688772}},"i":{"df":3,"docs":{"26":{"tf":1.0},"71":{"tf":1.0},"98":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"_":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.0}}}}}}},"g":{"b":{"df":4,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"67":{"tf":1.0}}},"c":{"df":0,"docs":{},"m":{"df":3,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":13,"docs":{"101":{"tf":1.0},"110":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"12":{"tf":1.0},"121":{"tf":1.0},"19":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"117":{"tf":1.7320508075688772},"63":{"tf":1.0}},"n":{"df":2,"docs":{"11":{"tf":1.0},"78":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":1,"docs":{"99":{"tf":1.0}},"e":{"df":1,"docs":{"103":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"105":{"tf":1.0}}}},"o":{"d":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"76":{"tf":1.0}}}},"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"87":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"103":{"tf":1.0},"110":{"tf":1.0},"116":{"tf":1.0},"33":{"tf":1.4142135623730951},"39":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}}},"r":{"d":{"c":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"79":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"117":{"tf":1.0}},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":23,"docs":{"103":{"tf":1.0},"104":{"tf":1.7320508075688772},"112":{"tf":1.0},"113":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"50":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":1.4142135623730951},"92":{"tf":1.0},"94":{"tf":1.0}}},"n":{"df":0,"docs":{},"’":{"df":0,"docs":{},"t":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"’":{"df":0,"docs":{},"t":{"df":1,"docs":{"55":{"tf":1.0}}}}}}}},"df":1,"docs":{"11":{"tf":1.0}},"e":{"a":{"d":{"df":1,"docs":{"96":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"105":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"1":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0}}}}}},"df":0,"docs":{}},"2":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"118":{"tf":1.0},"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"df":0,"docs":{}},"3":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":9,"docs":{"109":{"tf":1.0},"116":{"tf":2.0},"117":{"tf":1.0},"118":{"tf":2.8284271247461903},"119":{"tf":2.0},"120":{"tf":1.7320508075688772},"121":{"tf":2.0},"122":{"tf":1.0},"44":{"tf":1.0}}}},"l":{"d":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":3,"docs":{"11":{"tf":2.23606797749979},"123":{"tf":1.0},"91":{"tf":1.0}}}},"x":{"df":3,"docs":{"22":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"7":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"111":{"tf":1.0},"129":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"105":{"tf":2.0},"110":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":4,"docs":{"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"126":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"/":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"}":{"/":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"z":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"19":{"tf":1.0},"31":{"tf":1.0}},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"df":2,"docs":{"121":{"tf":1.0},"22":{"tf":1.0}}}},"o":{"d":{"df":2,"docs":{"33":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"p":{"df":1,"docs":{"95":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"~":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"n":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"11":{"tf":1.0},"118":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"111":{"tf":1.7320508075688772},"3":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"d":{"df":5,"docs":{"121":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"e":{"a":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}}}},"n":{"df":0,"docs":{},"t":{"df":23,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"11":{"tf":1.0},"114":{"tf":1.7320508075688772},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.7320508075688772},"121":{"tf":1.0},"125":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":2.0},"26":{"tf":1.0},"27":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.4142135623730951},"33":{"tf":1.0},"60":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":2.449489742783178},"81":{"tf":1.0},"94":{"tf":1.7320508075688772},"97":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":5,"docs":{"104":{"tf":1.0},"22":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0}}}},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"l":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":4,"docs":{"131":{"tf":1.0},"132":{"tf":1.7320508075688772},"20":{"tf":1.0},"38":{"tf":1.4142135623730951}}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"115":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"109":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"16":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":14,"docs":{"114":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"125":{"tf":1.4142135623730951},"135":{"tf":1.0},"2":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"26":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"62":{"tf":1.0},"8":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"0":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"df":5,"docs":{"19":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.0}}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"39":{"tf":1.4142135623730951}}}},"o":{"df":2,"docs":{"120":{"tf":1.0},"75":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"m":{"df":4,"docs":{"112":{"tf":1.0},"117":{"tf":1.0},"120":{"tf":1.0},"122":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"0":{"tf":1.0},"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"t":{"df":9,"docs":{"11":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.7320508075688772},"32":{"tf":1.4142135623730951},"33":{"tf":1.0}},"i":{"df":6,"docs":{"11":{"tf":1.0},"19":{"tf":2.0},"27":{"tf":1.0},"31":{"tf":1.4142135623730951},"76":{"tf":1.0},"92":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"133":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"120":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"l":{"df":15,"docs":{"10":{"tf":2.6457513110645907},"11":{"tf":1.7320508075688772},"119":{"tf":1.4142135623730951},"12":{"tf":1.7320508075688772},"13":{"tf":1.0},"14":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"29":{"tf":1.0},"5":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":2.23606797749979},"8":{"tf":3.0},"9":{"tf":2.0}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"51":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"82":{"tf":2.6457513110645907}},"r":{"df":8,"docs":{"105":{"tf":1.0},"11":{"tf":1.0},"2":{"tf":1.0},"24":{"tf":1.4142135623730951},"3":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0},"55":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"37":{"tf":1.0},"43":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"a":{"c":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":1,"docs":{"124":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}}},"v":{"df":1,"docs":{"108":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"123":{"tf":1.0},"125":{"tf":1.0}},"t":{"df":6,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"125":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"o":{"df":2,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951}},"t":{"df":1,"docs":{"98":{"tf":1.0}}}},"p":{"df":6,"docs":{"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":1.0}},"v":{"4":{"df":3,"docs":{"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}}},"6":{"_":{"df":0,"docs":{},"v":{"6":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}}},"df":4,"docs":{"86":{"tf":2.0},"87":{"tf":2.449489742783178},"88":{"tf":1.7320508075688772},"89":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"121":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"4":{"tf":1.0}}},"r":{"df":3,"docs":{"82":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"100":{"tf":1.0},"26":{"tf":1.0},"93":{"tf":1.0}}}}}},"’":{"df":2,"docs":{"105":{"tf":1.0},"96":{"tf":1.0}}}}},"j":{"a":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"4":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.4142135623730951},"83":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":6,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0}}}},"g":{"df":2,"docs":{"20":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":5,"docs":{"26":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0},"79":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}}},"k":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":4,"docs":{"3":{"tf":1.0},"82":{"tf":1.0},"92":{"tf":1.0},"95":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"b":{"/":{"df":2,"docs":{"126":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951}}},"df":3,"docs":{"23":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.4142135623730951}}},"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":5,"docs":{"103":{"tf":1.0},"107":{"tf":1.0},"121":{"tf":1.0},"82":{"tf":1.0},"99":{"tf":1.0}}}},"m":{"df":3,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.0},"3":{"tf":1.0}}},"y":{"df":28,"docs":{"104":{"tf":1.0},"110":{"tf":2.8284271247461903},"111":{"tf":2.6457513110645907},"113":{"tf":2.449489742783178},"114":{"tf":2.449489742783178},"115":{"tf":1.4142135623730951},"116":{"tf":2.0},"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"119":{"tf":1.7320508075688772},"120":{"tf":1.0},"121":{"tf":1.7320508075688772},"122":{"tf":1.4142135623730951},"26":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"45":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.4142135623730951}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":6,"docs":{"114":{"tf":1.7320508075688772},"119":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0}}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":5,"docs":{"111":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"92":{"tf":1.0},"95":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"62":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":4,"docs":{"105":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.0}}}}}},"y":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"37":{"tf":1.4142135623730951},"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"102":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"107":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":1,"docs":{"72":{"tf":1.0}},"e":{"a":{"d":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"92":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"74":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"74":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"37":{"tf":1.0},"44":{"tf":1.7320508075688772},"67":{"tf":1.0},"75":{"tf":1.4142135623730951},"84":{"tf":1.0}}}}}},"i":{"b":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"8":{"tf":1.0}}},"y":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"71":{"tf":1.0},"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"3":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":2,"docs":{"74":{"tf":1.0},"93":{"tf":1.0}}}}}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"107":{"tf":1.0},"108":{"tf":1.0},"126":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951}}}}},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"72":{"tf":1.4142135623730951},"96":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":2.0},"71":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":13,"docs":{"11":{"tf":1.4142135623730951},"23":{"tf":1.7320508075688772},"37":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"62":{"tf":1.0},"64":{"tf":2.0},"65":{"tf":1.4142135623730951},"66":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"83":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":6,"docs":{"79":{"tf":1.0},"81":{"tf":1.0},"86":{"tf":1.4142135623730951},"87":{"tf":2.0},"89":{"tf":1.0},"90":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.7320508075688772},"96":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"o":{"a":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":3,"docs":{"71":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":16,"docs":{"105":{"tf":2.0},"106":{"tf":1.0},"11":{"tf":1.4142135623730951},"19":{"tf":1.0},"2":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.4142135623730951},"33":{"tf":1.0},"45":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.0},"82":{"tf":1.0},"84":{"tf":1.0},"98":{"tf":1.0}}},"t":{"df":6,"docs":{"121":{"tf":1.0},"22":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.4142135623730951},"42":{"tf":1.0},"91":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":3,"docs":{"109":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":4,"docs":{"135":{"tf":1.4142135623730951},"43":{"tf":1.0},"75":{"tf":2.23606797749979},"85":{"tf":1.4142135623730951}},"i":{"c":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"115":{"tf":1.0},"2":{"tf":1.0},"82":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"k":{"df":3,"docs":{"118":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":4,"docs":{"3":{"tf":1.0},"82":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}}}},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"105":{"tf":2.0},"108":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"101":{"tf":1.0},"106":{"tf":1.0}}},"t":{"df":1,"docs":{"105":{"tf":1.0}}}}}},"m":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"63":{"tf":1.0}}}}},"o":{"df":5,"docs":{"14":{"tf":1.0},"71":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"89":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"92":{"tf":1.0},"97":{"tf":1.0}}}}},"df":0,"docs":{}}}},"k":{"df":0,"docs":{},"e":{"df":4,"docs":{"1":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"107":{"tf":1.0},"3":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"82":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":9,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"50":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":2,"docs":{"104":{"tf":1.0},"124":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"104":{"tf":1.0},"112":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"122":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"2":{"tf":1.0}}}}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":4,"docs":{"107":{"tf":1.7320508075688772},"108":{"tf":1.7320508075688772},"128":{"tf":1.0},"82":{"tf":1.4142135623730951}}}}}}}},"b":{"df":6,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"106":{"tf":2.23606797749979},"108":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"n":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":1,"docs":{"101":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":7,"docs":{"1":{"tf":1.0},"102":{"tf":1.0},"112":{"tf":1.0},"124":{"tf":1.0},"51":{"tf":1.0},"62":{"tf":1.0},"93":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":3,"docs":{"122":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"102":{"tf":1.0},"55":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":24,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.7320508075688772},"107":{"tf":1.0},"109":{"tf":1.0},"11":{"tf":1.0},"110":{"tf":1.0},"115":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":2.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.7320508075688772},"4":{"tf":2.0},"45":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"67":{"tf":1.4142135623730951},"68":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"a":{"1":{"b":{"2":{"c":{"3":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"4":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"9":{"d":{"0":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"2":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"v":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"4":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"a":{"7":{"b":{"8":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"g":{"7":{"df":0,"docs":{},"h":{"8":{"df":0,"docs":{},"i":{"9":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":4,"docs":{"11":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.7320508075688772},"127":{"tf":1.0}},"e":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":6,"docs":{"1":{"tf":1.0},"120":{"tf":1.0},"26":{"tf":1.0},"42":{"tf":1.4142135623730951},"45":{"tf":1.0},"60":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":3,"docs":{"130":{"tf":1.4142135623730951},"85":{"tf":1.0},"95":{"tf":1.0}},"s":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"127":{"tf":1.4142135623730951},"129":{"tf":2.0},"33":{"tf":1.0},"63":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"94":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"2":{"tf":1.0},"90":{"tf":1.7320508075688772}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"105":{"tf":1.0}}}},"x":{"df":1,"docs":{"121":{"tf":1.0}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":4,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.0}}},"m":{"df":1,"docs":{"67":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"b":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":7,"docs":{"127":{"tf":1.0},"129":{"tf":1.7320508075688772},"13":{"tf":1.0},"130":{"tf":1.0},"3":{"tf":1.4142135623730951},"96":{"tf":1.0},"98":{"tf":1.0}},"e":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"9":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":3,"docs":{"109":{"tf":1.0},"122":{"tf":1.0},"43":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"96":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"38":{"tf":2.0},"39":{"tf":1.0},"4":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"130":{"tf":1.4142135623730951},"85":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":9,"docs":{"101":{"tf":1.0},"103":{"tf":1.0},"106":{"tf":1.4142135623730951},"109":{"tf":1.0},"121":{"tf":1.4142135623730951},"2":{"tf":1.0},"92":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}}},"s":{"a":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"63":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"131":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"l":{"df":5,"docs":{"100":{"tf":1.0},"107":{"tf":1.0},"124":{"tf":1.0},"73":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"96":{"tf":1.0}}}}}}}}}}},"n":{"+":{"df":0,"docs":{},"m":{"df":1,"docs":{"101":{"tf":1.0}}}},"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0},"60":{"tf":1.0}}}},"t":{"df":9,"docs":{"123":{"tf":2.449489742783178},"124":{"tf":3.1622776601683795},"125":{"tf":2.23606797749979},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":2.23606797749979},"129":{"tf":1.0},"130":{"tf":2.0},"96":{"tf":1.0}},"e":{"df":1,"docs":{"128":{"tf":1.0}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"129":{"tf":1.0},"86":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"113":{"tf":1.0},"92":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":3,"docs":{"101":{"tf":1.4142135623730951},"117":{"tf":1.0},"37":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"d":{"df":13,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"109":{"tf":1.0},"119":{"tf":1.0},"124":{"tf":1.4142135623730951},"13":{"tf":1.0},"26":{"tf":1.0},"63":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"129":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":32,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"100":{"tf":1.0},"103":{"tf":1.0},"105":{"tf":1.4142135623730951},"106":{"tf":1.0},"108":{"tf":1.0},"123":{"tf":1.4142135623730951},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"70":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.4142135623730951},"79":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":2.0},"91":{"tf":2.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.7320508075688772},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":2.23606797749979}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"121":{"tf":1.0}}}}},"w":{"df":8,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"121":{"tf":1.0},"129":{"tf":1.4142135623730951},"55":{"tf":1.0},"74":{"tf":1.0},"76":{"tf":1.0},"97":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"97":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"22":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":43,"docs":{"10":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.4142135623730951},"106":{"tf":2.0},"113":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":2.0},"125":{"tf":2.23606797749979},"126":{"tf":2.23606797749979},"127":{"tf":1.0},"128":{"tf":1.4142135623730951},"129":{"tf":1.7320508075688772},"131":{"tf":1.0},"133":{"tf":2.0},"134":{"tf":1.7320508075688772},"135":{"tf":2.23606797749979},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"70":{"tf":2.23606797749979},"71":{"tf":1.7320508075688772},"72":{"tf":1.0},"73":{"tf":2.23606797749979},"74":{"tf":2.23606797749979},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.7320508075688772},"83":{"tf":1.0},"87":{"tf":1.7320508075688772},"9":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":3.0},"93":{"tf":1.7320508075688772},"94":{"tf":2.6457513110645907},"95":{"tf":2.23606797749979},"96":{"tf":1.0},"97":{"tf":2.449489742783178},"98":{"tf":3.1622776601683795},"99":{"tf":1.0}}}},"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"74":{"tf":1.7320508075688772},"94":{"tf":1.4142135623730951}}},"df":4,"docs":{"126":{"tf":1.0},"128":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.7320508075688772}},"e":{"df":2,"docs":{"37":{"tf":1.4142135623730951},"72":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"89":{"tf":1.0}}},"h":{"df":2,"docs":{"105":{"tf":1.0},"117":{"tf":1.0}}}},"w":{"df":5,"docs":{"1":{"tf":1.0},"114":{"tf":1.0},"125":{"tf":1.0},"3":{"tf":1.0},"62":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"67":{"tf":1.0},"82":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}}}},"c":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"99":{"tf":1.0}}}}}}},"k":{"df":3,"docs":{"24":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}},"l":{"d":{"df":2,"docs":{"121":{"tf":1.0},"125":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":2,"docs":{"104":{"tf":1.0},"63":{"tf":1.0}}},"df":9,"docs":{"104":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"92":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.4142135623730951}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"112":{"tf":1.0},"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"s":{"d":{"df":3,"docs":{"8":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}},"df":7,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"125":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"77":{"tf":1.0}}},"r":{"df":4,"docs":{"106":{"tf":1.0},"71":{"tf":1.0},"76":{"tf":1.0},"96":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":14,"docs":{"11":{"tf":1.4142135623730951},"123":{"tf":1.0},"136":{"tf":1.0},"17":{"tf":1.0},"30":{"tf":1.7320508075688772},"35":{"tf":1.0},"37":{"tf":1.7320508075688772},"49":{"tf":1.7320508075688772},"59":{"tf":1.7320508075688772},"66":{"tf":1.7320508075688772},"72":{"tf":2.23606797749979},"78":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"103":{"tf":1.0},"129":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"101":{"tf":1.0},"117":{"tf":1.0},"125":{"tf":1.0}}}}}}},"s":{"df":1,"docs":{"89":{"tf":1.7320508075688772}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"106":{"tf":1.0},"126":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"16":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":1,"docs":{"93":{"tf":1.0}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"119":{"tf":1.4142135623730951},"120":{"tf":1.0},"122":{"tf":1.0},"22":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"85":{"tf":1.0}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"123":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":9,"docs":{"111":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"50":{"tf":1.0},"70":{"tf":1.0},"77":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.4142135623730951},"96":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"d":{"df":3,"docs":{"72":{"tf":1.0},"78":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}}}}},"w":{"df":1,"docs":{"106":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"103":{"tf":1.0},"113":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"3":{"tf":1.0}},"’":{"df":2,"docs":{"113":{"tf":1.0},"114":{"tf":1.0}}}}}}}},"p":{"2":{"df":0,"docs":{},"p":{"df":5,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0}}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"1":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":3,"docs":{"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"126":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"130":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"118":{"tf":1.0},"121":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"108":{"tf":1.0},"82":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"108":{"tf":1.0},"82":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":5,"docs":{"10":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"92":{"tf":1.0},"98":{"tf":2.0}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":5,"docs":{"113":{"tf":1.0},"24":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":14,"docs":{"10":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"7":{"tf":1.0},"72":{"tf":1.7320508075688772},"78":{"tf":1.0},"8":{"tf":1.4142135623730951},"81":{"tf":1.0}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"m":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":3,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"b":{"df":1,"docs":{"106":{"tf":1.0}}},"c":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":19,"docs":{"0":{"tf":1.4142135623730951},"100":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":2.449489742783178},"105":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"126":{"tf":1.7320508075688772},"128":{"tf":1.7320508075688772},"129":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":1.0},"70":{"tf":1.4142135623730951},"82":{"tf":1.0},"83":{"tf":1.4142135623730951},"92":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"’":{"df":1,"docs":{"108":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"121":{"tf":1.0},"44":{"tf":1.0}}}}},"r":{"df":2,"docs":{"108":{"tf":1.0},"82":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"55":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"129":{"tf":1.0},"3":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"2":{"tf":1.4142135623730951}}}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"98":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"26":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}}}},"df":0,"docs":{}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"121":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"i":{"df":2,"docs":{"94":{"tf":1.0},"98":{"tf":1.0}},"e":{"c":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"105":{"tf":1.0},"82":{"tf":1.0},"97":{"tf":1.0}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"125":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"g":{"df":2,"docs":{"14":{"tf":1.4142135623730951},"8":{"tf":1.0}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"121":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"38":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":4,"docs":{"14":{"tf":1.4142135623730951},"72":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"20":{"tf":1.0},"38":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"121":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":7,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"82":{"tf":1.7320508075688772},"91":{"tf":1.0},"93":{"tf":1.7320508075688772},"95":{"tf":1.7320508075688772}}}}}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"124":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"97":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"124":{"tf":1.7320508075688772},"128":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":2.0},"72":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.4142135623730951},"96":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":4,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.4142135623730951},"115":{"tf":1.0},"3":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"126":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"14":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":6,"docs":{"0":{"tf":1.0},"109":{"tf":1.0},"11":{"tf":1.0},"113":{"tf":1.0},"20":{"tf":1.0},"31":{"tf":1.0}}}}},"s":{"df":1,"docs":{"76":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"112":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"94":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":3,"docs":{"21":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"60":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"111":{"tf":1.0},"115":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"t":{"df":4,"docs":{"11":{"tf":1.4142135623730951},"118":{"tf":1.0},"121":{"tf":1.0},"71":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.0},"129":{"tf":1.0}}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"109":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":14,"docs":{"109":{"tf":1.0},"110":{"tf":1.4142135623730951},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"123":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"123":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"125":{"tf":1.0},"4":{"tf":1.0},"97":{"tf":1.4142135623730951}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"111":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"129":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":2,"docs":{"130":{"tf":1.0},"85":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"37":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"f":{"df":4,"docs":{"3":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"101":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":4,"docs":{"103":{"tf":1.0},"16":{"tf":1.4142135623730951},"88":{"tf":1.0},"96":{"tf":1.0}}}}},"df":1,"docs":{"7":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"105":{"tf":1.0},"125":{"tf":1.4142135623730951}},"n":{"df":2,"docs":{"122":{"tf":1.0},"92":{"tf":1.0}}}},"i":{"d":{"df":2,"docs":{"131":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"df":2,"docs":{"37":{"tf":1.0},"42":{"tf":1.0}}},"u":{"b":{"df":1,"docs":{"15":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":24,"docs":{"109":{"tf":1.4142135623730951},"110":{"tf":1.0},"113":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"115":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.7320508075688772},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"128":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.4142135623730951},"4":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":3,"docs":{"113":{"tf":1.4142135623730951},"115":{"tf":1.0},"3":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}}},"n":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"123":{"tf":1.4142135623730951},"124":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"126":{"tf":1.0},"130":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":3,"docs":{"114":{"tf":1.0},"121":{"tf":1.0},"9":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"103":{"tf":1.4142135623730951}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.4142135623730951},"115":{"tf":1.0},"116":{"tf":1.0},"2":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"103":{"tf":1.0},"92":{"tf":1.0}}}}},"i":{"c":{"df":9,"docs":{"129":{"tf":1.4142135623730951},"16":{"tf":1.0},"3":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.0},"96":{"tf":2.0}},"k":{"df":10,"docs":{"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"105":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"94":{"tf":1.0},"98":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"130":{"tf":1.0}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}},"y":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":1,"docs":{"126":{"tf":2.0}},"e":{"a":{"c":{"df":0,"docs":{},"h":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"124":{"tf":1.0},"125":{"tf":1.0},"95":{"tf":1.0}}}},"d":{"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"118":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":4,"docs":{"1":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.0}}}},"i":{"df":2,"docs":{"135":{"tf":1.0},"71":{"tf":1.0}}},"m":{"df":0,"docs":{},"e":{".":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"26":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"125":{"tf":1.0}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"103":{"tf":1.0}}}},"v":{"df":3,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"55":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"106":{"tf":1.7320508075688772},"126":{"tf":1.7320508075688772},"128":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"121":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"50":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"129":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"101":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":2.23606797749979},"121":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"r":{"d":{"df":6,"docs":{"1":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":3,"docs":{"111":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":7,"docs":{"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"105":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"101":{"tf":1.0},"106":{"tf":1.0}}},"df":0,"docs":{}}}},"df":3,"docs":{"121":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.7320508075688772}},"e":{"d":{"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"df":0,"docs":{}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.7320508075688772}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"125":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"82":{"tf":1.0},"97":{"tf":1.0}}}}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"124":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"121":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.0},"115":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}},"y":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"p":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"128":{"tf":1.4142135623730951}}}},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"128":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"p":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"123":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":2.6457513110645907},"127":{"tf":1.0},"128":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"98":{"tf":1.0}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"126":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"82":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":11,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":2.23606797749979},"106":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":2.0},"3":{"tf":1.0},"99":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"l":{"a":{"c":{"df":3,"docs":{"105":{"tf":1.0},"119":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{},"y":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":12,"docs":{"100":{"tf":1.7320508075688772},"101":{"tf":1.4142135623730951},"102":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"105":{"tf":1.4142135623730951},"106":{"tf":1.0},"107":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.0},"99":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"105":{"tf":1.0},"124":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"10":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0}}}}}}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":1,"docs":{"82":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"105":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":5,"docs":{"118":{"tf":1.0},"121":{"tf":1.0},"26":{"tf":1.0},"7":{"tf":1.0},"94":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"122":{"tf":1.0},"98":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"88":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"105":{"tf":1.0},"95":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"93":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"74":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"117":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"92":{"tf":1.0}}}}}},"o":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"103":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"132":{"tf":1.0},"15":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"n":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":3,"docs":{"82":{"tf":1.4142135623730951},"92":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"123":{"tf":1.0},"128":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"55":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"106":{"tf":1.0}}}},"n":{"df":27,"docs":{"105":{"tf":1.0},"108":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":2.0},"134":{"tf":2.0},"135":{"tf":1.0},"136":{"tf":1.0},"17":{"tf":1.7320508075688772},"21":{"tf":1.7320508075688772},"29":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"70":{"tf":2.0},"71":{"tf":1.4142135623730951},"72":{"tf":1.0},"73":{"tf":2.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"9":{"tf":1.4142135623730951},"98":{"tf":2.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"132":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{":":{"1":{".":{"8":{"5":{"df":1,"docs":{"132":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"=":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{",":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"=":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"75":{"tf":1.0}}}}}},"c":{"df":1,"docs":{"7":{"tf":1.0}}},"df":3,"docs":{"14":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":2.23606797749979}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}},"s":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":3,"docs":{"121":{"tf":1.0},"31":{"tf":1.0},"99":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"df":6,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"111":{"tf":1.0},"119":{"tf":1.0},"124":{"tf":1.4142135623730951},"98":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"118":{"tf":1.0},"129":{"tf":1.0}}}}},"c":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"33":{"tf":1.0},"60":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":1,"docs":{"8":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"l":{"df":10,"docs":{"109":{"tf":2.0},"110":{"tf":1.7320508075688772},"111":{"tf":1.4142135623730951},"112":{"tf":2.0},"113":{"tf":2.23606797749979},"114":{"tf":1.0},"115":{"tf":1.7320508075688772},"2":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":7,"docs":{"125":{"tf":1.0},"128":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"76":{"tf":1.0},"82":{"tf":1.7320508075688772},"94":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"109":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":5,"docs":{"111":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.7320508075688772},"120":{"tf":1.0},"122":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"128":{"tf":1.0},"80":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"117":{"tf":1.0},"121":{"tf":2.0},"122":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"d":{"df":7,"docs":{"133":{"tf":1.0},"134":{"tf":2.0},"4":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.7320508075688772}}},"df":6,"docs":{"11":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"21":{"tf":1.0},"72":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}},"f":{"df":9,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"56":{"tf":1.0},"62":{"tf":1.4142135623730951},"97":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"124":{"tf":1.0},"125":{"tf":2.0},"126":{"tf":1.7320508075688772},"127":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}},"’":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"78":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"121":{"tf":1.0},"37":{"tf":1.0},"72":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"129":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"128":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"124":{"tf":1.7320508075688772},"128":{"tf":1.0},"131":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0},"98":{"tf":1.0}}}},"i":{"c":{"df":2,"docs":{"126":{"tf":1.0},"135":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.7320508075688772},"124":{"tf":1.0},"126":{"tf":2.23606797749979},"127":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951}}}}}}},"t":{"df":5,"docs":{"128":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"81":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"’":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"1":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"df":0,"docs":{}},"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":10,"docs":{"104":{"tf":1.0},"111":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":3.0},"118":{"tf":3.1622776601683795},"119":{"tf":1.7320508075688772},"120":{"tf":2.449489742783178},"121":{"tf":2.449489742783178},"122":{"tf":1.7320508075688772},"63":{"tf":1.0}}}}},"df":1,"docs":{"7":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"12":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"129":{"tf":1.0},"75":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"76":{"tf":1.0}}}}}},"df":1,"docs":{"76":{"tf":1.4142135623730951}}}}},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"117":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":12,"docs":{"1":{"tf":1.0},"111":{"tf":1.0},"113":{"tf":1.4142135623730951},"125":{"tf":2.23606797749979},"2":{"tf":1.0},"24":{"tf":1.4142135623730951},"26":{"tf":1.0},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"53":{"tf":1.0},"54":{"tf":1.0},"60":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"e":{"d":{"2":{"5":{"5":{"1":{"9":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"113":{"tf":1.0},"114":{"tf":1.7320508075688772},"127":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"103":{"tf":1.0},"106":{"tf":1.0}},"i":{"df":1,"docs":{"106":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":5,"docs":{"100":{"tf":1.0},"108":{"tf":1.0},"117":{"tf":1.0},"133":{"tf":1.4142135623730951},"4":{"tf":1.0}}}}},"t":{"df":1,"docs":{"123":{"tf":1.0}}},"z":{"df":0,"docs":{},"e":{"df":7,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"107":{"tf":2.0},"120":{"tf":1.0},"23":{"tf":1.0},"67":{"tf":1.4142135623730951},"68":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"37":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"132":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":5,"docs":{"1":{"tf":1.0},"102":{"tf":1.4142135623730951},"132":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}},"v":{"df":2,"docs":{"100":{"tf":1.0},"123":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"55":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"93":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"39":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"125":{"tf":1.0},"5":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":6,"docs":{"109":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.4142135623730951},"81":{"tf":1.0}},"i":{"df":1,"docs":{"113":{"tf":1.0}}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":5,"docs":{"100":{"tf":1.0},"103":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"121":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"125":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"117":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"100":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"3":{"df":1,"docs":{"8":{"tf":1.0}}},"df":5,"docs":{"104":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"8":{"tf":3.872983346207417}}}}}}},"s":{"df":0,"docs":{},"f":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":2.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"132":{"tf":1.0}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"113":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":17,"docs":{"124":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"71":{"tf":1.4142135623730951},"92":{"tf":1.0},"94":{"tf":1.0},"97":{"tf":1.0}}}},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}}},"y":{"df":4,"docs":{"114":{"tf":1.0},"115":{"tf":1.0},"33":{"tf":1.0},"93":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"22":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"105":{"tf":1.0},"62":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"108":{"tf":1.0},"135":{"tf":1.0},"76":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":19,"docs":{"101":{"tf":1.0},"106":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"11":{"tf":1.0},"118":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"126":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"63":{"tf":1.0},"66":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":22,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.0},"106":{"tf":2.449489742783178},"11":{"tf":1.0},"110":{"tf":1.0},"114":{"tf":1.0},"121":{"tf":1.4142135623730951},"126":{"tf":1.0},"133":{"tf":1.0},"2":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"55":{"tf":1.0},"63":{"tf":1.0},"74":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.4142135623730951},"93":{"tf":1.7320508075688772},"95":{"tf":1.0},"98":{"tf":1.4142135623730951}}},"m":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"22":{"tf":1.0},"83":{"tf":1.4142135623730951},"85":{"tf":1.0}}}},"p":{"df":1,"docs":{"126":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":5,"docs":{"26":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"60":{"tf":1.7320508075688772},"75":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"3":{"4":{"7":{"8":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"1":{"9":{"3":{"0":{"2":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"128":{"tf":1.0}}}}}}},"df":5,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0}}}}},"u":{"b":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"103":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"74":{"tf":1.0}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"130":{"tf":1.0},"135":{"tf":1.0},"53":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"h":{"df":1,"docs":{"94":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"14":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"99":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"71":{"tf":1.0},"81":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":7,"docs":{"109":{"tf":1.0},"112":{"tf":1.0},"129":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.4142135623730951},"45":{"tf":1.0},"86":{"tf":1.7320508075688772}}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"7":{"tf":1.0}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":5,"docs":{"0":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"96":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"127":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"94":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"124":{"tf":1.0},"126":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":4,"docs":{"115":{"tf":1.0},"8":{"tf":2.0},"87":{"tf":1.0},"92":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":7,"docs":{"104":{"tf":1.0},"4":{"tf":1.0},"67":{"tf":1.0},"70":{"tf":1.0},"82":{"tf":1.4142135623730951},"92":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"22":{"tf":1.0},"37":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"=":{"5":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"k":{"df":0,"docs":{},"e":{"df":4,"docs":{"125":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"104":{"tf":1.0},"55":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"63":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"102":{"tf":1.0},"95":{"tf":1.0}}}}}}},"df":3,"docs":{"117":{"tf":1.7320508075688772},"122":{"tf":1.0},"132":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":31,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"12":{"tf":1.7320508075688772},"120":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"34":{"tf":1.4142135623730951},"35":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.4142135623730951},"47":{"tf":1.0},"53":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"115":{"tf":1.0},"2":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":78,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.449489742783178},"10":{"tf":1.7320508075688772},"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"103":{"tf":1.7320508075688772},"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":2.0},"109":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"110":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"112":{"tf":2.449489742783178},"113":{"tf":2.449489742783178},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"118":{"tf":1.0},"123":{"tf":1.0},"129":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":2.23606797749979},"134":{"tf":1.4142135623730951},"136":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.0},"22":{"tf":1.7320508075688772},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.7320508075688772},"29":{"tf":1.7320508075688772},"3":{"tf":2.6457513110645907},"30":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":2.8284271247461903},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.7320508075688772},"56":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.0},"70":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":2.23606797749979},"75":{"tf":2.0},"78":{"tf":1.0},"8":{"tf":1.4142135623730951},"86":{"tf":1.0},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"98":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}},"s":{"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"d":{"b":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"’":{"df":3,"docs":{"103":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":5,"docs":{"111":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":2.0},"87":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"135":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"t":{"df":13,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"119":{"tf":1.0},"122":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.4142135623730951},"85":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"117":{"tf":1.0},"122":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"2":{"tf":1.0}}}},"r":{"d":{"df":1,"docs":{"123":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"93":{"tf":1.0},"95":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"39":{"tf":1.0}}}}},"s":{"a":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"1":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"102":{"tf":1.0},"123":{"tf":1.0},"129":{"tf":1.0}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":5,"docs":{"108":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"120":{"tf":1.0},"121":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":8,"docs":{"108":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.0},"129":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"102":{"tf":2.23606797749979},"103":{"tf":1.0},"123":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.7320508075688772},"116":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"92":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"128":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"l":{"df":1,"docs":{"96":{"tf":1.0}},"s":{"df":0,"docs":{},"v":{"1":{".":{"2":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"121":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"126":{"tf":1.7320508075688772}}}}},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"72":{"tf":1.0},"78":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"9":{"tf":1.7320508075688772}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"101":{"tf":1.4142135623730951},"108":{"tf":1.0},"117":{"tf":1.0},"130":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"75":{"tf":1.0}}},"k":{"df":2,"docs":{"106":{"tf":1.0},"93":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":4,"docs":{"125":{"tf":1.0},"128":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"108":{"tf":1.4142135623730951},"55":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"123":{"tf":1.4142135623730951},"96":{"tf":1.0}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"96":{"tf":1.7320508075688772}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":8,"docs":{"123":{"tf":1.7320508075688772},"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"130":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":3,"docs":{"123":{"tf":1.0},"129":{"tf":1.0},"94":{"tf":1.0}}},"u":{"df":0,"docs":{},"e":{"df":4,"docs":{"113":{"tf":1.0},"128":{"tf":1.0},"79":{"tf":1.0},"84":{"tf":1.0}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"122":{"tf":1.0},"74":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"116":{"tf":1.0},"55":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"108":{"tf":1.0},"82":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"o":{"df":10,"docs":{"10":{"tf":1.0},"104":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"123":{"tf":1.7320508075688772},"125":{"tf":1.0},"8":{"tf":1.0},"95":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":6,"docs":{"118":{"tf":1.0},"121":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"83":{"tf":1.0}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":14,"docs":{"114":{"tf":1.0},"124":{"tf":2.0},"128":{"tf":1.0},"130":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.7320508075688772},"4":{"tf":1.0},"45":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"98":{"tf":1.7320508075688772}}},"i":{"c":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"p":{"df":6,"docs":{"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"133":{"tf":1.0},"16":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"96":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"w":{"df":1,"docs":{"77":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"94":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"26":{"tf":1.0},"62":{"tf":1.4142135623730951},"91":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":5,"docs":{"104":{"tf":1.0},"22":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"106":{"tf":1.0}}}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"124":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"124":{"tf":1.0}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"97":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"95":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"127":{"tf":1.0},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":11,"docs":{"101":{"tf":1.0},"104":{"tf":1.0},"119":{"tf":1.0},"135":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"76":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"g":{"df":6,"docs":{"11":{"tf":1.0},"28":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"47":{"tf":1.4142135623730951},"57":{"tf":1.4142135623730951},"65":{"tf":1.4142135623730951}}}},"b":{"df":2,"docs":{"118":{"tf":1.0},"63":{"tf":1.0}}},"df":31,"docs":{"1":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"113":{"tf":1.0},"116":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"136":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"55":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.4142135623730951},"72":{"tf":1.0},"75":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.4142135623730951},"87":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.4142135623730951},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"117":{"tf":1.0}}}}}},"r":{"df":2,"docs":{"74":{"tf":1.0},"90":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":4,"docs":{"1":{"tf":1.0},"38":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"124":{"tf":1.0}}}}}},"v":{"1":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":1,"docs":{"118":{"tf":1.0}}},"a":{"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{",":{"b":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":10,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"24":{"tf":1.4142135623730951},"50":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":4,"docs":{"37":{"tf":1.0},"72":{"tf":1.0},"78":{"tf":1.0},"90":{"tf":1.0}}}},"r":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"75":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":8,"docs":{"104":{"tf":1.4142135623730951},"121":{"tf":1.0},"24":{"tf":1.0},"3":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.7320508075688772},"54":{"tf":1.7320508075688772},"55":{"tf":1.0}},"i":{"df":22,"docs":{"10":{"tf":1.0},"100":{"tf":1.0},"105":{"tf":1.0},"11":{"tf":2.0},"112":{"tf":1.0},"113":{"tf":1.0},"119":{"tf":1.0},"125":{"tf":1.4142135623730951},"18":{"tf":1.0},"24":{"tf":2.0},"46":{"tf":2.0},"47":{"tf":1.4142135623730951},"48":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.4142135623730951},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"55":{"tf":1.7320508075688772},"7":{"tf":1.0},"97":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"120":{"tf":1.0},"122":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772}}}}}}}},"i":{"a":{"df":7,"docs":{"3":{"tf":1.0},"7":{"tf":1.0},"75":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0},"98":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"120":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":8,"docs":{"109":{"tf":1.0},"23":{"tf":1.0},"37":{"tf":1.4142135623730951},"4":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"w":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"18":{"tf":1.0}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"20":{"tf":1.0}}},"n":{"df":1,"docs":{"75":{"tf":1.0}}}},"s":{"df":0,"docs":{},"m":{"df":1,"docs":{"98":{"tf":1.0}}}},"v":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}}},"df":5,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0}}},"y":{"df":3,"docs":{"102":{"tf":1.0},"7":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"df":2,"docs":{"123":{"tf":1.0},"98":{"tf":1.0}},"m":{"df":3,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"111":{"tf":1.0},"124":{"tf":1.0},"82":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"’":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"119":{"tf":1.0},"124":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"88":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"102":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"129":{"tf":1.0},"95":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}}},"df":2,"docs":{"127":{"tf":1.0},"96":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"89":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"4":{"tf":1.0},"95":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":15,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.0},"21":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"4":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":11,"docs":{"103":{"tf":1.4142135623730951},"110":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"123":{"tf":1.0},"124":{"tf":1.0},"3":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.4142135623730951},"82":{"tf":1.0},"94":{"tf":1.7320508075688772},"96":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"l":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"124":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"110":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"33":{"tf":1.0},"63":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"x":{"2":{"5":{"5":{"1":{"9":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"g":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"93":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"95":{"tf":2.23606797749979}}}}},"y":{"df":1,"docs":{"93":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"62":{"tf":1.0},"92":{"tf":1.0}}}},"df":2,"docs":{"89":{"tf":2.0},"98":{"tf":1.4142135623730951}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}},"’":{"df":0,"docs":{},"r":{"df":1,"docs":{"77":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"y":{"df":0,"docs":{},"i":{"df":1,"docs":{"67":{"tf":1.0}}}}}},"z":{"df":1,"docs":{"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"122":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}}}},"title":{"root":{"1":{"df":1,"docs":{"19":{"tf":1.0}}},"2":{"df":1,"docs":{"20":{"tf":1.0}}},"3":{"df":1,"docs":{"21":{"tf":1.0}}},"4":{"df":2,"docs":{"22":{"tf":1.0},"3":{"tf":1.0}}},"5":{"df":1,"docs":{"23":{"tf":1.0}}},"6":{"df":1,"docs":{"24":{"tf":1.0}}},"7":{"df":1,"docs":{"25":{"tf":1.0}}},"8":{"df":1,"docs":{"26":{"tf":1.0}}},"a":{"a":{"d":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"127":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":2,"docs":{"13":{"tf":1.0},"15":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"36":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"112":{"tf":1.0}}}}}}}}},"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"89":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"83":{"tf":1.0},"88":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":3,"docs":{"10":{"tf":1.0},"132":{"tf":1.0},"15":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"113":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"55":{"tf":1.0},"63":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"50":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"101":{"tf":1.0},"51":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"135":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"4":{"tf":1.0},"91":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"90":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"108":{"tf":1.0},"128":{"tf":1.0},"136":{"tf":1.0},"78":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"25":{"tf":1.0},"62":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"118":{"tf":1.0},"22":{"tf":1.0},"34":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"136":{"tf":1.0},"32":{"tf":1.0}}}}}}}},"d":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"71":{"tf":1.0}}}}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"69":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"112":{"tf":1.0},"32":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"115":{"tf":1.0},"122":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"t":{"df":2,"docs":{"82":{"tf":1.0},"93":{"tf":1.0}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"32":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"124":{"tf":1.0}}}}}}}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"103":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"131":{"tf":1.0},"135":{"tf":1.0}}}}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"76":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"69":{"tf":1.0}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"111":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"109":{"tf":1.0},"110":{"tf":1.0}}}}}}},"df":0,"docs":{}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"df":0,"docs":{}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"68":{"tf":1.0},"73":{"tf":1.0},"79":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"25":{"tf":1.0},"26":{"tf":1.0},"56":{"tf":1.0}}}}}}}},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"54":{"tf":1.0}}}},"l":{"df":0,"docs":{},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"62":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"20":{"tf":1.0},"38":{"tf":1.0}}}},"n":{"d":{"df":1,"docs":{"92":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"77":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"102":{"tf":1.0},"104":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"79":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"118":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"125":{"tf":1.0}}}},"o":{"d":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"y":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"39":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"120":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"11":{"tf":1.0},"5":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"v":{"6":{"_":{"df":0,"docs":{},"v":{"6":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"89":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":5,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"116":{"tf":1.0},"4":{"tf":1.0},"62":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"44":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"72":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"23":{"tf":1.0},"64":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"87":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"75":{"tf":1.0}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"105":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"100":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"107":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"39":{"tf":1.0}}}}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"o":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"129":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"43":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"135":{"tf":1.0}}}}}}},"n":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"123":{"tf":1.0},"124":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":4,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"84":{"tf":1.0},"91":{"tf":1.0}}}}}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"17":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":9,"docs":{"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":1.0},"81":{"tf":1.0},"92":{"tf":1.0},"94":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":1,"docs":{"43":{"tf":1.0}}}}},"o":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"85":{"tf":1.0}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":7,"docs":{"30":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.0},"9":{"tf":1.0}}}}}}},"s":{"df":1,"docs":{"89":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"60":{"tf":1.0},"67":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"14":{"tf":1.0},"6":{"tf":1.0}}}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"21":{"tf":1.0},"41":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"115":{"tf":1.0},"122":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"97":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"111":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"96":{"tf":1.0}},"k":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"116":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"105":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"100":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"df":4,"docs":{"133":{"tf":1.0},"134":{"tf":1.0},"21":{"tf":1.0},"70":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"109":{"tf":1.0},"113":{"tf":1.0}}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"80":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"25":{"tf":1.0},"62":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":3,"docs":{"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"76":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}}}},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"107":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.0},"71":{"tf":1.0}}}},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"17":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"93":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"60":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"u":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"53":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"86":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":5,"docs":{"27":{"tf":1.0},"34":{"tf":1.0},"46":{"tf":1.0},"56":{"tf":1.0},"64":{"tf":1.0}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":6,"docs":{"1":{"tf":1.0},"107":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"113":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"9":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":0,"docs":{}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":3,"docs":{"124":{"tf":1.0},"39":{"tf":1.0},"98":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"28":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.0},"57":{"tf":1.0},"65":{"tf":1.0}}}},"df":2,"docs":{"55":{"tf":1.0},"63":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"104":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0}},"i":{"df":3,"docs":{"11":{"tf":1.0},"24":{"tf":1.0},"46":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"44":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":4,"docs":{"103":{"tf":1.0},"110":{"tf":1.0},"117":{"tf":1.0},"94":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"95":{"tf":1.0}}}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}')); \ No newline at end of file
diff --git a/book/en/searchindex-ee09cfdc.js.gz b/book/en/searchindex-ee09cfdc.js.gz
deleted file mode 100644
index 2fbce46..0000000
--- a/book/en/searchindex-ee09cfdc.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/theme/custom-eff59930.css b/book/en/theme/custom-eff59930.css
deleted file mode 100644
index 447e899..0000000
--- a/book/en/theme/custom-eff59930.css
+++ /dev/null
@@ -1,44 +0,0 @@
-/* === Tesseras Light Theme === */
-.light {
- --bg: #faf8f5;
- --fg: #2c2c2c;
- --sidebar-bg: #1e3a5f;
- --sidebar-fg: #e2ddd5;
- --sidebar-non-existant: #8da4be;
- --sidebar-active: #d4a84b;
- --sidebar-spacer: #2a4a6f;
- --scrollbar: #3a5a7f;
- --icons: #6a8aaa;
- --icons-hover: #d4a84b;
- --links: #2a5a8f;
- --inline-code-color: #1e3a5f;
- --theme-popup-bg: #faf8f5;
- --theme-popup-border: #d4cfc8;
- --theme-hover: #f0ece6;
- --quote-bg: #f0ece6;
- --quote-border: #d4a84b;
- --warning-border: #d4a84b;
- --table-border-color: #d4cfc8;
- --table-header-bg: #f0ece6;
- --table-alternate-bg: #faf8f5;
- --searchbar-border-color: #d4cfc8;
- --searchbar-bg: #fff;
- --searchbar-fg: #2c2c2c;
- --searchbar-shadow-color: rgba(30, 58, 95, 0.1);
- --searchresults-header-fg: #1e3a5f;
- --searchresults-border-color: #d4cfc8;
- --searchresults-li-bg: #f0ece6;
- --search-mark-bg: #f5dfa0;
-}
-
-/* === Sidebar Logo === */
-#mdbook-sidebar mdbook-sidebar-scrollbox {
- top: 100px;
-}
-
-#mdbook-sidebar {
- background-image: url("../images/logo.png");
- background-repeat: no-repeat;
- background-position: center 20px;
- background-size: 60px auto;
-}
diff --git a/book/en/theme/custom-eff59930.css.gz b/book/en/theme/custom-eff59930.css.gz
deleted file mode 100644
index 8d79cbe..0000000
--- a/book/en/theme/custom-eff59930.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/toc-9150d087.js b/book/en/toc-9150d087.js
deleted file mode 100644
index f7fa3fb..0000000
--- a/book/en/toc-9150d087.js
+++ /dev/null
@@ -1,454 +0,0 @@
-// Populate the sidebar
-//
-// This is a script, and not included directly in the page, to control the total size of the book.
-// The TOC contains an entry for each page, so if each page includes a copy of the TOC,
-// the total size of the page becomes O(n**2).
-class MDBookSidebarScrollbox extends HTMLElement {
- constructor() {
- super();
- }
- connectedCallback() {
- this.innerHTML = '<ol class="chapter"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="introduction.html">Introduction</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="installation.html"><strong aria-hidden="true">1.</strong> Installation</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="quick-start.html"><strong aria-hidden="true">2.</strong> Quick Start</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><span><strong aria-hidden="true">3.</strong> Commands</span></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/init.html"><strong aria-hidden="true">3.1.</strong> init</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/create.html"><strong aria-hidden="true">3.2.</strong> create</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/verify.html"><strong aria-hidden="true">3.3.</strong> verify</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/export.html"><strong aria-hidden="true">3.4.</strong> export</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/list.html"><strong aria-hidden="true">3.5.</strong> list</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="running-a-node.html"><strong aria-hidden="true">4.</strong> Running a Node</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="configuration.html"><strong aria-hidden="true">5.</strong> Configuration</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="network-concepts.html"><strong aria-hidden="true">6.</strong> Network Concepts</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="replication.html"><strong aria-hidden="true">7.</strong> Replication and Repair</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="encryption.html"><strong aria-hidden="true">8.</strong> Encryption and Sealed Tesseras</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="heir-recovery.html"><strong aria-hidden="true">9.</strong> Heir Key Recovery</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="nat-traversal.html"><strong aria-hidden="true">10.</strong> NAT Traversal</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="docker.html"><strong aria-hidden="true">11.</strong> Docker</a></span></li></ol>';
- // Set the current, active page, and reveal it if it's hidden
- let current_page = document.location.href.toString().split('#')[0].split('?')[0];
- if (current_page.endsWith('/')) {
- current_page += 'index.html';
- }
- const links = Array.prototype.slice.call(this.querySelectorAll('a'));
- const l = links.length;
- for (let i = 0; i < l; ++i) {
- const link = links[i];
- const href = link.getAttribute('href');
- if (href && !href.startsWith('#') && !/^(?:[a-z+]+:)?\/\//.test(href)) {
- link.href = path_to_root + href;
- }
- // The 'index' page is supposed to alias the first chapter in the book.
- if (link.href === current_page
- || i === 0
- && path_to_root === ''
- && current_page.endsWith('/index.html')) {
- link.classList.add('active');
- let parent = link.parentElement;
- while (parent) {
- if (parent.tagName === 'LI' && parent.classList.contains('chapter-item')) {
- parent.classList.add('expanded');
- }
- parent = parent.parentElement;
- }
- }
- }
- // Track and set sidebar scroll position
- this.addEventListener('click', e => {
- if (e.target.tagName === 'A') {
- const clientRect = e.target.getBoundingClientRect();
- const sidebarRect = this.getBoundingClientRect();
- sessionStorage.setItem('sidebar-scroll-offset', clientRect.top - sidebarRect.top);
- }
- }, { passive: true });
- const sidebarScrollOffset = sessionStorage.getItem('sidebar-scroll-offset');
- sessionStorage.removeItem('sidebar-scroll-offset');
- if (sidebarScrollOffset !== null) {
- // preserve sidebar scroll position when navigating via links within sidebar
- const activeSection = this.querySelector('.active');
- if (activeSection) {
- const clientRect = activeSection.getBoundingClientRect();
- const sidebarRect = this.getBoundingClientRect();
- const currentOffset = clientRect.top - sidebarRect.top;
- this.scrollTop += currentOffset - parseFloat(sidebarScrollOffset);
- }
- } else {
- // scroll sidebar to current active section when navigating via
- // 'next/previous chapter' buttons
- const activeSection = document.querySelector('#mdbook-sidebar .active');
- if (activeSection) {
- activeSection.scrollIntoView({ block: 'center' });
- }
- }
- // Toggle buttons
- const sidebarAnchorToggles = document.querySelectorAll('.chapter-fold-toggle');
- function toggleSection(ev) {
- ev.currentTarget.parentElement.parentElement.classList.toggle('expanded');
- }
- Array.from(sidebarAnchorToggles).forEach(el => {
- el.addEventListener('click', toggleSection);
- });
- }
-}
-window.customElements.define('mdbook-sidebar-scrollbox', MDBookSidebarScrollbox);
-
-
-// ---------------------------------------------------------------------------
-// Support for dynamically adding headers to the sidebar.
-
-(function() {
- // This is used to detect which direction the page has scrolled since the
- // last scroll event.
- let lastKnownScrollPosition = 0;
- // This is the threshold in px from the top of the screen where it will
- // consider a header the "current" header when scrolling down.
- const defaultDownThreshold = 150;
- // Same as defaultDownThreshold, except when scrolling up.
- const defaultUpThreshold = 300;
- // The threshold is a virtual horizontal line on the screen where it
- // considers the "current" header to be above the line. The threshold is
- // modified dynamically to handle headers that are near the bottom of the
- // screen, and to slightly offset the behavior when scrolling up vs down.
- let threshold = defaultDownThreshold;
- // This is used to disable updates while scrolling. This is needed when
- // clicking the header in the sidebar, which triggers a scroll event. It
- // is somewhat finicky to detect when the scroll has finished, so this
- // uses a relatively dumb system of disabling scroll updates for a short
- // time after the click.
- let disableScroll = false;
- // Array of header elements on the page.
- let headers;
- // Array of li elements that are initially collapsed headers in the sidebar.
- // I'm not sure why eslint seems to have a false positive here.
- // eslint-disable-next-line prefer-const
- let headerToggles = [];
- // This is a debugging tool for the threshold which you can enable in the console.
- let thresholdDebug = false;
-
- // Updates the threshold based on the scroll position.
- function updateThreshold() {
- const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
- const windowHeight = window.innerHeight;
- const documentHeight = document.documentElement.scrollHeight;
-
- // The number of pixels below the viewport, at most documentHeight.
- // This is used to push the threshold down to the bottom of the page
- // as the user scrolls towards the bottom.
- const pixelsBelow = Math.max(0, documentHeight - (scrollTop + windowHeight));
- // The number of pixels above the viewport, at least defaultDownThreshold.
- // Similar to pixelsBelow, this is used to push the threshold back towards
- // the top when reaching the top of the page.
- const pixelsAbove = Math.max(0, defaultDownThreshold - scrollTop);
- // How much the threshold should be offset once it gets close to the
- // bottom of the page.
- const bottomAdd = Math.max(0, windowHeight - pixelsBelow - defaultDownThreshold);
- let adjustedBottomAdd = bottomAdd;
-
- // Adjusts bottomAdd for a small document. The calculation above
- // assumes the document is at least twice the windowheight in size. If
- // it is less than that, then bottomAdd needs to be shrunk
- // proportional to the difference in size.
- if (documentHeight < windowHeight * 2) {
- const maxPixelsBelow = documentHeight - windowHeight;
- const t = 1 - pixelsBelow / Math.max(1, maxPixelsBelow);
- const clamp = Math.max(0, Math.min(1, t));
- adjustedBottomAdd *= clamp;
- }
-
- let scrollingDown = true;
- if (scrollTop < lastKnownScrollPosition) {
- scrollingDown = false;
- }
-
- if (scrollingDown) {
- // When scrolling down, move the threshold up towards the default
- // downwards threshold position. If near the bottom of the page,
- // adjustedBottomAdd will offset the threshold towards the bottom
- // of the page.
- const amountScrolledDown = scrollTop - lastKnownScrollPosition;
- const adjustedDefault = defaultDownThreshold + adjustedBottomAdd;
- threshold = Math.max(adjustedDefault, threshold - amountScrolledDown);
- } else {
- // When scrolling up, move the threshold down towards the default
- // upwards threshold position. If near the bottom of the page,
- // quickly transition the threshold back up where it normally
- // belongs.
- const amountScrolledUp = lastKnownScrollPosition - scrollTop;
- const adjustedDefault = defaultUpThreshold - pixelsAbove
- + Math.max(0, adjustedBottomAdd - defaultDownThreshold);
- threshold = Math.min(adjustedDefault, threshold + amountScrolledUp);
- }
-
- if (documentHeight <= windowHeight) {
- threshold = 0;
- }
-
- if (thresholdDebug) {
- const id = 'mdbook-threshold-debug-data';
- let data = document.getElementById(id);
- if (data === null) {
- data = document.createElement('div');
- data.id = id;
- data.style.cssText = `
- position: fixed;
- top: 50px;
- right: 10px;
- background-color: 0xeeeeee;
- z-index: 9999;
- pointer-events: none;
- `;
- document.body.appendChild(data);
- }
- data.innerHTML = `
- <table>
- <tr><td>documentHeight</td><td>${documentHeight.toFixed(1)}</td></tr>
- <tr><td>windowHeight</td><td>${windowHeight.toFixed(1)}</td></tr>
- <tr><td>scrollTop</td><td>${scrollTop.toFixed(1)}</td></tr>
- <tr><td>pixelsAbove</td><td>${pixelsAbove.toFixed(1)}</td></tr>
- <tr><td>pixelsBelow</td><td>${pixelsBelow.toFixed(1)}</td></tr>
- <tr><td>bottomAdd</td><td>${bottomAdd.toFixed(1)}</td></tr>
- <tr><td>adjustedBottomAdd</td><td>${adjustedBottomAdd.toFixed(1)}</td></tr>
- <tr><td>scrollingDown</td><td>${scrollingDown}</td></tr>
- <tr><td>threshold</td><td>${threshold.toFixed(1)}</td></tr>
- </table>
- `;
- drawDebugLine();
- }
-
- lastKnownScrollPosition = scrollTop;
- }
-
- function drawDebugLine() {
- if (!document.body) {
- return;
- }
- const id = 'mdbook-threshold-debug-line';
- const existingLine = document.getElementById(id);
- if (existingLine) {
- existingLine.remove();
- }
- const line = document.createElement('div');
- line.id = id;
- line.style.cssText = `
- position: fixed;
- top: ${threshold}px;
- left: 0;
- width: 100vw;
- height: 2px;
- background-color: red;
- z-index: 9999;
- pointer-events: none;
- `;
- document.body.appendChild(line);
- }
-
- function mdbookEnableThresholdDebug() {
- thresholdDebug = true;
- updateThreshold();
- drawDebugLine();
- }
-
- window.mdbookEnableThresholdDebug = mdbookEnableThresholdDebug;
-
- // Updates which headers in the sidebar should be expanded. If the current
- // header is inside a collapsed group, then it, and all its parents should
- // be expanded.
- function updateHeaderExpanded(currentA) {
- // Add expanded to all header-item li ancestors.
- let current = currentA.parentElement;
- while (current) {
- if (current.tagName === 'LI' && current.classList.contains('header-item')) {
- current.classList.add('expanded');
- }
- current = current.parentElement;
- }
- }
-
- // Updates which header is marked as the "current" header in the sidebar.
- // This is done with a virtual Y threshold, where headers at or below
- // that line will be considered the current one.
- function updateCurrentHeader() {
- if (!headers || !headers.length) {
- return;
- }
-
- // Reset the classes, which will be rebuilt below.
- const els = document.getElementsByClassName('current-header');
- for (const el of els) {
- el.classList.remove('current-header');
- }
- for (const toggle of headerToggles) {
- toggle.classList.remove('expanded');
- }
-
- // Find the last header that is above the threshold.
- let lastHeader = null;
- for (const header of headers) {
- const rect = header.getBoundingClientRect();
- if (rect.top <= threshold) {
- lastHeader = header;
- } else {
- break;
- }
- }
- if (lastHeader === null) {
- lastHeader = headers[0];
- const rect = lastHeader.getBoundingClientRect();
- const windowHeight = window.innerHeight;
- if (rect.top >= windowHeight) {
- return;
- }
- }
-
- // Get the anchor in the summary.
- const href = '#' + lastHeader.id;
- const a = [...document.querySelectorAll('.header-in-summary')]
- .find(element => element.getAttribute('href') === href);
- if (!a) {
- return;
- }
-
- a.classList.add('current-header');
-
- updateHeaderExpanded(a);
- }
-
- // Updates which header is "current" based on the threshold line.
- function reloadCurrentHeader() {
- if (disableScroll) {
- return;
- }
- updateThreshold();
- updateCurrentHeader();
- }
-
-
- // When clicking on a header in the sidebar, this adjusts the threshold so
- // that it is located next to the header. This is so that header becomes
- // "current".
- function headerThresholdClick(event) {
- // See disableScroll description why this is done.
- disableScroll = true;
- setTimeout(() => {
- disableScroll = false;
- }, 100);
- // requestAnimationFrame is used to delay the update of the "current"
- // header until after the scroll is done, and the header is in the new
- // position.
- requestAnimationFrame(() => {
- requestAnimationFrame(() => {
- // Closest is needed because if it has child elements like <code>.
- const a = event.target.closest('a');
- const href = a.getAttribute('href');
- const targetId = href.substring(1);
- const targetElement = document.getElementById(targetId);
- if (targetElement) {
- threshold = targetElement.getBoundingClientRect().bottom;
- updateCurrentHeader();
- }
- });
- });
- }
-
- // Takes the nodes from the given head and copies them over to the
- // destination, along with some filtering.
- function filterHeader(source, dest) {
- const clone = source.cloneNode(true);
- clone.querySelectorAll('mark').forEach(mark => {
- mark.replaceWith(...mark.childNodes);
- });
- dest.append(...clone.childNodes);
- }
-
- // Scans page for headers and adds them to the sidebar.
- document.addEventListener('DOMContentLoaded', function() {
- const activeSection = document.querySelector('#mdbook-sidebar .active');
- if (activeSection === null) {
- return;
- }
-
- const main = document.getElementsByTagName('main')[0];
- headers = Array.from(main.querySelectorAll('h2, h3, h4, h5, h6'))
- .filter(h => h.id !== '' && h.children.length && h.children[0].tagName === 'A');
-
- if (headers.length === 0) {
- return;
- }
-
- // Build a tree of headers in the sidebar.
-
- const stack = [];
-
- const firstLevel = parseInt(headers[0].tagName.charAt(1));
- for (let i = 1; i < firstLevel; i++) {
- const ol = document.createElement('ol');
- ol.classList.add('section');
- if (stack.length > 0) {
- stack[stack.length - 1].ol.appendChild(ol);
- }
- stack.push({level: i + 1, ol: ol});
- }
-
- // The level where it will start folding deeply nested headers.
- const foldLevel = 3;
-
- for (let i = 0; i < headers.length; i++) {
- const header = headers[i];
- const level = parseInt(header.tagName.charAt(1));
-
- const currentLevel = stack[stack.length - 1].level;
- if (level > currentLevel) {
- // Begin nesting to this level.
- for (let nextLevel = currentLevel + 1; nextLevel <= level; nextLevel++) {
- const ol = document.createElement('ol');
- ol.classList.add('section');
- const last = stack[stack.length - 1];
- const lastChild = last.ol.lastChild;
- // Handle the case where jumping more than one nesting
- // level, which doesn't have a list item to place this new
- // list inside of.
- if (lastChild) {
- lastChild.appendChild(ol);
- } else {
- last.ol.appendChild(ol);
- }
- stack.push({level: nextLevel, ol: ol});
- }
- } else if (level < currentLevel) {
- while (stack.length > 1 && stack[stack.length - 1].level > level) {
- stack.pop();
- }
- }
-
- const li = document.createElement('li');
- li.classList.add('header-item');
- li.classList.add('expanded');
- if (level < foldLevel) {
- li.classList.add('expanded');
- }
- const span = document.createElement('span');
- span.classList.add('chapter-link-wrapper');
- const a = document.createElement('a');
- span.appendChild(a);
- a.href = '#' + header.id;
- a.classList.add('header-in-summary');
- filterHeader(header.children[0], a);
- a.addEventListener('click', headerThresholdClick);
- const nextHeader = headers[i + 1];
- if (nextHeader !== undefined) {
- const nextLevel = parseInt(nextHeader.tagName.charAt(1));
- if (nextLevel > level && level >= foldLevel) {
- const toggle = document.createElement('a');
- toggle.classList.add('chapter-fold-toggle');
- toggle.classList.add('header-toggle');
- toggle.addEventListener('click', () => {
- li.classList.toggle('expanded');
- });
- const toggleDiv = document.createElement('div');
- toggleDiv.textContent = '❱';
- toggle.appendChild(toggleDiv);
- span.appendChild(toggle);
- headerToggles.push(li);
- }
- }
- li.appendChild(span);
-
- const currentParent = stack[stack.length - 1];
- currentParent.ol.appendChild(li);
- }
-
- const onThisPage = document.createElement('div');
- onThisPage.classList.add('on-this-page');
- onThisPage.append(stack[0].ol);
- const activeItemSpan = activeSection.parentElement;
- activeItemSpan.after(onThisPage);
- });
-
- document.addEventListener('DOMContentLoaded', reloadCurrentHeader);
- document.addEventListener('scroll', reloadCurrentHeader, { passive: true });
-})();
-
diff --git a/book/en/toc-9150d087.js.gz b/book/en/toc-9150d087.js.gz
deleted file mode 100644
index 79fbe94..0000000
--- a/book/en/toc-9150d087.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/toc.html b/book/en/toc.html
deleted file mode 100644
index 0bee994..0000000
--- a/book/en/toc.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en" class="light" dir="ltr">
- <head>
- <!-- sidebar iframe generated using mdBook
-
- This is a frame, and not included directly in the page, to control the total size of the
- book. The TOC contains an entry for each page, so if each page includes a copy of the TOC,
- the total size of the page becomes O(n**2).
-
- The frame is only used as a fallback when JS is turned off. When it's on, the sidebar is
- instead added to the main page by `toc.js` instead. The JavaScript mode is better
- because, when running in a `file:///` URL, the iframed page would not be Same-Origin as
- the rest of the page, so the sidebar and the main page theme would fall out of sync.
- -->
- <meta charset="UTF-8">
- <meta name="robots" content="noindex">
- <!-- Custom HTML head -->
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
- </head>
- <body class="sidebar-iframe-inner">
- <ol class="chapter"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="introduction.html" target="_parent">Introduction</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="installation.html" target="_parent"><strong aria-hidden="true">1.</strong> Installation</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="quick-start.html" target="_parent"><strong aria-hidden="true">2.</strong> Quick Start</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><span><strong aria-hidden="true">3.</strong> Commands</span></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/init.html" target="_parent"><strong aria-hidden="true">3.1.</strong> init</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/create.html" target="_parent"><strong aria-hidden="true">3.2.</strong> create</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/verify.html" target="_parent"><strong aria-hidden="true">3.3.</strong> verify</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/export.html" target="_parent"><strong aria-hidden="true">3.4.</strong> export</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/list.html" target="_parent"><strong aria-hidden="true">3.5.</strong> list</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="running-a-node.html" target="_parent"><strong aria-hidden="true">4.</strong> Running a Node</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="configuration.html" target="_parent"><strong aria-hidden="true">5.</strong> Configuration</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="network-concepts.html" target="_parent"><strong aria-hidden="true">6.</strong> Network Concepts</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="replication.html" target="_parent"><strong aria-hidden="true">7.</strong> Replication and Repair</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="encryption.html" target="_parent"><strong aria-hidden="true">8.</strong> Encryption and Sealed Tesseras</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="heir-recovery.html" target="_parent"><strong aria-hidden="true">9.</strong> Heir Key Recovery</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="nat-traversal.html" target="_parent"><strong aria-hidden="true">10.</strong> NAT Traversal</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="docker.html" target="_parent"><strong aria-hidden="true">11.</strong> Docker</a></span></li></ol>
- </body>
-</html>
diff --git a/book/en/toc.html.gz b/book/en/toc.html.gz
deleted file mode 100644
index a7badd7..0000000
--- a/book/en/toc.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/en/tomorrow-night-4c0ae647.css b/book/en/tomorrow-night-4c0ae647.css
deleted file mode 100644
index 11752b8..0000000
--- a/book/en/tomorrow-night-4c0ae647.css
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Tomorrow Night Theme */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-/* Original theme - https://github.com/chriskempson/tomorrow-theme */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Tomorrow Comment */
-.hljs-comment {
- color: #969896;
-}
-
-/* Tomorrow Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-attr,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
- color: #cc6666;
-}
-
-/* Tomorrow Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
- color: #de935f;
-}
-
-/* Tomorrow Yellow */
-.ruby .hljs-class .hljs-title,
-.css .hljs-rule .hljs-attribute {
- color: #f0c674;
-}
-
-/* Tomorrow Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.hljs-name,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
- color: #b5bd68;
-}
-
-/* Tomorrow Aqua */
-.hljs-title,
-.hljs-section,
-.css .hljs-hexcolor {
- color: #8abeb7;
-}
-
-/* Tomorrow Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
- color: #81a2be;
-}
-
-/* Tomorrow Purple */
-.hljs-keyword,
-.javascript .hljs-function {
- color: #b294bb;
-}
-
-.hljs {
- display: block;
- overflow-x: auto;
- background: #1d1f21;
- color: #c5c8c6;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
- opacity: 0.5;
-}
-
-.hljs-addition {
- color: #718c00;
-}
-
-.hljs-deletion {
- color: #c82829;
-}
diff --git a/book/en/tomorrow-night-4c0ae647.css.gz b/book/en/tomorrow-night-4c0ae647.css.gz
deleted file mode 100644
index a90784b..0000000
--- a/book/en/tomorrow-night-4c0ae647.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/.nojekyll b/book/pt-br/.nojekyll
deleted file mode 100644
index f173110..0000000
--- a/book/pt-br/.nojekyll
+++ /dev/null
@@ -1 +0,0 @@
-This file makes sure that Github Pages doesn't process mdBook's output.
diff --git a/book/pt-br/404.html b/book/pt-br/404.html
deleted file mode 100644
index b5e785e..0000000
--- a/book/pt-br/404.html
+++ /dev/null
@@ -1,228 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Page not found - Guia do Usuário Tesseras</title>
- <base href="/book/pt-br/">
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="document-not-found-404"><a class="header" href="#document-not-found-404">Document not found (404)</a></h1>
-<p>This URL is invalid, sorry. Please use the navigation bar or search to continue.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
-
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
-
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/404.html.gz b/book/pt-br/404.html.gz
deleted file mode 100644
index 34e88f8..0000000
--- a/book/pt-br/404.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/ayu-highlight-3fdfc3ac.css b/book/pt-br/ayu-highlight-3fdfc3ac.css
deleted file mode 100644
index dba94b0..0000000
--- a/book/pt-br/ayu-highlight-3fdfc3ac.css
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-Based off of the Ayu theme
-Original by Dempfi (https://github.com/dempfi/ayu)
-*/
-
-.hljs {
- display: block;
- overflow-x: auto;
- background: #191f26;
- color: #e6e1cf;
-}
-
-.hljs-comment,
-.hljs-quote {
- color: #5c6773;
-}
-
-.hljs-variable,
-.hljs-template-variable,
-.hljs-attribute,
-.hljs-attr,
-.hljs-regexp,
-.hljs-link,
-.hljs-selector-id,
-.hljs-selector-class {
- color: #ff7733;
-}
-
-.hljs-number,
-.hljs-meta,
-.hljs-builtin-name,
-.hljs-literal,
-.hljs-type,
-.hljs-params {
- color: #ffee99;
-}
-
-.hljs-string,
-.hljs-bullet {
- color: #b8cc52;
-}
-
-.hljs-title,
-.hljs-built_in,
-.hljs-section {
- color: #ffb454;
-}
-
-.hljs-keyword,
-.hljs-selector-tag,
-.hljs-symbol {
- color: #ff7733;
-}
-
-.hljs-name {
- color: #36a3d9;
-}
-
-.hljs-tag {
- color: #00568d;
-}
-
-.hljs-emphasis {
- font-style: italic;
-}
-
-.hljs-strong {
- font-weight: bold;
-}
-
-.hljs-addition {
- color: #91b362;
-}
-
-.hljs-deletion {
- color: #d96c75;
-}
diff --git a/book/pt-br/ayu-highlight-3fdfc3ac.css.gz b/book/pt-br/ayu-highlight-3fdfc3ac.css.gz
deleted file mode 100644
index 81dfff3..0000000
--- a/book/pt-br/ayu-highlight-3fdfc3ac.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/book-a0b12cfe.js b/book/pt-br/book-a0b12cfe.js
deleted file mode 100644
index 62d7c4c..0000000
--- a/book/pt-br/book-a0b12cfe.js
+++ /dev/null
@@ -1,843 +0,0 @@
-'use strict';
-
-/* global default_theme, default_dark_theme, default_light_theme, hljs, ClipboardJS */
-
-// Fix back button cache problem
-window.onunload = function() { };
-
-// Global variable, shared between modules
-function playground_text(playground, hidden = true) {
- const code_block = playground.querySelector('code');
-
- if (window.ace && code_block.classList.contains('editable')) {
- const editor = window.ace.edit(code_block);
- return editor.getValue();
- } else if (hidden) {
- return code_block.textContent;
- } else {
- return code_block.innerText;
- }
-}
-
-(function codeSnippets() {
- function fetch_with_timeout(url, options, timeout = 6000) {
- return Promise.race([
- fetch(url, options),
- new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)),
- ]);
- }
-
- const playgrounds = Array.from(document.querySelectorAll('.playground'));
- if (playgrounds.length > 0) {
- fetch_with_timeout('https://play.rust-lang.org/meta/crates', {
- headers: {
- 'Content-Type': 'application/json',
- },
- method: 'POST',
- mode: 'cors',
- })
- .then(response => response.json())
- .then(response => {
- // get list of crates available in the rust playground
- const playground_crates = response.crates.map(item => item['id']);
- playgrounds.forEach(block => handle_crate_list_update(block, playground_crates));
- });
- }
-
- function handle_crate_list_update(playground_block, playground_crates) {
- // update the play buttons after receiving the response
- update_play_button(playground_block, playground_crates);
-
- // and install on change listener to dynamically update ACE editors
- if (window.ace) {
- const code_block = playground_block.querySelector('code');
- if (code_block.classList.contains('editable')) {
- const editor = window.ace.edit(code_block);
- editor.addEventListener('change', () => {
- update_play_button(playground_block, playground_crates);
- });
- // add Ctrl-Enter command to execute rust code
- editor.commands.addCommand({
- name: 'run',
- bindKey: {
- win: 'Ctrl-Enter',
- mac: 'Ctrl-Enter',
- },
- exec: _editor => run_rust_code(playground_block),
- });
- }
- }
- }
-
- // updates the visibility of play button based on `no_run` class and
- // used crates vs ones available on https://play.rust-lang.org
- function update_play_button(pre_block, playground_crates) {
- const play_button = pre_block.querySelector('.play-button');
-
- // skip if code is `no_run`
- if (pre_block.querySelector('code').classList.contains('no_run')) {
- play_button.classList.add('hidden');
- return;
- }
-
- // get list of `extern crate`'s from snippet
- const txt = playground_text(pre_block);
- const re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g;
- const snippet_crates = [];
- let item;
- while (item = re.exec(txt)) {
- snippet_crates.push(item[1]);
- }
-
- // check if all used crates are available on play.rust-lang.org
- const all_available = snippet_crates.every(function(elem) {
- return playground_crates.indexOf(elem) > -1;
- });
-
- if (all_available) {
- play_button.classList.remove('hidden');
- play_button.hidden = false;
- } else {
- play_button.classList.add('hidden');
- }
- }
-
- function run_rust_code(code_block) {
- let result_block = code_block.querySelector('.result');
- if (!result_block) {
- result_block = document.createElement('code');
- result_block.className = 'result hljs language-bash';
-
- code_block.append(result_block);
- }
-
- const text = playground_text(code_block);
- const classes = code_block.querySelector('code').classList;
- let edition = '2015';
- classes.forEach(className => {
- if (className.startsWith('edition')) {
- edition = className.slice(7);
- }
- });
- const params = {
- version: 'stable',
- optimize: '0',
- code: text,
- edition: edition,
- };
-
- if (text.indexOf('#![feature') !== -1) {
- params.version = 'nightly';
- }
-
- result_block.innerText = 'Running...';
-
- fetch_with_timeout('https://play.rust-lang.org/evaluate.json', {
- headers: {
- 'Content-Type': 'application/json',
- },
- method: 'POST',
- mode: 'cors',
- body: JSON.stringify(params),
- })
- .then(response => response.json())
- .then(response => {
- if (response.result.trim() === '') {
- result_block.innerText = 'No output';
- result_block.classList.add('result-no-output');
- } else {
- result_block.innerText = response.result;
- result_block.classList.remove('result-no-output');
- }
- })
- .catch(error => result_block.innerText = 'Playground Communication: ' + error.message);
- }
-
- // Syntax highlighting Configuration
- hljs.configure({
- tabReplace: ' ', // 4 spaces
- languages: [], // Languages used for auto-detection
- });
-
- const code_nodes = Array
- .from(document.querySelectorAll('code'))
- // Don't highlight `inline code` blocks in headers.
- .filter(function(node) {
- return !node.parentElement.classList.contains('header');
- });
-
- if (window.ace) {
- // language-rust class needs to be removed for editable
- // blocks or highlightjs will capture events
- code_nodes
- .filter(function(node) {
- return node.classList.contains('editable');
- })
- .forEach(function(block) {
- block.classList.remove('language-rust');
- });
-
- code_nodes
- .filter(function(node) {
- return !node.classList.contains('editable');
- })
- .forEach(function(block) {
- hljs.highlightBlock(block);
- });
- } else {
- code_nodes.forEach(function(block) {
- hljs.highlightBlock(block);
- });
- }
-
- // Adding the hljs class gives code blocks the color css
- // even if highlighting doesn't apply
- code_nodes.forEach(function(block) {
- block.classList.add('hljs');
- });
-
- Array.from(document.querySelectorAll('code.hljs')).forEach(function(block) {
-
- const lines = Array.from(block.querySelectorAll('.boring'));
- // If no lines were hidden, return
- if (!lines.length) {
- return;
- }
- block.classList.add('hide-boring');
-
- const buttons = document.createElement('div');
- buttons.className = 'buttons';
- buttons.innerHTML = '<button title="Show hidden lines" \
-aria-label="Show hidden lines"></button>';
- buttons.firstChild.innerHTML = document.getElementById('fa-eye').innerHTML;
-
- // add expand button
- const pre_block = block.parentNode;
- pre_block.insertBefore(buttons, pre_block.firstChild);
-
- buttons.firstChild.addEventListener('click', function(e) {
- if (this.title === 'Show hidden lines') {
- this.innerHTML = document.getElementById('fa-eye-slash').innerHTML;
- this.title = 'Hide lines';
- this.setAttribute('aria-label', e.target.title);
-
- block.classList.remove('hide-boring');
- } else if (this.title === 'Hide lines') {
- this.innerHTML = document.getElementById('fa-eye').innerHTML;
- this.title = 'Show hidden lines';
- this.setAttribute('aria-label', e.target.title);
-
- block.classList.add('hide-boring');
- }
- });
- });
-
- if (window.playground_copyable) {
- Array.from(document.querySelectorAll('pre code')).forEach(function(block) {
- const pre_block = block.parentNode;
- if (!pre_block.classList.contains('playground')) {
- let buttons = pre_block.querySelector('.buttons');
- if (!buttons) {
- buttons = document.createElement('div');
- buttons.className = 'buttons';
- pre_block.insertBefore(buttons, pre_block.firstChild);
- }
-
- const clipButton = document.createElement('button');
- clipButton.className = 'clip-button';
- clipButton.title = 'Copy to clipboard';
- clipButton.setAttribute('aria-label', clipButton.title);
- clipButton.innerHTML = '<i class="tooltiptext"></i>';
-
- buttons.insertBefore(clipButton, buttons.firstChild);
- }
- });
- }
-
- // Process playground code blocks
- Array.from(document.querySelectorAll('.playground')).forEach(function(pre_block) {
- // Add play button
- let buttons = pre_block.querySelector('.buttons');
- if (!buttons) {
- buttons = document.createElement('div');
- buttons.className = 'buttons';
- pre_block.insertBefore(buttons, pre_block.firstChild);
- }
-
- const runCodeButton = document.createElement('button');
- runCodeButton.className = 'play-button';
- runCodeButton.hidden = true;
- runCodeButton.title = 'Run this code';
- runCodeButton.setAttribute('aria-label', runCodeButton.title);
- runCodeButton.innerHTML = document.getElementById('fa-play').innerHTML;
-
- buttons.insertBefore(runCodeButton, buttons.firstChild);
- runCodeButton.addEventListener('click', () => {
- run_rust_code(pre_block);
- });
-
- if (window.playground_copyable) {
- const copyCodeClipboardButton = document.createElement('button');
- copyCodeClipboardButton.className = 'clip-button';
- copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>';
- copyCodeClipboardButton.title = 'Copy to clipboard';
- copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title);
-
- buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild);
- }
-
- const code_block = pre_block.querySelector('code');
- if (window.ace && code_block.classList.contains('editable')) {
- const undoChangesButton = document.createElement('button');
- undoChangesButton.className = 'reset-button';
- undoChangesButton.title = 'Undo changes';
- undoChangesButton.setAttribute('aria-label', undoChangesButton.title);
- undoChangesButton.innerHTML +=
- document.getElementById('fa-clock-rotate-left').innerHTML;
-
- buttons.insertBefore(undoChangesButton, buttons.firstChild);
-
- undoChangesButton.addEventListener('click', function() {
- const editor = window.ace.edit(code_block);
- editor.setValue(editor.originalCode);
- editor.clearSelection();
- });
- }
- });
-})();
-
-(function themes() {
- const html = document.querySelector('html');
- const themeToggleButton = document.getElementById('mdbook-theme-toggle');
- const themePopup = document.getElementById('mdbook-theme-list');
- const themeColorMetaTag = document.querySelector('meta[name="theme-color"]');
- const themeIds = [];
- themePopup.querySelectorAll('button.theme').forEach(function(el) {
- themeIds.push(el.id);
- });
- const stylesheets = {
- ayuHighlight: document.querySelector('#mdbook-ayu-highlight-css'),
- tomorrowNight: document.querySelector('#mdbook-tomorrow-night-css'),
- highlight: document.querySelector('#mdbook-highlight-css'),
- };
-
- function showThemes() {
- themePopup.style.display = 'block';
- themeToggleButton.setAttribute('aria-expanded', true);
- themePopup.querySelector('button#mdbook-theme-' + get_theme()).focus();
- }
-
- function updateThemeSelected() {
- themePopup.querySelectorAll('.theme-selected').forEach(function(el) {
- el.classList.remove('theme-selected');
- });
- const selected = get_saved_theme() ?? 'default_theme';
- let element = themePopup.querySelector('button#mdbook-theme-' + selected);
- if (element === null) {
- // Fall back in case there is no "Default" item.
- element = themePopup.querySelector('button#mdbook-theme-' + get_theme());
- }
- element.classList.add('theme-selected');
- }
-
- function hideThemes() {
- themePopup.style.display = 'none';
- themeToggleButton.setAttribute('aria-expanded', false);
- themeToggleButton.focus();
- }
-
- function get_saved_theme() {
- let theme = null;
- try {
- theme = localStorage.getItem('mdbook-theme');
- } catch {
- // ignore error.
- }
- return theme;
- }
-
- function delete_saved_theme() {
- localStorage.removeItem('mdbook-theme');
- }
-
- function get_theme() {
- const theme = get_saved_theme();
- if (theme === null || theme === undefined || !themeIds.includes('mdbook-theme-' + theme)) {
- if (typeof default_dark_theme === 'undefined') {
- // A customized index.hbs might not define this, so fall back to
- // old behavior of determining the default on page load.
- return default_theme;
- }
- return window.matchMedia('(prefers-color-scheme: dark)').matches
- ? default_dark_theme
- : default_light_theme;
- } else {
- return theme;
- }
- }
-
- let previousTheme = default_theme;
- function set_theme(theme, store = true) {
- let ace_theme;
-
- if (theme === 'coal' || theme === 'navy') {
- stylesheets.ayuHighlight.disabled = true;
- stylesheets.tomorrowNight.disabled = false;
- stylesheets.highlight.disabled = true;
-
- ace_theme = 'ace/theme/tomorrow_night';
- } else if (theme === 'ayu') {
- stylesheets.ayuHighlight.disabled = false;
- stylesheets.tomorrowNight.disabled = true;
- stylesheets.highlight.disabled = true;
- ace_theme = 'ace/theme/tomorrow_night';
- } else {
- stylesheets.ayuHighlight.disabled = true;
- stylesheets.tomorrowNight.disabled = true;
- stylesheets.highlight.disabled = false;
- ace_theme = 'ace/theme/dawn';
- }
-
- setTimeout(function() {
- themeColorMetaTag.content = getComputedStyle(document.documentElement).backgroundColor;
- }, 1);
-
- if (window.ace && window.editors) {
- window.editors.forEach(function(editor) {
- editor.setTheme(ace_theme);
- });
- }
-
- if (store) {
- try {
- localStorage.setItem('mdbook-theme', theme);
- } catch {
- // ignore error.
- }
- }
-
- html.classList.remove(previousTheme);
- html.classList.add(theme);
- previousTheme = theme;
- updateThemeSelected();
- }
-
- const query = window.matchMedia('(prefers-color-scheme: dark)');
- query.onchange = function() {
- set_theme(get_theme(), false);
- };
-
- // Set theme.
- set_theme(get_theme(), false);
-
- themeToggleButton.addEventListener('click', function() {
- if (themePopup.style.display === 'block') {
- hideThemes();
- } else {
- showThemes();
- }
- });
-
- themePopup.addEventListener('click', function(e) {
- let theme;
- if (e.target.className === 'theme') {
- theme = e.target.id;
- } else if (e.target.parentElement.className === 'theme') {
- theme = e.target.parentElement.id;
- } else {
- return;
- }
- theme = theme.replace(/^mdbook-theme-/, '');
-
- if (theme === 'default_theme' || theme === null) {
- delete_saved_theme();
- set_theme(get_theme(), false);
- } else {
- set_theme(theme);
- }
- });
-
- themePopup.addEventListener('focusout', function(e) {
- // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below)
- if (!!e.relatedTarget &&
- !themeToggleButton.contains(e.relatedTarget) &&
- !themePopup.contains(e.relatedTarget)
- ) {
- hideThemes();
- }
- });
-
- // Should not be needed, but it works around an issue on macOS & iOS:
- // https://github.com/rust-lang/mdBook/issues/628
- document.addEventListener('click', function(e) {
- if (themePopup.style.display === 'block' &&
- !themeToggleButton.contains(e.target) &&
- !themePopup.contains(e.target)
- ) {
- hideThemes();
- }
- });
-
- document.addEventListener('keydown', function(e) {
- if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
- return;
- }
- if (!themePopup.contains(e.target)) {
- return;
- }
-
- let li;
- switch (e.key) {
- case 'Escape':
- e.preventDefault();
- hideThemes();
- break;
- case 'ArrowUp':
- e.preventDefault();
- li = document.activeElement.parentElement;
- if (li && li.previousElementSibling) {
- li.previousElementSibling.querySelector('button').focus();
- }
- break;
- case 'ArrowDown':
- e.preventDefault();
- li = document.activeElement.parentElement;
- if (li && li.nextElementSibling) {
- li.nextElementSibling.querySelector('button').focus();
- }
- break;
- case 'Home':
- e.preventDefault();
- themePopup.querySelector('li:first-child button').focus();
- break;
- case 'End':
- e.preventDefault();
- themePopup.querySelector('li:last-child button').focus();
- break;
- }
- });
-})();
-
-(function sidebar() {
- const sidebar = document.getElementById('mdbook-sidebar');
- const sidebarLinks = document.querySelectorAll('#mdbook-sidebar a');
- const sidebarToggleButton = document.getElementById('mdbook-sidebar-toggle');
- const sidebarResizeHandle = document.getElementById('mdbook-sidebar-resize-handle');
- const sidebarCheckbox = document.getElementById('mdbook-sidebar-toggle-anchor');
- let firstContact = null;
-
-
- /* Because we cannot change the `display` using only CSS after/before the transition, we
- need JS to do it. We change the display to prevent the browsers search to find text inside
- the collapsed sidebar. */
- if (!document.documentElement.classList.contains('sidebar-visible')) {
- sidebar.style.display = 'none';
- }
- sidebar.addEventListener('transitionend', () => {
- /* We only change the display to "none" if we're collapsing the sidebar. */
- if (!sidebarCheckbox.checked) {
- sidebar.style.display = 'none';
- }
- });
- sidebarToggleButton.addEventListener('click', () => {
- /* To allow the sidebar expansion animation, we first need to put back the display. */
- if (!sidebarCheckbox.checked) {
- sidebar.style.display = '';
- // Workaround for Safari skipping the animation when changing
- // `display` and a transform in the same event loop. This forces a
- // reflow after updating the display.
- sidebar.offsetHeight;
- }
- });
-
- function showSidebar() {
- document.documentElement.classList.add('sidebar-visible');
- Array.from(sidebarLinks).forEach(function(link) {
- link.setAttribute('tabIndex', 0);
- });
- sidebarToggleButton.setAttribute('aria-expanded', true);
- sidebar.setAttribute('aria-hidden', false);
- try {
- localStorage.setItem('mdbook-sidebar', 'visible');
- } catch {
- // Ignore error.
- }
- }
-
- function hideSidebar() {
- document.documentElement.classList.remove('sidebar-visible');
- Array.from(sidebarLinks).forEach(function(link) {
- link.setAttribute('tabIndex', -1);
- });
- sidebarToggleButton.setAttribute('aria-expanded', false);
- sidebar.setAttribute('aria-hidden', true);
- try {
- localStorage.setItem('mdbook-sidebar', 'hidden');
- } catch {
- // Ignore error.
- }
- }
-
- // Toggle sidebar
- sidebarCheckbox.addEventListener('change', function sidebarToggle() {
- if (sidebarCheckbox.checked) {
- const current_width = parseInt(
- document.documentElement.style.getPropertyValue('--sidebar-target-width'), 10);
- if (current_width < 150) {
- document.documentElement.style.setProperty('--sidebar-target-width', '150px');
- }
- showSidebar();
- } else {
- hideSidebar();
- }
- });
-
- sidebarResizeHandle.addEventListener('mousedown', initResize, false);
-
- function initResize() {
- window.addEventListener('mousemove', resize, false);
- window.addEventListener('mouseup', stopResize, false);
- document.documentElement.classList.add('sidebar-resizing');
- }
- function resize(e) {
- let pos = e.clientX - sidebar.offsetLeft;
- if (pos < 20) {
- hideSidebar();
- } else {
- if (!document.documentElement.classList.contains('sidebar-visible')) {
- showSidebar();
- }
- pos = Math.min(pos, window.innerWidth - 100);
- document.documentElement.style.setProperty('--sidebar-target-width', pos + 'px');
- }
- }
- //on mouseup remove windows functions mousemove & mouseup
- function stopResize() {
- document.documentElement.classList.remove('sidebar-resizing');
- window.removeEventListener('mousemove', resize, false);
- window.removeEventListener('mouseup', stopResize, false);
- }
-
- document.addEventListener('touchstart', function(e) {
- firstContact = {
- x: e.touches[0].clientX,
- time: Date.now(),
- };
- }, { passive: true });
-
- document.addEventListener('touchmove', function(e) {
- if (!firstContact) {
- return;
- }
-
- const curX = e.touches[0].clientX;
- const xDiff = curX - firstContact.x,
- tDiff = Date.now() - firstContact.time;
-
- if (tDiff < 250 && Math.abs(xDiff) >= 150) {
- if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) {
- showSidebar();
- } else if (xDiff < 0 && curX < 300) {
- hideSidebar();
- }
-
- firstContact = null;
- }
- }, { passive: true });
-})();
-
-(function chapterNavigation() {
- document.addEventListener('keydown', function(e) {
- if (e.altKey || e.ctrlKey || e.metaKey) {
- return;
- }
- if (window.search && window.search.hasFocus()) {
- return;
- }
- const html = document.querySelector('html');
-
- function next() {
- const nextButton = document.querySelector('.nav-chapters.next');
- if (nextButton) {
- window.location.href = nextButton.href;
- }
- }
- function prev() {
- const previousButton = document.querySelector('.nav-chapters.previous');
- if (previousButton) {
- window.location.href = previousButton.href;
- }
- }
- function showHelp() {
- const container = document.getElementById('mdbook-help-container');
- const overlay = document.getElementById('mdbook-help-popup');
- container.style.display = 'flex';
-
- // Clicking outside the popup will dismiss it.
- const mouseHandler = event => {
- if (overlay.contains(event.target)) {
- return;
- }
- if (event.button !== 0) {
- return;
- }
- event.preventDefault();
- event.stopPropagation();
- document.removeEventListener('mousedown', mouseHandler);
- hideHelp();
- };
-
- // Pressing esc will dismiss the popup.
- const escapeKeyHandler = event => {
- if (event.key === 'Escape') {
- event.preventDefault();
- event.stopPropagation();
- document.removeEventListener('keydown', escapeKeyHandler, true);
- hideHelp();
- }
- };
- document.addEventListener('keydown', escapeKeyHandler, true);
- document.getElementById('mdbook-help-container')
- .addEventListener('mousedown', mouseHandler);
- }
- function hideHelp() {
- document.getElementById('mdbook-help-container').style.display = 'none';
- }
-
- // Usually needs the Shift key to be pressed
- switch (e.key) {
- case '?':
- e.preventDefault();
- showHelp();
- break;
- }
-
- // Rest of the keys are only active when the Shift key is not pressed
- if (e.shiftKey) {
- return;
- }
-
- switch (e.key) {
- case 'ArrowRight':
- e.preventDefault();
- if (html.dir === 'rtl') {
- prev();
- } else {
- next();
- }
- break;
- case 'ArrowLeft':
- e.preventDefault();
- if (html.dir === 'rtl') {
- next();
- } else {
- prev();
- }
- break;
- }
- });
-})();
-
-(function clipboard() {
- const clipButtons = document.querySelectorAll('.clip-button');
-
- function hideTooltip(elem) {
- elem.firstChild.innerText = '';
- elem.className = 'clip-button';
- }
-
- function showTooltip(elem, msg) {
- elem.firstChild.innerText = msg;
- elem.className = 'clip-button tooltipped';
- }
-
- const clipboardSnippets = new ClipboardJS('.clip-button', {
- text: function(trigger) {
- hideTooltip(trigger);
- const playground = trigger.closest('pre');
- return playground_text(playground, false);
- },
- });
-
- Array.from(clipButtons).forEach(function(clipButton) {
- clipButton.addEventListener('mouseout', function(e) {
- hideTooltip(e.currentTarget);
- });
- });
-
- clipboardSnippets.on('success', function(e) {
- e.clearSelection();
- showTooltip(e.trigger, 'Copied!');
- });
-
- clipboardSnippets.on('error', function(e) {
- showTooltip(e.trigger, 'Clipboard error!');
- });
-})();
-
-(function scrollToTop() {
- const menuTitle = document.querySelector('.menu-title');
-
- menuTitle.addEventListener('click', function() {
- document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' });
- });
-})();
-
-(function controllMenu() {
- const menu = document.getElementById('mdbook-menu-bar');
-
- (function controllPosition() {
- let scrollTop = document.scrollingElement.scrollTop;
- let prevScrollTop = scrollTop;
- const minMenuY = -menu.clientHeight - 50;
- // When the script loads, the page can be at any scroll (e.g. if you refresh it).
- menu.style.top = scrollTop + 'px';
- // Same as parseInt(menu.style.top.slice(0, -2), but faster
- let topCache = menu.style.top.slice(0, -2);
- menu.classList.remove('sticky');
- let stickyCache = false; // Same as menu.classList.contains('sticky'), but faster
- document.addEventListener('scroll', function() {
- scrollTop = Math.max(document.scrollingElement.scrollTop, 0);
- // `null` means that it doesn't need to be updated
- let nextSticky = null;
- let nextTop = null;
- const scrollDown = scrollTop > prevScrollTop;
- const menuPosAbsoluteY = topCache - scrollTop;
- if (scrollDown) {
- nextSticky = false;
- if (menuPosAbsoluteY > 0) {
- nextTop = prevScrollTop;
- }
- } else {
- if (menuPosAbsoluteY > 0) {
- nextSticky = true;
- } else if (menuPosAbsoluteY < minMenuY) {
- nextTop = prevScrollTop + minMenuY;
- }
- }
- if (nextSticky === true && stickyCache === false) {
- menu.classList.add('sticky');
- stickyCache = true;
- } else if (nextSticky === false && stickyCache === true) {
- menu.classList.remove('sticky');
- stickyCache = false;
- }
- if (nextTop !== null) {
- menu.style.top = nextTop + 'px';
- topCache = nextTop;
- }
- prevScrollTop = scrollTop;
- }, { passive: true });
- })();
- (function controllBorder() {
- function updateBorder() {
- if (menu.offsetTop === 0) {
- menu.classList.remove('bordered');
- } else {
- menu.classList.add('bordered');
- }
- }
- updateBorder();
- document.addEventListener('scroll', updateBorder, { passive: true });
- })();
-})();
diff --git a/book/pt-br/book-a0b12cfe.js.gz b/book/pt-br/book-a0b12cfe.js.gz
deleted file mode 100644
index de44523..0000000
--- a/book/pt-br/book-a0b12cfe.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/clipboard-1626706a.min.js b/book/pt-br/clipboard-1626706a.min.js
deleted file mode 100644
index 02c549e..0000000
--- a/book/pt-br/clipboard-1626706a.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * clipboard.js v2.0.4
- * https://zenorocha.github.io/clipboard.js
- *
- * Licensed MIT © Zeno Rocha
- */
-!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(t,e,n){return e&&o(t.prototype,e),n&&o(t,n),t}}(),a=o(n(1)),c=o(n(3)),u=o(n(4));function o(t){return t&&t.__esModule?t:{default:t}}var l=function(t){function o(t,e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,o);var n=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}(this,(o.__proto__||Object.getPrototypeOf(o)).call(this));return n.resolveOptions(e),n.listenClick(t),n}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(o,c.default),i(o,[{key:"resolveOptions",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===r(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,u.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new a.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return s("action",t)}},{key:"defaultTarget",value:function(t){var e=s("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return s("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),o}();function s(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}t.exports=l},function(t,e,n){"use strict";var o,r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(t,e,n){return e&&o(t.prototype,e),n&&o(t,n),t}}(),a=n(2),c=(o=a)&&o.__esModule?o:{default:o};var u=function(){function e(t){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),this.resolveOptions(t),this.initSelection()}return i(e,[{key:"resolveOptions",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,c.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,c.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),e}();t.exports=u},function(t,e){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o<r;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,a=o.length;i<a;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},t.exports=n},function(t,e,n){var d=n(5),h=n(6);t.exports=function(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!d.string(e))throw new TypeError("Second argument must be a String");if(!d.fn(n))throw new TypeError("Third argument must be a Function");if(d.node(t))return s=e,f=n,(l=t).addEventListener(s,f),{destroy:function(){l.removeEventListener(s,f)}};if(d.nodeList(t))return a=t,c=e,u=n,Array.prototype.forEach.call(a,function(t){t.addEventListener(c,u)}),{destroy:function(){Array.prototype.forEach.call(a,function(t){t.removeEventListener(c,u)})}};if(d.string(t))return o=t,r=e,i=n,h(document.body,o,r,i);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");var o,r,i,a,c,u,l,s,f}},function(t,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},function(t,e,n){var a=n(7);function i(t,e,n,o,r){var i=function(e,n,t,o){return function(t){t.delegateTarget=a(t.target,n),t.delegateTarget&&o.call(e,t)}}.apply(this,arguments);return t.addEventListener(n,i,r),{destroy:function(){t.removeEventListener(n,i,r)}}}t.exports=function(t,e,n,o,r){return"function"==typeof t.addEventListener?i.apply(null,arguments):"function"==typeof n?i.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return i(t,e,n,o,r)}))}},function(t,e){if("undefined"!=typeof Element&&!Element.prototype.matches){var n=Element.prototype;n.matches=n.matchesSelector||n.mozMatchesSelector||n.msMatchesSelector||n.oMatchesSelector||n.webkitMatchesSelector}t.exports=function(t,e){for(;t&&9!==t.nodeType;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}}])}); \ No newline at end of file
diff --git a/book/pt-br/clipboard-1626706a.min.js.gz b/book/pt-br/clipboard-1626706a.min.js.gz
deleted file mode 100644
index ff99056..0000000
--- a/book/pt-br/clipboard-1626706a.min.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/commands/create.html b/book/pt-br/commands/create.html
deleted file mode 100644
index 992c33d..0000000
--- a/book/pt-br/commands/create.html
+++ /dev/null
@@ -1,329 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>create - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="../favicon-bfbdfe47.png">
- <link rel="stylesheet" href="../css/variables-8adf115d.css">
- <link rel="stylesheet" href="../css/general-2459343d.css">
- <link rel="stylesheet" href="../css/chrome-ae938929.css">
- <link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="../theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "../";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "../searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="../toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="../print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="tes-create"><a class="header" href="#tes-create">tes create</a></h1>
-<p>Criar uma tessera a partir de um diretório de arquivos.</p>
-<h2 id="uso"><a class="header" href="#uso">Uso</a></h2>
-<pre><code class="language-bash">tes create &lt;CAMINHO&gt; [OPÇÕES]
-</code></pre>
-<h2 id="argumentos"><a class="header" href="#argumentos">Argumentos</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argumento</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;CAMINHO&gt;</code></td><td>Diretório contendo os arquivos a incluir</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="opções"><a class="header" href="#opções">Opções</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opção</th><th>Descrição</th><th>Padrão</th></tr>
-</thead>
-<tbody>
-<tr><td><code>-n, --non-interactive</code></td><td>Pular prompts</td><td>desativado</td></tr>
-<tr><td><code>--dry-run</code></td><td>Pré-visualizar o que seria incluído</td><td>desativado</td></tr>
-<tr><td><code>--visibility &lt;VALOR&gt;</code></td><td>Nível de visibilidade: <code>public</code>, <code>private</code>, <code>circle</code></td><td><code>public</code></td></tr>
-<tr><td><code>--language &lt;CÓDIGO&gt;</code></td><td>Código de idioma (ex.: <code>en</code>, <code>pt-BR</code>)</td><td><code>en</code></td></tr>
-<tr><td><code>--tags &lt;LISTA&gt;</code></td><td>Tags separadas por vírgula</td><td>nenhuma</td></tr>
-<tr><td><code>--location &lt;DESC&gt;</code></td><td>Descrição do local</td><td>nenhuma</td></tr>
-<tr><td><code>--data-dir &lt;CAMINHO&gt;</code></td><td>Diretório base para armazenamento de dados</td><td><code>~/.tesseras</code></td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="formatos-de-arquivo-suportados"><a class="header" href="#formatos-de-arquivo-suportados">Formatos de arquivo suportados</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Extensão</th><th>Tipo</th><th>Tipo de memória</th></tr>
-</thead>
-<tbody>
-<tr><td><code>.jpg</code>, <code>.jpeg</code></td><td>Imagem (JPEG)</td><td>Momento</td></tr>
-<tr><td><code>.png</code></td><td>Imagem (PNG)</td><td>Momento</td></tr>
-<tr><td><code>.wav</code></td><td>Áudio (WAV PCM)</td><td>Momento</td></tr>
-<tr><td><code>.webm</code></td><td>Vídeo (WebM)</td><td>Momento</td></tr>
-<tr><td><code>.txt</code></td><td>Texto puro (UTF-8)</td><td>Reflexão</td></tr>
-</tbody>
-</table>
-</div>
-<p>Arquivos com outras extensões são ignorados.</p>
-<h2 id="inferência-de-tipo-de-memória"><a class="header" href="#inferência-de-tipo-de-memória">Inferência de tipo de memória</a></h2>
-<p>O comando atribui automaticamente um tipo de memória baseado no formato do arquivo:</p>
-<ul>
-<li><strong>Arquivos de texto</strong> (<code>.txt</code>) são classificados como <strong>Reflexão</strong> — pensamentos, crenças ou opiniões</li>
-<li><strong>Todos os outros formatos</strong> são classificados como <strong>Momento</strong> — uma foto, gravação ou vídeo de algo acontecendo</li>
-</ul>
-<h2 id="exemplos"><a class="header" href="#exemplos">Exemplos</a></h2>
-<h3 id="pré-visualizar-antes-de-criar"><a class="header" href="#pré-visualizar-antes-de-criar">Pré-visualizar antes de criar</a></h3>
-<pre><code class="language-bash">tes create ./minhas-fotos --dry-run
-</code></pre>
-<h3 id="criar-com-metadados"><a class="header" href="#criar-com-metadados">Criar com metadados</a></h3>
-<pre><code class="language-bash">tes create ./ferias-2026 \
- --tags "ferias,verao,praia" \
- --location "Florianópolis, Brasil" \
- --language pt-BR \
- --visibility public
-</code></pre>
-<h3 id="modo-não-interativo"><a class="header" href="#modo-não-interativo">Modo não-interativo</a></h3>
-<pre><code class="language-bash">tes create ./diario --non-interactive --tags "cotidiano"
-</code></pre>
-<h2 id="níveis-de-visibilidade"><a class="header" href="#níveis-de-visibilidade">Níveis de visibilidade</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Nível</th><th>Quem pode acessar</th></tr>
-</thead>
-<tbody>
-<tr><td><code>public</code></td><td>Qualquer pessoa (padrão)</td></tr>
-<tr><td><code>private</code></td><td>Apenas você (e herdeiros designados)</td></tr>
-<tr><td><code>circle</code></td><td>Pessoas explicitamente escolhidas</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="o-que-acontece-internamente"><a class="header" href="#o-que-acontece-internamente">O que acontece internamente</a></h2>
-<ol>
-<li>Varre o diretório em busca de arquivos suportados</li>
-<li>Calcula um hash BLAKE3 para cada arquivo</li>
-<li>Atribui um tipo de memória baseado na extensão do arquivo</li>
-<li>Gera um MANIFEST listando todos os arquivos com seus checksums</li>
-<li>Assina o MANIFEST com sua chave privada Ed25519</li>
-<li>Armazena os arquivos e metadados no banco de dados local</li>
-<li>Exibe o hash de conteúdo que identifica unicamente esta tessera</li>
-</ol>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="../commands/init.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/verify.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="../commands/init.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/verify.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="../elasticlunr-ef4e11c1.min.js"></script>
- <script src="../mark-09e88c2c.min.js"></script>
- <script src="../searcher-c2a407aa.js"></script>
-
- <script src="../clipboard-1626706a.min.js"></script>
- <script src="../highlight-abc7f01d.js"></script>
- <script src="../book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/commands/create.html.gz b/book/pt-br/commands/create.html.gz
deleted file mode 100644
index ec31381..0000000
--- a/book/pt-br/commands/create.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/commands/export.html b/book/pt-br/commands/export.html
deleted file mode 100644
index 3a74307..0000000
--- a/book/pt-br/commands/export.html
+++ /dev/null
@@ -1,307 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>export - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="../favicon-bfbdfe47.png">
- <link rel="stylesheet" href="../css/variables-8adf115d.css">
- <link rel="stylesheet" href="../css/general-2459343d.css">
- <link rel="stylesheet" href="../css/chrome-ae938929.css">
- <link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="../theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "../";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "../searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="../toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="../print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="tes-export"><a class="header" href="#tes-export">tes export</a></h1>
-<p>Exportar uma tessera como um diretório autocontido.</p>
-<h2 id="uso"><a class="header" href="#uso">Uso</a></h2>
-<pre><code class="language-bash">tes export &lt;HASH&gt; &lt;DESTINO&gt;
-</code></pre>
-<h2 id="argumentos"><a class="header" href="#argumentos">Argumentos</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argumento</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;HASH&gt;</code></td><td>Hash de conteúdo da tessera (64 caracteres hexadecimais)</td></tr>
-<tr><td><code>&lt;DESTINO&gt;</code></td><td>Diretório de destino</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="opções"><a class="header" href="#opções">Opções</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opção</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;CAMINHO&gt;</code></td><td>Diretório base para armazenamento de dados (padrão: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="estrutura-de-saída"><a class="header" href="#estrutura-de-saída">Estrutura de saída</a></h2>
-<p>A exportação cria um diretório chamado <code>tessera-&lt;hash&gt;</code> dentro do destino:</p>
-<pre><code>tessera-9f2c4a1b.../
-├── MANIFEST # Índice em texto puro com checksums
-├── README.decode # Instruções de decodificação legíveis por humanos
-├── identity/
-│ ├── creator.pub.ed25519 # Chave pública do criador
-│ └── signature.ed25519.sig # Assinatura do MANIFEST
-├── memories/
-│ ├── &lt;hash-conteudo&gt;/
-│ │ ├── media.jpg # Arquivo de mídia principal
-│ │ ├── context.txt # Contexto humano em UTF-8 puro
-│ │ └── meta.json # Metadados estruturados
-│ └── .../
-├── schema/
-│ └── v1.json # Esquema JSON para validação de metadados
-└── decode/
- ├── formats.txt # Explicação de todos os formatos usados
- ├── jpeg.txt # Como decodificar JPEG
- ├── wav.txt # Como decodificar WAV
- └── json.txt # Como decodificar JSON
-</code></pre>
-<h2 id="exemplo"><a class="header" href="#exemplo">Exemplo</a></h2>
-<pre><code class="language-bash">tes export 9f2c4a1b3e7d8f0cabc123def4567890... ./backup
-</code></pre>
-<pre><code>Exported to ./backup/tessera-9f2c4a1b3e7d8f0cabc123def4567890...
-</code></pre>
-<h2 id="característica-principal-autocontido"><a class="header" href="#característica-principal-autocontido">Característica principal: autocontido</a></h2>
-<p>O diretório exportado é projetado para ser legível <strong>sem o software Tesseras</strong>. Ele inclui:</p>
-<ul>
-<li><strong>MANIFEST</strong> — um arquivo em texto puro listando cada arquivo com seu checksum BLAKE3, legível por qualquer editor de texto</li>
-<li><strong>README.decode</strong> — instruções legíveis por humanos para compreender o conteúdo</li>
-<li><strong>decode/</strong> — explicações detalhadas de cada formato de arquivo usado (JPEG, WAV, JSON, UTF-8)</li>
-</ul>
-<p>Isso significa que alguém daqui a milhares de anos, sem conhecimento algum sobre o Tesseras, ainda pode entender e acessar as memórias.</p>
-<h2 id="casos-de-uso"><a class="header" href="#casos-de-uso">Casos de uso</a></h2>
-<ul>
-<li><strong>Backup</strong> — exporte para um disco externo, pendrive ou armazenamento em nuvem</li>
-<li><strong>Compartilhamento</strong> — entregue a alguém uma cópia completa de uma tessera</li>
-<li><strong>Arquivamento</strong> — armazene em mídia de escrita única (DVD, Blu-ray, fita)</li>
-<li><strong>Migração</strong> — mova tesseras entre máquinas sem precisar do banco de dados</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="../commands/verify.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/list.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="../commands/verify.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/list.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="../elasticlunr-ef4e11c1.min.js"></script>
- <script src="../mark-09e88c2c.min.js"></script>
- <script src="../searcher-c2a407aa.js"></script>
-
- <script src="../clipboard-1626706a.min.js"></script>
- <script src="../highlight-abc7f01d.js"></script>
- <script src="../book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/commands/export.html.gz b/book/pt-br/commands/export.html.gz
deleted file mode 100644
index f46f7e5..0000000
--- a/book/pt-br/commands/export.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/commands/init.html b/book/pt-br/commands/init.html
deleted file mode 100644
index 1c6a1c9..0000000
--- a/book/pt-br/commands/init.html
+++ /dev/null
@@ -1,288 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>init - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="../favicon-bfbdfe47.png">
- <link rel="stylesheet" href="../css/variables-8adf115d.css">
- <link rel="stylesheet" href="../css/general-2459343d.css">
- <link rel="stylesheet" href="../css/chrome-ae938929.css">
- <link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="../theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "../";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "../searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="../toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="../print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="tes-init"><a class="header" href="#tes-init">tes init</a></h1>
-<p>Inicializar identidade e banco de dados local.</p>
-<h2 id="uso"><a class="header" href="#uso">Uso</a></h2>
-<pre><code class="language-bash">tes init
-</code></pre>
-<h2 id="descrição"><a class="header" href="#descrição">Descrição</a></h2>
-<p>Configura seu ambiente Tesseras local. Este é o primeiro comando que você deve executar após instalar o Tesseras.</p>
-<p>O comando cria:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Caminho</th><th>Conteúdo</th></tr>
-</thead>
-<tbody>
-<tr><td><code>~/.tesseras/identity/</code></td><td>Par de chaves Ed25519 para assinar tesseras</td></tr>
-<tr><td><code>~/.tesseras/db/</code></td><td>Banco de dados SQLite para indexação</td></tr>
-<tr><td><code>~/.tesseras/blobs/</code></td><td>Armazenamento de blobs para arquivos de memória</td></tr>
-<tr><td><code>~/.tesseras/config.toml</code></td><td>Arquivo de configuração</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="opções"><a class="header" href="#opções">Opções</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opção</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;CAMINHO&gt;</code></td><td>Diretório base para armazenamento de dados (padrão: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="idempotente"><a class="header" href="#idempotente">Idempotente</a></h2>
-<p>Executar <code>init</code> novamente é seguro. Se uma identidade já existe, ela é preservada:</p>
-<pre><code class="language-bash">tes init
-</code></pre>
-<pre><code>Ed25519 identity already exists
-Database initialized
-Tesseras initialized at /home/user/.tesseras
-</code></pre>
-<h2 id="diretório-de-dados-personalizado"><a class="header" href="#diretório-de-dados-personalizado">Diretório de dados personalizado</a></h2>
-<pre><code class="language-bash">tes --data-dir /mnt/usb/tesseras init
-</code></pre>
-<p>Isso cria toda a estrutura de diretórios em <code>/mnt/usb/tesseras/</code> ao invés do local padrão.</p>
-<h2 id="o-que-acontece-internamente"><a class="header" href="#o-que-acontece-internamente">O que acontece internamente</a></h2>
-<ol>
-<li>Cria a estrutura de diretórios (<code>identity/</code>, <code>db/</code>, <code>blobs/</code>)</li>
-<li>Gera um par de chaves Ed25519 (a chave privada permanece local, a chave pública identifica você)</li>
-<li>Executa as migrações SQLite para configurar o esquema do banco de dados</li>
-<li>Escreve um <code>config.toml</code> padrão</li>
-</ol>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="../quick-start.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/create.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="../quick-start.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/create.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="../elasticlunr-ef4e11c1.min.js"></script>
- <script src="../mark-09e88c2c.min.js"></script>
- <script src="../searcher-c2a407aa.js"></script>
-
- <script src="../clipboard-1626706a.min.js"></script>
- <script src="../highlight-abc7f01d.js"></script>
- <script src="../book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/commands/init.html.gz b/book/pt-br/commands/init.html.gz
deleted file mode 100644
index 71a0cf6..0000000
--- a/book/pt-br/commands/init.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/commands/list.html b/book/pt-br/commands/list.html
deleted file mode 100644
index dd85099..0000000
--- a/book/pt-br/commands/list.html
+++ /dev/null
@@ -1,283 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>list - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="../favicon-bfbdfe47.png">
- <link rel="stylesheet" href="../css/variables-8adf115d.css">
- <link rel="stylesheet" href="../css/general-2459343d.css">
- <link rel="stylesheet" href="../css/chrome-ae938929.css">
- <link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="../theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "../";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "../searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="../toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="../print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="tes-list"><a class="header" href="#tes-list">tes list</a></h1>
-<p>Listar todas as tesseras locais.</p>
-<h2 id="uso"><a class="header" href="#uso">Uso</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<h2 id="opções"><a class="header" href="#opções">Opções</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opção</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;CAMINHO&gt;</code></td><td>Diretório base para armazenamento de dados (padrão: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="saída"><a class="header" href="#saída">Saída</a></h2>
-<p>Exibe uma tabela com as seguintes colunas:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Coluna</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Hash</strong></td><td>Primeiros 16 caracteres do hash de conteúdo</td></tr>
-<tr><td><strong>Created</strong></td><td>Data de criação (AAAA-MM-DD)</td></tr>
-<tr><td><strong>Memories</strong></td><td>Número de memórias na tessera</td></tr>
-<tr><td><strong>Size</strong></td><td>Tamanho total (B, KB, MB ou GB)</td></tr>
-<tr><td><strong>Visibility</strong></td><td>Nível de visibilidade (public, private ou circle)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="exemplo"><a class="header" href="#exemplo">Exemplo</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>Hash Created Memories Size Visibility
-9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public
-a3b7c2d9e4f01823 2026-02-10 1 12 KB private
-f8e7d6c5b4a39201 2026-01-28 12 4 MB public
-</code></pre>
-<h2 id="banco-de-dados-vazio"><a class="header" href="#banco-de-dados-vazio">Banco de dados vazio</a></h2>
-<p>Se nenhuma tessera foi criada ainda:</p>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>No tesseras found.
-</code></pre>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="../commands/export.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../running-a-node.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="../commands/export.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../running-a-node.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="../elasticlunr-ef4e11c1.min.js"></script>
- <script src="../mark-09e88c2c.min.js"></script>
- <script src="../searcher-c2a407aa.js"></script>
-
- <script src="../clipboard-1626706a.min.js"></script>
- <script src="../highlight-abc7f01d.js"></script>
- <script src="../book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/commands/list.html.gz b/book/pt-br/commands/list.html.gz
deleted file mode 100644
index f94f885..0000000
--- a/book/pt-br/commands/list.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/commands/verify.html b/book/pt-br/commands/verify.html
deleted file mode 100644
index b340413..0000000
--- a/book/pt-br/commands/verify.html
+++ /dev/null
@@ -1,307 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>verify - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="../favicon-bfbdfe47.png">
- <link rel="stylesheet" href="../css/variables-8adf115d.css">
- <link rel="stylesheet" href="../css/general-2459343d.css">
- <link rel="stylesheet" href="../css/chrome-ae938929.css">
- <link rel="stylesheet" href="../css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="../fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="../highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="../tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="../ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="../theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "../";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "../searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="../toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="../print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="tes-verify"><a class="header" href="#tes-verify">tes verify</a></h1>
-<p>Verificar integridade de uma tessera armazenada.</p>
-<h2 id="uso"><a class="header" href="#uso">Uso</a></h2>
-<pre><code class="language-bash">tes verify &lt;HASH&gt;
-</code></pre>
-<h2 id="argumentos"><a class="header" href="#argumentos">Argumentos</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argumento</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;HASH&gt;</code></td><td>Hash de conteúdo da tessera (64 caracteres hexadecimais)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="opções"><a class="header" href="#opções">Opções</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opção</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;CAMINHO&gt;</code></td><td>Diretório base para armazenamento de dados (padrão: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="o-que-é-verificado"><a class="header" href="#o-que-é-verificado">O que é verificado</a></h2>
-<ol>
-<li><strong>Validade da assinatura</strong> — verifica a assinatura Ed25519 sobre o MANIFEST</li>
-<li><strong>Integridade dos arquivos</strong> — recalcula o hash BLAKE3 de cada arquivo e compara com o MANIFEST</li>
-</ol>
-<h2 id="códigos-de-saída"><a class="header" href="#códigos-de-saída">Códigos de saída</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Código</th><th>Significado</th></tr>
-</thead>
-<tbody>
-<tr><td><code>0</code></td><td>Verificação passou — todos os arquivos intactos, assinatura válida</td></tr>
-<tr><td><code>1</code></td><td>Verificação falhou — arquivos corrompidos ou assinatura inválida</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="exemplos"><a class="header" href="#exemplos">Exemplos</a></h2>
-<h3 id="verificação-bem-sucedida"><a class="header" href="#verificação-bem-sucedida">Verificação bem-sucedida</a></h3>
-<pre><code class="language-bash">tes verify 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-</code></pre>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-Signature: VALID
- [OK] memories/a1b2c3d4/media.jpg
- [OK] memories/e5f6a7b8/media.txt
- [OK] memories/c9d0e1f2/media.wav
-Verification: PASSED
-</code></pre>
-<h3 id="verificação-com-falha"><a class="header" href="#verificação-com-falha">Verificação com falha</a></h3>
-<p>Se um arquivo foi modificado ou corrompido:</p>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-Signature: VALID
- [OK] memories/a1b2c3d4/media.jpg
- [FAILED] memories/e5f6a7b8/media.txt
- [OK] memories/c9d0e1f2/media.wav
-Verification: FAILED
-</code></pre>
-<h2 id="casos-de-uso"><a class="header" href="#casos-de-uso">Casos de uso</a></h2>
-<ul>
-<li><strong>Verificações rotineiras de integridade</strong> — verifique periodicamente que suas tesseras armazenadas não foram corrompidas</li>
-<li><strong>Após transferência</strong> — verifique após copiar tesseras para um novo dispositivo ou meio de armazenamento</li>
-<li><strong>Verificação de confiança</strong> — confirme que uma tessera recebida de outra pessoa não foi adulterada</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="../commands/create.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/export.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="../commands/create.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="../commands/export.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="../elasticlunr-ef4e11c1.min.js"></script>
- <script src="../mark-09e88c2c.min.js"></script>
- <script src="../searcher-c2a407aa.js"></script>
-
- <script src="../clipboard-1626706a.min.js"></script>
- <script src="../highlight-abc7f01d.js"></script>
- <script src="../book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/commands/verify.html.gz b/book/pt-br/commands/verify.html.gz
deleted file mode 100644
index d2015d9..0000000
--- a/book/pt-br/commands/verify.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/configuration.html b/book/pt-br/configuration.html
deleted file mode 100644
index 353a08d..0000000
--- a/book/pt-br/configuration.html
+++ /dev/null
@@ -1,390 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Configuracao - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="configuracao"><a class="header" href="#configuracao">Configuracao</a></h1>
-<p>O daemon pode ser configurado via um arquivo TOML. Passe o caminho com <code>--config</code>:</p>
-<pre><code class="language-bash">tesseras-daemon --config /etc/tesseras/config.toml
-</code></pre>
-<p>Se nenhum arquivo de configuracao for fornecido, o daemon usa padroes sensiveis. Opcoes CLI (<code>--listen</code>, <code>--bootstrap</code>, <code>--data-dir</code>) sobrescrevem os valores correspondentes da configuracao.</p>
-<h2 id="exemplo-completo"><a class="header" href="#exemplo-completo">Exemplo completo</a></h2>
-<pre><code class="language-toml">[node]
-data_dir = "~/.local/share/tesseras"
-listen_addr = "0.0.0.0:4433"
-
-[dht]
-k = 20
-alpha = 3
-bucket_refresh_interval_secs = 3600
-republish_interval_secs = 3600
-pointer_ttl_secs = 86400
-max_stored_pointers = 100000
-ping_failure_threshold = 3
-
-[bootstrap]
-dns_domain = "_tesseras._udp.tesseras.net"
-hardcoded = [
- "boot1.tesseras.net:4433",
- "boot2.tesseras.net:4433",
-]
-
-[network]
-enable_mdns = true
-
-[observability]
-metrics_addr = "127.0.0.1:9190"
-log_format = "json"
-</code></pre>
-<h2 id="secoes"><a class="header" href="#secoes">Secoes</a></h2>
-<h3 id="node"><a class="header" href="#node"><code>[node]</code></a></h3>
-<p>Configuracoes basicas do no.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Chave</th><th>Tipo</th><th>Padrao</th><th>Descricao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>data_dir</code></td><td>caminho</td><td>Especifico da plataforma</td><td>Onde armazenar identidade, banco de dados e blobs</td></tr>
-<tr><td><code>listen_addr</code></td><td>endereco</td><td><code>0.0.0.0:4433</code></td><td>Endereco do listener QUIC</td></tr>
-</tbody>
-</table>
-</div>
-<p>O <code>data_dir</code> padrao e <code>~/.local/share/tesseras</code> no Linux e <code>~/Library/Application Support/tesseras</code> no macOS.</p>
-<h3 id="dht"><a class="header" href="#dht"><code>[dht]</code></a></h3>
-<p>Parametros de ajuste da DHT Kademlia. Os padroes funcionam bem para a maioria das implantacoes.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Chave</th><th>Tipo</th><th>Padrao</th><th>Descricao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>k</code></td><td>inteiro</td><td><code>20</code></td><td>Maximo de entradas por bucket da tabela de roteamento</td></tr>
-<tr><td><code>alpha</code></td><td>inteiro</td><td><code>3</code></td><td>Paralelismo para buscas iterativas</td></tr>
-<tr><td><code>bucket_refresh_interval_secs</code></td><td>inteiro</td><td><code>3600</code></td><td>Com que frequencia atualizar buckets da tabela de roteamento (segundos)</td></tr>
-<tr><td><code>republish_interval_secs</code></td><td>inteiro</td><td><code>3600</code></td><td>Com que frequencia republicar ponteiros armazenados (segundos)</td></tr>
-<tr><td><code>pointer_ttl_secs</code></td><td>inteiro</td><td><code>86400</code></td><td>Quanto tempo manter um ponteiro antes de expirar (segundos)</td></tr>
-<tr><td><code>max_stored_pointers</code></td><td>inteiro</td><td><code>100000</code></td><td>Numero maximo de ponteiros armazenados localmente</td></tr>
-<tr><td><code>ping_failure_threshold</code></td><td>inteiro</td><td><code>3</code></td><td>Quantas falhas consecutivas de ping antes de remover um par</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="bootstrap"><a class="header" href="#bootstrap"><code>[bootstrap]</code></a></h3>
-<p>Como o no descobre seus primeiros pares ao entrar na rede.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Chave</th><th>Tipo</th><th>Padrao</th><th>Descricao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>dns_domain</code></td><td>string</td><td><code>_tesseras._udp.tesseras.net</code></td><td>Dominio DNS para descoberta de pares via registros TXT</td></tr>
-<tr><td><code>hardcoded</code></td><td>lista de strings</td><td><code>["boot1.tesseras.net:4433", "boot2.tesseras.net:4433"]</code></td><td>Enderecos de bootstrap de fallback</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="network"><a class="header" href="#network"><code>[network]</code></a></h3>
-<p>Funcionalidades de nivel de rede.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Chave</th><th>Tipo</th><th>Padrao</th><th>Descricao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>enable_mdns</code></td><td>booleano</td><td><code>true</code></td><td>Habilitar descoberta na rede local via mDNS</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="observability"><a class="header" href="#observability"><code>[observability]</code></a></h3>
-<p>Monitoramento e logging.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Chave</th><th>Tipo</th><th>Padrao</th><th>Descricao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>metrics_addr</code></td><td>endereco</td><td><code>127.0.0.1:9190</code></td><td>Endereco para o endpoint de metricas Prometheus</td></tr>
-<tr><td><code>log_format</code></td><td>string</td><td><code>json</code></td><td>Formato de saida de log (<code>json</code> ou <code>text</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="suporte-a-ipv6"><a class="header" href="#suporte-a-ipv6">Suporte a IPv6</a></h2>
-<p>Tesseras suporta IPv6 nativamente. Os campos <code>listen_addr</code> e <code>listen_addrs</code> aceitam tanto enderecos IPv4 quanto IPv6.</p>
-<h3 id="escutando-em-ipv6"><a class="header" href="#escutando-em-ipv6">Escutando em IPv6</a></h3>
-<p>Para escutar em todas as interfaces IPv6:</p>
-<pre><code class="language-toml">[node]
-listen_addr = "[::]:4433"
-</code></pre>
-<p>No Linux e na maioria dos BSDs, vincular a <code>[::]</code> tambem aceita conexoes IPv4 (dual-stack) por padrao. Em alguns sistemas (notavelmente OpenBSD), <code>[::]</code> e somente IPv6 porque <code>IPV6_V6ONLY</code> e habilitado por padrao. Para garantir tanto IPv4 quanto IPv6 em todas as plataformas, use <code>listen_addrs</code> com enderecos explicitos:</p>
-<pre><code class="language-toml">[node]
-listen_addrs = ["0.0.0.0:4433", "[::]:4433"]
-</code></pre>
-<p>Para loopback IPv6 apenas (testes):</p>
-<pre><code class="language-toml">[node]
-listen_addr = "[::1]:4433"
-</code></pre>
-<h3 id="bootstrap-com-ipv6"><a class="header" href="#bootstrap-com-ipv6">Bootstrap com IPv6</a></h3>
-<p>Enderecos de bootstrap podem ser IPv6:</p>
-<pre><code class="language-toml">[bootstrap]
-hardcoded = [
- "boot1.tesseras.net:4433",
- "[2001:db8::1]:4433",
-]
-</code></pre>
-<p>Hostnames DNS com registros A e AAAA sao resolvidos para todos os enderecos, entao o daemon se conectara pelo protocolo que estiver acessivel.</p>
-<h3 id="comportamento-de-ipv6_v6only-por-so"><a class="header" href="#comportamento-de-ipv6_v6only-por-so">Comportamento de <code>IPV6_V6ONLY</code> por SO</a></h3>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>SO</th><th><code>[::]</code> aceita IPv4?</th><th>Notas</th></tr>
-</thead>
-<tbody>
-<tr><td>Linux</td><td>Sim (dual-stack)</td><td><code>IPV6_V6ONLY</code> padrao 0</td></tr>
-<tr><td>macOS</td><td>Sim (dual-stack)</td><td><code>IPV6_V6ONLY</code> padrao 0</td></tr>
-<tr><td>FreeBSD</td><td>Sim (dual-stack)</td><td><code>IPV6_V6ONLY</code> padrao 0</td></tr>
-<tr><td>OpenBSD</td><td>Nao (somente IPv6)</td><td><code>IPV6_V6ONLY</code> sempre 1</td></tr>
-<tr><td>Windows</td><td>Sim (dual-stack)</td><td><code>IPV6_V6ONLY</code> padrao 0</td></tr>
-</tbody>
-</table>
-</div>
-<p>Se precisar de controle explicito, use <code>listen_addrs</code> com um endereco IPv4 e um IPv6.</p>
-<h2 id="configuracao-minima"><a class="header" href="#configuracao-minima">Configuracao minima</a></h2>
-<p>A maioria dos usuarios nao precisa de um arquivo de configuracao. Se precisar, uma configuracao minima sobrescrevendo apenas o necessario e suficiente:</p>
-<pre><code class="language-toml">[node]
-listen_addr = "0.0.0.0:5000"
-
-[bootstrap]
-hardcoded = ["192.168.1.10:4433"]
-</code></pre>
-<p>Todos os outros valores usam seus padroes.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="running-a-node.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="network-concepts.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="running-a-node.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="network-concepts.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/configuration.html.gz b/book/pt-br/configuration.html.gz
deleted file mode 100644
index 98dffa9..0000000
--- a/book/pt-br/configuration.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/css/chrome-ae938929.css b/book/pt-br/css/chrome-ae938929.css
deleted file mode 100644
index bab3889..0000000
--- a/book/pt-br/css/chrome-ae938929.css
+++ /dev/null
@@ -1,756 +0,0 @@
-/* CSS for UI elements (a.k.a. chrome) */
-
-html {
- scrollbar-color: var(--scrollbar) transparent;
-}
-#mdbook-searchresults a,
-.content a:link,
-a:visited,
-a > .hljs {
- color: var(--links);
-}
-
-/*
- mdbook-body-container is necessary because mobile browsers don't seem to like
- overflow-x on the body tag when there is a <meta name="viewport"> tag.
-*/
-#mdbook-body-container {
- /*
- This is used when the sidebar pushes the body content off the side of
- the screen on small screens. Without it, dragging on mobile Safari
- will want to reposition the viewport in a weird way.
- */
- overflow-x: clip;
-}
-
-/* Menu Bar */
-
-#mdbook-menu-bar,
-#mdbook-menu-bar-hover-placeholder {
- z-index: 101;
- margin: auto calc(0px - var(--page-padding));
-}
-#mdbook-menu-bar {
- position: relative;
- display: flex;
- flex-wrap: wrap;
- background-color: var(--bg);
- border-block-end-color: var(--bg);
- border-block-end-width: 1px;
- border-block-end-style: solid;
-}
-#mdbook-menu-bar.sticky,
-#mdbook-menu-bar-hover-placeholder:hover + #mdbook-menu-bar,
-#mdbook-menu-bar:hover,
-html.sidebar-visible #mdbook-menu-bar {
- position: -webkit-sticky;
- position: sticky;
- top: 0 !important;
-}
-#mdbook-menu-bar-hover-placeholder {
- position: sticky;
- position: -webkit-sticky;
- top: 0;
- height: var(--menu-bar-height);
-}
-#mdbook-menu-bar.bordered {
- border-block-end-color: var(--table-border-color);
-}
-#mdbook-menu-bar .fa-svg, #mdbook-menu-bar .icon-button {
- position: relative;
- padding: 0 8px;
- z-index: 10;
- line-height: var(--menu-bar-height);
- cursor: pointer;
- transition: color 0.5s;
-}
-@media only screen and (max-width: 420px) {
- #mdbook-menu-bar .fa-svg, #mdbook-menu-bar .icon-button {
- padding: 0 5px;
- }
-}
-
-.icon-button {
- border: none;
- background: none;
- padding: 0;
- color: inherit;
-}
-.icon-button .fa-svg {
- margin: 0;
-}
-
-.right-buttons {
- margin: 0 15px;
-}
-.right-buttons a {
- text-decoration: none;
-}
-
-.left-buttons {
- display: flex;
- margin: 0 5px;
-}
-html:not(.js) .left-buttons button {
- display: none;
-}
-
-.menu-title {
- display: inline-block;
- font-weight: 200;
- font-size: 2.4rem;
- line-height: var(--menu-bar-height);
- text-align: center;
- margin: 0;
- flex: 1;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.menu-title {
- cursor: pointer;
-}
-
-.menu-bar,
-.menu-bar:visited,
-.nav-chapters,
-.nav-chapters:visited,
-.mobile-nav-chapters,
-.mobile-nav-chapters:visited,
-.menu-bar .icon-button,
-.menu-bar a .fa-svg {
- color: var(--icons);
-}
-
-.menu-bar .fa-svg:hover,
-.menu-bar .icon-button:hover,
-.nav-chapters:hover,
-.mobile-nav-chapters .fa-svg:hover {
- color: var(--icons-hover);
-}
-
-/* Nav Icons */
-
-.nav-chapters {
- font-size: 2.5em;
- text-align: center;
- text-decoration: none;
-
- position: fixed;
- top: 0;
- bottom: 0;
- margin: 0;
- max-width: 150px;
- min-width: 90px;
-
- display: flex;
- justify-content: center;
- align-content: center;
- flex-direction: column;
-
- transition: color 0.5s, background-color 0.5s;
-}
-
-.nav-chapters:hover {
- text-decoration: none;
- background-color: var(--theme-hover);
- transition: background-color 0.15s, color 0.15s;
-}
-
-.nav-wrapper {
- margin-block-start: 50px;
- display: none;
-}
-
-.mobile-nav-chapters {
- font-size: 2.5em;
- text-align: center;
- text-decoration: none;
- width: 90px;
- border-radius: 5px;
- background-color: var(--sidebar-bg);
-}
-
-/* Only Firefox supports flow-relative values */
-.previous { float: left; }
-[dir=rtl] .previous { float: right; }
-
-/* Only Firefox supports flow-relative values */
-.next {
- float: right;
- right: var(--page-padding);
-}
-[dir=rtl] .next {
- float: left;
- right: unset;
- left: var(--page-padding);
-}
-
-@media only screen and (max-width: 1080px) {
- .nav-wide-wrapper { display: none; }
- .nav-wrapper { display: block; }
-}
-
-/* sidebar-visible */
-@media only screen and (max-width: 1380px) {
- #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; }
- #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; }
-}
-
-/* Inline code */
-
-:not(pre) > .hljs {
- display: inline;
- padding: 0.1em 0.3em;
- border-radius: 3px;
-}
-
-:not(pre):not(a) > .hljs {
- color: var(--inline-code-color);
- overflow-x: initial;
-}
-
-a:hover > .hljs {
- text-decoration: underline;
-}
-
-pre {
- position: relative;
-}
-pre > .buttons {
- position: absolute;
- z-index: 100;
- right: 0px;
- top: 2px;
- margin: 0px;
- padding: 2px 0px;
-
- color: var(--sidebar-fg);
- cursor: pointer;
- visibility: hidden;
- opacity: 0;
- transition: visibility 0.1s linear, opacity 0.1s linear;
-}
-pre:hover > .buttons {
- visibility: visible;
- opacity: 1
-}
-pre > .buttons :hover {
- color: var(--sidebar-active);
- border-color: var(--icons-hover);
- background-color: var(--theme-hover);
-}
-pre > .buttons button {
- cursor: inherit;
- margin: 0px 5px;
- padding: 2px 3px 0px 4px;
- font-size: 23px;
-
- border-style: solid;
- border-width: 1px;
- border-radius: 4px;
- border-color: var(--icons);
- background-color: var(--theme-popup-bg);
- transition: 100ms;
- transition-property: color,border-color,background-color;
- color: var(--icons);
-}
-
-pre > .buttons button.clip-button {
- padding: 2px 4px 0px 6px;
-}
-pre > .buttons button.clip-button::before {
- /* clipboard image from octicons (https://github.com/primer/octicons/tree/v2.0.0) MIT license
- */
- content: url('data:image/svg+xml,<svg width="21" height="20" viewBox="0 0 24 25" \
-xmlns="http://www.w3.org/2000/svg" aria-label="Copy to clipboard">\
-<path d="M18 20h2v3c0 1-1 2-2 2H2c-.998 0-2-1-2-2V5c0-.911.755-1.667 1.667-1.667h5A3.323 3.323 0 \
-0110 0a3.323 3.323 0 013.333 3.333h5C19.245 3.333 20 4.09 20 5v8.333h-2V9H2v14h16v-3zM3 \
-7h14c0-.911-.793-1.667-1.75-1.667H13.5c-.957 0-1.75-.755-1.75-1.666C11.75 2.755 10.957 2 10 \
-2s-1.75.755-1.75 1.667c0 .911-.793 1.666-1.75 1.666H4.75C3.793 5.333 3 6.09 3 7z"/>\
-<path d="M4 19h6v2H4zM12 11H4v2h8zM4 17h4v-2H4zM15 15v-3l-4.5 4.5L15 21v-3l8.027-.032L23 15z"/>\
-</svg>');
- filter: var(--copy-button-filter);
-}
-pre > .buttons button.clip-button:hover::before {
- filter: var(--copy-button-filter-hover);
-}
-
-@media (pointer: coarse) {
- pre > .buttons button {
- /* On mobile, make it easier to tap buttons. */
- padding: 0.3rem 1rem;
- }
-
- .sidebar-resize-indicator {
- /* Hide resize indicator on devices with limited accuracy */
- display: none;
- }
-}
-pre > code {
- display: block;
- padding: 1rem;
-}
-
-/* FIXME: ACE editors overlap their buttons because ACE does absolute
- positioning within the code block which breaks padding. The only solution I
- can think of is to move the padding to the outer pre tag (or insert a div
- wrapper), but that would require fixing a whole bunch of CSS rules.
-*/
-.hljs.ace_editor {
- padding: 0rem 0rem;
-}
-
-pre > .result {
- margin-block-start: 10px;
-}
-
-/* Search */
-
-#mdbook-searchresults a {
- text-decoration: none;
-}
-
-mark {
- border-radius: 2px;
- padding-block-start: 0;
- padding-block-end: 1px;
- padding-inline-start: 3px;
- padding-inline-end: 3px;
- margin-block-start: 0;
- margin-block-end: -1px;
- margin-inline-start: -3px;
- margin-inline-end: -3px;
- background-color: var(--search-mark-bg);
- transition: background-color 300ms linear;
- cursor: pointer;
-}
-
-mark.fade-out {
- background-color: rgba(0,0,0,0) !important;
- cursor: auto;
-}
-
-.searchbar-outer {
- margin-inline-start: auto;
- margin-inline-end: auto;
- max-width: var(--content-max-width);
-}
-
-#mdbook-searchbar-outer.searching #mdbook-searchbar {
- padding-right: 30px;
-}
-#mdbook-searchbar-outer .spinner-wrapper {
- display: none;
-}
-#mdbook-searchbar-outer.searching .spinner-wrapper {
- display: block;
-}
-
-.search-wrapper {
- position: relative;
-}
-
-.spinner-wrapper {
- --spinner-margin: 2px;
- position: absolute;
- margin-block-start: calc(var(--searchbar-margin-block-start) + var(--spinner-margin));
- right: var(--spinner-margin);
- top: 0;
- bottom: var(--spinner-margin);
- padding: 6px;
- background-color: var(--bg);
-}
-
-#fa-spin {
- animation: rotating 2s linear infinite;
- display: inline-block;
-}
-
-@keyframes rotating {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
-
-#mdbook-searchbar {
- width: 100%;
- margin-block-start: var(--searchbar-margin-block-start);
- margin-block-end: 0;
- margin-inline-start: auto;
- margin-inline-end: auto;
- padding: 10px 16px;
- transition: box-shadow 300ms ease-in-out;
- border: 1px solid var(--searchbar-border-color);
- border-radius: 3px;
- background-color: var(--searchbar-bg);
- color: var(--searchbar-fg);
-}
-#mdbook-searchbar:focus,
-#mdbook-searchbar.active {
- box-shadow: 0 0 3px var(--searchbar-shadow-color);
-}
-
-.searchresults-header {
- font-weight: bold;
- font-size: 1em;
- padding-block-start: 18px;
- padding-block-end: 0;
- padding-inline-start: 5px;
- padding-inline-end: 0;
- color: var(--searchresults-header-fg);
-}
-
-.searchresults-outer {
- margin-inline-start: auto;
- margin-inline-end: auto;
- max-width: var(--content-max-width);
- border-block-end: 1px dashed var(--searchresults-border-color);
-}
-
-ul#mdbook-searchresults {
- list-style: none;
- padding-inline-start: 20px;
-}
-ul#mdbook-searchresults li {
- margin: 10px 0px;
- padding: 2px;
- border-radius: 2px;
-}
-ul#mdbook-searchresults li.focus {
- background-color: var(--searchresults-li-bg);
-}
-ul#mdbook-searchresults span.teaser {
- display: block;
- clear: both;
- margin-block-start: 5px;
- margin-block-end: 0;
- margin-inline-start: 20px;
- margin-inline-end: 0;
- font-size: 0.8em;
-}
-ul#mdbook-searchresults span.teaser em {
- font-weight: bold;
- font-style: normal;
-}
-
-/* Sidebar */
-
-.sidebar {
- position: fixed;
- left: 0;
- top: 0;
- bottom: 0;
- width: var(--sidebar-width);
- font-size: 0.875em;
- box-sizing: border-box;
- -webkit-overflow-scrolling: touch;
- overscroll-behavior-y: contain;
- background-color: var(--sidebar-bg);
- color: var(--sidebar-fg);
-}
-.sidebar-iframe-inner {
- --padding: 10px;
-
- background-color: var(--sidebar-bg);
- padding: var(--padding);
- margin: 0;
- font-size: 1.4rem;
- color: var(--sidebar-fg);
- min-height: calc(100vh - var(--padding) * 2);
-}
-.sidebar-iframe-outer {
- border: none;
- height: 100%;
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
-}
-[dir=rtl] .sidebar { left: unset; right: 0; }
-.sidebar-resizing {
- -moz-user-select: none;
- -webkit-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-html:not(.sidebar-resizing) .sidebar {
- transition: transform 0.3s; /* Animation: slide away */
-}
-.sidebar code {
- line-height: 2em;
-}
-.sidebar .sidebar-scrollbox {
- overflow-y: auto;
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- padding: 10px 10px;
-}
-.sidebar .sidebar-resize-handle {
- position: absolute;
- cursor: col-resize;
- width: 0;
- right: calc(var(--sidebar-resize-indicator-width) * -1);
- top: 0;
- bottom: 0;
- display: flex;
- align-items: center;
-}
-
-.sidebar-resize-handle .sidebar-resize-indicator {
- width: 100%;
- height: 16px;
- color: var(--icons);
- margin-inline-start: var(--sidebar-resize-indicator-space);
- display: flex;
- align-items: center;
- justify-content: flex-start;
-}
-.sidebar-resize-handle .sidebar-resize-indicator::before {
- content: "";
- width: 2px;
- height: 12px;
- border-left: dotted 2px currentColor;
-}
-.sidebar-resize-handle .sidebar-resize-indicator::after {
- content: "";
- width: 2px;
- height: 16px;
- border-left: dotted 2px currentColor;
-}
-
-[dir=rtl] .sidebar .sidebar-resize-handle {
- left: calc(var(--sidebar-resize-indicator-width) * -1);
- right: unset;
-}
-.js .sidebar .sidebar-resize-handle {
- cursor: col-resize;
- width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space));
-}
-
-html:not(.js) .sidebar-resize-handle {
- display: none;
-}
-
-/* sidebar-hidden */
-#mdbook-sidebar-toggle-anchor:not(:checked) ~ .sidebar {
- transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width)));
-}
-[dir=rtl] #mdbook-sidebar-toggle-anchor:not(:checked) ~ .sidebar {
- transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)));
-}
-.sidebar::-webkit-scrollbar {
- background: var(--sidebar-bg);
-}
-.sidebar::-webkit-scrollbar-thumb {
- background: var(--scrollbar);
-}
-
-/* sidebar-visible */
-#mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
- transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)));
-}
-[dir=rtl] #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
- transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width)));
-}
-@media only screen and (min-width: 620px) {
- #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
- transform: none;
- margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width));
- }
- [dir=rtl] #mdbook-sidebar-toggle-anchor:checked ~ .page-wrapper {
- transform: none;
- }
-}
-
-.chapter {
- list-style: none outside none;
- padding-inline-start: 0;
- line-height: 2.2em;
-}
-
-.chapter li {
- color: var(--sidebar-non-existant);
-}
-
-/* This is a span wrapping the chapter link and the fold chevron. */
-.chapter-link-wrapper {
- /* Used to position the chevron to the right, allowing the text to wrap before it. */
- display: flex;
-}
-
-.chapter li a {
- /* Remove underlines. */
- text-decoration: none;
- color: var(--sidebar-fg);
-}
-
-.chapter li a:hover {
- color: var(--sidebar-active);
-}
-
-.chapter li a.active {
- color: var(--sidebar-active);
-}
-
-/* This is the toggle chevron. */
-.chapter-fold-toggle {
- cursor: pointer;
- /* Positions the chevron to the side. */
- margin-inline-start: auto;
- padding: 0 10px;
- user-select: none;
- opacity: 0.68;
-}
-
-.chapter-fold-toggle div {
- transition: transform 0.5s;
-}
-
-/* collapse the section */
-.chapter li:not(.expanded) > ol {
- display: none;
-}
-
-.chapter li.chapter-item {
- line-height: 1.5em;
- margin-block-start: 0.6em;
-}
-
-/* When expanded, rotate the chevron to point down. */
-.chapter li.expanded > span > .chapter-fold-toggle div {
- transform: rotate(90deg);
-}
-
-.chapter a.current-header {
- color: var(--sidebar-active);
-}
-
-.on-this-page {
- margin-left: 22px;
- border-inline-start: 4px solid var(--sidebar-header-border-color);
- padding-left: 8px;
-}
-
-.on-this-page > ol {
- padding-left: 0;
-}
-
-/* Horizontal line in chapter list. */
-.spacer {
- width: 100%;
- height: 3px;
- margin: 5px 0px;
-}
-.chapter .spacer {
- background-color: var(--sidebar-spacer);
-}
-
-/* On touch devices, add more vertical spacing to make it easier to tap links. */
-@media (-moz-touch-enabled: 1), (pointer: coarse) {
- .chapter li a { padding: 5px 0; }
- .spacer { margin: 10px 0; }
-}
-
-.section {
- list-style: none outside none;
- padding-inline-start: 20px;
- line-height: 1.9em;
-}
-
-/* Theme Menu Popup */
-
-.theme-popup {
- position: absolute;
- left: 10px;
- top: var(--menu-bar-height);
- z-index: 1000;
- border-radius: 4px;
- font-size: 0.7em;
- color: var(--fg);
- background: var(--theme-popup-bg);
- border: 1px solid var(--theme-popup-border);
- margin: 0;
- padding: 0;
- list-style: none;
- display: none;
- /* Don't let the children's background extend past the rounded corners. */
- overflow: hidden;
-}
-[dir=rtl] .theme-popup { left: unset; right: 10px; }
-.theme-popup .default {
- color: var(--icons);
-}
-.theme-popup .theme {
- width: 100%;
- border: 0;
- margin: 0;
- padding: 2px 20px;
- line-height: 25px;
- white-space: nowrap;
- text-align: start;
- cursor: pointer;
- color: inherit;
- background: inherit;
- font-size: inherit;
-}
-.theme-popup .theme:hover {
- background-color: var(--theme-hover);
-}
-
-.theme-selected::before {
- display: inline-block;
- content: "✓";
- margin-inline-start: -14px;
- width: 14px;
-}
-
-/* The container for the help popup that covers the whole window. */
-#mdbook-help-container {
- /* Position and size for the whole window. */
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- /* This uses flex layout (which is set in book.js), and centers the popup
- in the window.*/
- display: none;
- align-items: center;
- justify-content: center;
- z-index: 1000;
- /* Dim out the book while the popup is visible. */
- background: var(--overlay-bg);
-}
-
-/* The popup help box. */
-#mdbook-help-popup {
- box-shadow: 0 4px 24px rgba(0,0,0,0.15);
- min-width: 300px;
- max-width: 500px;
- width: 100%;
- box-sizing: border-box;
- display: flex;
- flex-direction: column;
- align-items: center;
- background-color: var(--bg);
- color: var(--fg);
- border-width: 1px;
- border-color: var(--theme-popup-border);
- border-style: solid;
- border-radius: 8px;
- padding: 10px;
-}
-
-.mdbook-help-title {
- text-align: center;
- /* mdbook's margin for h2 is way too large. */
- margin: 10px;
-}
diff --git a/book/pt-br/css/chrome-ae938929.css.gz b/book/pt-br/css/chrome-ae938929.css.gz
deleted file mode 100644
index 2aeb42d..0000000
--- a/book/pt-br/css/chrome-ae938929.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/css/general-2459343d.css b/book/pt-br/css/general-2459343d.css
deleted file mode 100644
index df8a3ef..0000000
--- a/book/pt-br/css/general-2459343d.css
+++ /dev/null
@@ -1,408 +0,0 @@
-/* Base styles and content styles */
-
-:root {
- /* Browser default font-size is 16px, this way 1 rem = 10px */
- font-size: 62.5%;
- color-scheme: var(--color-scheme);
-}
-
-html {
- font-family: "Open Sans", sans-serif;
- color: var(--fg);
- background-color: var(--bg);
- text-size-adjust: none;
- -webkit-text-size-adjust: none;
-}
-
-body {
- margin: 0;
- font-size: 1.6rem;
- overflow-x: hidden;
-}
-
-code {
- font-family: var(--mono-font) !important;
- font-size: var(--code-font-size);
- direction: ltr !important;
-}
-
-/* make long words/inline code not x overflow */
-main {
- overflow-wrap: break-word;
-}
-
-/* make wide tables scroll if they overflow */
-.table-wrapper {
- overflow-x: auto;
-}
-
-/* Don't change font size in headers. */
-h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
- font-size: unset;
-}
-
-.left { float: left; }
-.right { float: right; }
-.boring { opacity: 0.6; }
-.hide-boring .boring { display: none; }
-.hidden { display: none !important; }
-
-h2, h3 { margin-block-start: 2.5em; }
-h4, h5 { margin-block-start: 2em; }
-
-.header + .header h3,
-.header + .header h4,
-.header + .header h5 {
- margin-block-start: 1em;
-}
-
-h1:target::before,
-h2:target::before,
-h3:target::before,
-h4:target::before,
-h5:target::before,
-h6:target::before,
-dt:target::before {
- display: inline-block;
- content: "»";
- margin-inline-start: -30px;
- width: 30px;
-}
-
-/* This is broken on Safari as of version 14, but is fixed
- in Safari Technology Preview 117 which I think will be Safari 14.2.
- https://bugs.webkit.org/show_bug.cgi?id=218076
-*/
-:target {
- /* Safari does not support logical properties */
- scroll-margin-top: calc(var(--menu-bar-height) + 0.5em);
-}
-
-.page {
- outline: 0;
- padding: 0 var(--page-padding);
- margin-block-start: calc(0px - var(--menu-bar-height)); /* Compensate for the #mdbook-menu-bar-hover-placeholder */
-}
-.page-wrapper {
- box-sizing: border-box;
- background-color: var(--bg);
-}
-html:not(.js) .page-wrapper,
-.js:not(.sidebar-resizing) .page-wrapper {
- transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */
-}
-[dir=rtl]:not(.js) .page-wrapper,
-[dir=rtl].js:not(.sidebar-resizing) .page-wrapper {
- transition: margin-right 0.3s ease, transform 0.3s ease; /* Animation: slide away */
-}
-
-.content {
- overflow-y: auto;
- padding: 0 5px 50px 5px;
-}
-.content main {
- margin-inline-start: auto;
- margin-inline-end: auto;
- max-width: var(--content-max-width);
-}
-.content p { line-height: 1.45em; }
-.content ol { line-height: 1.45em; }
-.content ul { line-height: 1.45em; }
-.content a { text-decoration: none; }
-.content a:hover { text-decoration: underline; }
-.content img, .content video { max-width: 100%; }
-.content .header:link,
-.content .header:visited {
- color: var(--fg);
-}
-.content .header:link,
-.content .header:visited:hover {
- text-decoration: none;
-}
-
-table {
- margin: 0 auto;
- border-collapse: collapse;
-}
-table td {
- padding: 3px 20px;
- border: 1px var(--table-border-color) solid;
-}
-table thead {
- background: var(--table-header-bg);
-}
-table thead td {
- font-weight: 700;
- border: none;
-}
-table thead th {
- padding: 3px 20px;
-}
-table thead tr {
- border: 1px var(--table-header-bg) solid;
-}
-/* Alternate background colors for rows */
-table tbody tr:nth-child(2n) {
- background: var(--table-alternate-bg);
-}
-
-
-blockquote {
- margin: 20px 0;
- padding: 0 20px;
- color: var(--fg);
- background-color: var(--quote-bg);
- border-block-start: .1em solid var(--quote-border);
- border-block-end: .1em solid var(--quote-border);
-}
-
-/* TODO: Remove .warning in a future version of mdbook, it is replaced by
-blockquote tags. */
-.warning {
- margin: 20px;
- padding: 0 20px;
- border-inline-start: 2px solid var(--warning-border);
-}
-
-.warning:before {
- position: absolute;
- width: 3rem;
- height: 3rem;
- margin-inline-start: calc(-1.5rem - 21px);
- content: "ⓘ";
- text-align: center;
- background-color: var(--bg);
- color: var(--warning-border);
- font-weight: bold;
- font-size: 2rem;
-}
-
-blockquote .warning:before {
- background-color: var(--quote-bg);
-}
-
-kbd {
- background-color: var(--table-border-color);
- border-radius: 4px;
- border: solid 1px var(--theme-popup-border);
- box-shadow: inset 0 -1px 0 var(--theme-hover);
- display: inline-block;
- font-size: var(--code-font-size);
- font-family: var(--mono-font);
- line-height: 10px;
- padding: 4px 5px;
- vertical-align: middle;
-}
-
-sup {
- /* Set the line-height for superscript and footnote references so that there
- isn't an awkward space appearing above lines that contain the footnote.
-
- See https://github.com/rust-lang/mdBook/pull/2443#discussion_r1813773583
- for an explanation.
- */
- line-height: 0;
-}
-
-.footnote-definition {
- font-size: 0.9em;
-}
-/* The default spacing for a list is a little too large. */
-.footnote-definition ul,
-.footnote-definition ol {
- padding-left: 20px;
-}
-.footnote-definition > li {
- /* Required to position the ::before target */
- position: relative;
-}
-.footnote-definition > li:target {
- scroll-margin-top: 50vh;
-}
-.footnote-reference:target {
- scroll-margin-top: 50vh;
-}
-/* Draws a border around the footnote (including the marker) when it is selected.
- TODO: If there are multiple linkbacks, highlight which one you just came
- from so you know which one to click.
-*/
-.footnote-definition > li:target::before {
- border: 2px solid var(--footnote-highlight);
- border-radius: 6px;
- position: absolute;
- top: -8px;
- right: -8px;
- bottom: -8px;
- left: -32px;
- pointer-events: none;
- content: "";
-}
-/* Pulses the footnote reference so you can quickly see where you left off reading.
- This could use some improvement.
-*/
-@media not (prefers-reduced-motion) {
- .footnote-reference:target {
- animation: fn-highlight 0.8s;
- border-radius: 2px;
- }
-
- @keyframes fn-highlight {
- from {
- background-color: var(--footnote-highlight);
- }
- }
-}
-
-.tooltiptext {
- position: absolute;
- visibility: hidden;
- color: #fff;
- background-color: #333;
- transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */
- left: -8px; /* Half of the width of the icon */
- top: -35px;
- font-size: 0.8em;
- text-align: center;
- border-radius: 6px;
- padding: 5px 8px;
- margin: 5px;
- z-index: 1000;
-}
-.tooltipped .tooltiptext {
- visibility: visible;
-}
-
-.chapter li.part-title {
- color: var(--sidebar-fg);
- margin: 5px 0px;
- font-weight: bold;
-}
-
-.result-no-output {
- font-style: italic;
-}
-
-.fa-svg svg {
- width: 1em;
- height: 1em;
- fill: currentColor;
- margin-bottom: -0.1em;
-}
-
-dt {
- font-weight: bold;
- margin-top: 0.5em;
- margin-bottom: 0.1em;
-}
-
-/* This uses a CSS counter to add numbers to definitions, but only if there is
- more than one definition. */
-dl, dt {
- counter-reset: dd-counter;
-}
-
-/* When there is more than one definition, increment the counter. The first
-selector selects the first definition, and the second one selects definitions
-2 and beyond.*/
-dd:has(+ dd), dd + dd {
- counter-increment: dd-counter;
- /* Use flex display to help with positioning the numbers when there is a p
- tag inside the definition. */
- display: flex;
- align-items: flex-start;
-}
-
-/* Shows the counter for definitions. The first selector selects the first
-definition, and the second one selections definitions 2 and beyond.*/
-dd:has(+ dd)::before, dd + dd::before {
- content: counter(dd-counter) ". ";
- font-weight: 600;
- display: inline-block;
- margin-right: 0.5em;
-}
-
-dd > p {
- /* For loose definitions that have a p tag inside, don't add a bunch of
- space before the definition. */
- margin-top: 0;
-}
-
-/* Remove some excess space from the bottom. */
-.blockquote-tag p:last-child {
- margin-bottom: 2px;
-}
-
-.blockquote-tag {
- /* Add some padding to make the vertical bar a little taller than the text.*/
- padding: 2px 0px 2px 20px;
- /* Add a solid color bar on the left side. */
- border-inline-start-style: solid;
- border-inline-start-width: 4px;
- /* Disable the background color from normal blockquotes . */
- background-color: inherit;
- /* Disable border blocks from blockquotes. */
- border-block-start: none;
- border-block-end: none;
-}
-
-.blockquote-tag-title svg {
- fill: currentColor;
- /* Add space between the icon and the title. */
- margin-right: 8px;
-}
-
-.blockquote-tag-note {
- border-inline-start-color: var(--blockquote-note-color);
-}
-
-.blockquote-tag-tip {
- border-inline-start-color: var(--blockquote-tip-color);
-}
-
-.blockquote-tag-important {
- border-inline-start-color: var(--blockquote-important-color);
-}
-
-.blockquote-tag-warning {
- border-inline-start-color: var(--blockquote-warning-color);
-}
-
-.blockquote-tag-caution {
- border-inline-start-color: var(--blockquote-caution-color);
-}
-
-.blockquote-tag-note .blockquote-tag-title {
- color: var(--blockquote-note-color);
-}
-
-.blockquote-tag-tip .blockquote-tag-title {
- color: var(--blockquote-tip-color);
-}
-
-.blockquote-tag-important .blockquote-tag-title {
- color: var(--blockquote-important-color);
-}
-
-.blockquote-tag-warning .blockquote-tag-title {
- color: var(--blockquote-warning-color);
-}
-
-.blockquote-tag-caution .blockquote-tag-title {
- color: var(--blockquote-caution-color);
-}
-
-.blockquote-tag-title {
- /* Slightly increase the weight for more emphasis. */
- font-weight: 600;
- /* Vertically center the icon with the text. */
- display: flex;
- align-items: center;
- /* Remove default large margins for a more compact display. */
- margin: 2px 0 8px 0;
-}
-
-.blockquote-tag-title .fa-svg {
- fill: currentColor;
- /* Add some space between the icon and the text. */
- margin-right: 8px;
-}
diff --git a/book/pt-br/css/general-2459343d.css.gz b/book/pt-br/css/general-2459343d.css.gz
deleted file mode 100644
index 78d9fd8..0000000
--- a/book/pt-br/css/general-2459343d.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/css/print-9e4910d8.css b/book/pt-br/css/print-9e4910d8.css
deleted file mode 100644
index 2004384..0000000
--- a/book/pt-br/css/print-9e4910d8.css
+++ /dev/null
@@ -1,50 +0,0 @@
-
-#mdbook-sidebar,
-#mdbook-menu-bar,
-.nav-chapters,
-.mobile-nav-chapters {
- display: none;
-}
-
-#mdbook-page-wrapper.page-wrapper {
- transform: none !important;
- margin-inline-start: 0px;
- overflow-y: initial;
-}
-
-#mdbook-content {
- max-width: none;
- margin: 0;
- padding: 0;
-}
-
-.page {
- overflow-y: initial;
-}
-
-code {
- direction: ltr !important;
-}
-
-pre > .buttons {
- z-index: 2;
-}
-
-a, a:visited, a:active, a:hover {
- color: #4183c4;
- text-decoration: none;
-}
-
-h1, h2, h3, h4, h5, h6 {
- page-break-inside: avoid;
- page-break-after: avoid;
-}
-
-pre, code {
- page-break-inside: avoid;
- white-space: pre-wrap;
-}
-
-.fa {
- display: none !important;
-}
diff --git a/book/pt-br/css/print-9e4910d8.css.gz b/book/pt-br/css/print-9e4910d8.css.gz
deleted file mode 100644
index b87a3da..0000000
--- a/book/pt-br/css/print-9e4910d8.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/css/variables-8adf115d.css b/book/pt-br/css/variables-8adf115d.css
deleted file mode 100644
index af5023b..0000000
--- a/book/pt-br/css/variables-8adf115d.css
+++ /dev/null
@@ -1,383 +0,0 @@
-
-/* Globals */
-
-:root {
- --sidebar-target-width: 300px;
- --sidebar-width: min(var(--sidebar-target-width), 80vw);
- --sidebar-resize-indicator-width: 8px;
- --sidebar-resize-indicator-space: 2px;
- --page-padding: 15px;
- --content-max-width: 750px;
- --menu-bar-height: 50px;
- --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace;
- --code-font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */
- --searchbar-margin-block-start: 5px;
-}
-
-/* Themes */
-
-.ayu {
- --bg: hsl(210, 25%, 8%);
- --fg: #c5c5c5;
-
- --sidebar-bg: #14191f;
- --sidebar-fg: #c8c9db;
- --sidebar-non-existant: #5c6773;
- --sidebar-active: #ffb454;
- --sidebar-spacer: #2d334f;
-
- --scrollbar: var(--sidebar-fg);
-
- --icons: #737480;
- --icons-hover: #b7b9cc;
-
- --links: #0096cf;
-
- --inline-code-color: #ffb454;
-
- --theme-popup-bg: #14191f;
- --theme-popup-border: #5c6773;
- --theme-hover: #191f26;
-
- --quote-bg: hsl(226, 15%, 17%);
- --quote-border: hsl(226, 15%, 22%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(210, 25%, 13%);
- --table-header-bg: hsl(210, 25%, 28%);
- --table-alternate-bg: hsl(210, 25%, 11%);
-
- --searchbar-border-color: #848484;
- --searchbar-bg: #424242;
- --searchbar-fg: #fff;
- --searchbar-shadow-color: #d4c89f;
- --searchresults-header-fg: #666;
- --searchresults-border-color: #888;
- --searchresults-li-bg: #252932;
- --search-mark-bg: #e3b171;
-
- --color-scheme: dark;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(45%) sepia(6%) saturate(621%) hue-rotate(198deg) brightness(99%) contrast(85%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(68%) sepia(55%) saturate(531%) hue-rotate(341deg) brightness(104%) contrast(101%);
-
- --footnote-highlight: #2668a6;
-
- --overlay-bg: rgba(33, 40, 48, 0.4);
-
- --blockquote-note-color: #74b9ff;
- --blockquote-tip-color: #09ca09;
- --blockquote-important-color: #d3abff;
- --blockquote-warning-color: #f0b72f;
- --blockquote-caution-color: #f21424;
-
- --sidebar-header-border-color: #c18639;
-}
-
-.coal {
- --bg: hsl(200, 7%, 8%);
- --fg: #98a3ad;
-
- --sidebar-bg: #292c2f;
- --sidebar-fg: #a1adb8;
- --sidebar-non-existant: #505254;
- --sidebar-active: #3473ad;
- --sidebar-spacer: #393939;
-
- --scrollbar: var(--sidebar-fg);
-
- --icons: #43484d;
- --icons-hover: #b3c0cc;
-
- --links: #2b79a2;
-
- --inline-code-color: #c5c8c6;
-
- --theme-popup-bg: #141617;
- --theme-popup-border: #43484d;
- --theme-hover: #1f2124;
-
- --quote-bg: hsl(234, 21%, 18%);
- --quote-border: hsl(234, 21%, 23%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(200, 7%, 13%);
- --table-header-bg: hsl(200, 7%, 28%);
- --table-alternate-bg: hsl(200, 7%, 11%);
-
- --searchbar-border-color: #aaa;
- --searchbar-bg: #b7b7b7;
- --searchbar-fg: #000;
- --searchbar-shadow-color: #aaa;
- --searchresults-header-fg: #666;
- --searchresults-border-color: #98a3ad;
- --searchresults-li-bg: #2b2b2f;
- --search-mark-bg: #355c7d;
-
- --color-scheme: dark;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%);
-
- --footnote-highlight: #4079ae;
-
- --overlay-bg: rgba(33, 40, 48, 0.4);
-
- --blockquote-note-color: #4493f8;
- --blockquote-tip-color: #08ae08;
- --blockquote-important-color: #ab7df8;
- --blockquote-warning-color: #d29922;
- --blockquote-caution-color: #d91b29;
-
- --sidebar-header-border-color: #3473ad;
-}
-
-.light, html:not(.js) {
- --bg: hsl(0, 0%, 100%);
- --fg: hsl(0, 0%, 0%);
-
- --sidebar-bg: #fafafa;
- --sidebar-fg: hsl(0, 0%, 0%);
- --sidebar-non-existant: #aaaaaa;
- --sidebar-active: #1f1fff;
- --sidebar-spacer: #f4f4f4;
-
- --scrollbar: #8F8F8F;
-
- --icons: #747474;
- --icons-hover: #000000;
-
- --links: #20609f;
-
- --inline-code-color: #301900;
-
- --theme-popup-bg: #fafafa;
- --theme-popup-border: #cccccc;
- --theme-hover: #e6e6e6;
-
- --quote-bg: hsl(197, 37%, 96%);
- --quote-border: hsl(197, 37%, 91%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(0, 0%, 95%);
- --table-header-bg: hsl(0, 0%, 80%);
- --table-alternate-bg: hsl(0, 0%, 97%);
-
- --searchbar-border-color: #aaa;
- --searchbar-bg: #fafafa;
- --searchbar-fg: #000;
- --searchbar-shadow-color: #aaa;
- --searchresults-header-fg: #666;
- --searchresults-border-color: #888;
- --searchresults-li-bg: #e4f2fe;
- --search-mark-bg: #a2cff5;
-
- --color-scheme: light;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(45.49%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(14%) sepia(93%) saturate(4250%) hue-rotate(243deg) brightness(99%) contrast(130%);
-
- --footnote-highlight: #7e7eff;
-
- --overlay-bg: rgba(200, 200, 205, 0.4);
-
- --blockquote-note-color: #0969da;
- --blockquote-tip-color: #008000;
- --blockquote-important-color: #8250df;
- --blockquote-warning-color: #9a6700;
- --blockquote-caution-color: #b52731;
-
- --sidebar-header-border-color: #6e6edb;
-}
-
-.navy {
- --bg: hsl(226, 23%, 11%);
- --fg: #bcbdd0;
-
- --sidebar-bg: #282d3f;
- --sidebar-fg: #c8c9db;
- --sidebar-non-existant: #505274;
- --sidebar-active: #2b79a2;
- --sidebar-spacer: #2d334f;
-
- --scrollbar: var(--sidebar-fg);
-
- --icons: #737480;
- --icons-hover: #b7b9cc;
-
- --links: #2b79a2;
-
- --inline-code-color: #c5c8c6;
-
- --theme-popup-bg: #161923;
- --theme-popup-border: #737480;
- --theme-hover: #282e40;
-
- --quote-bg: hsl(226, 15%, 17%);
- --quote-border: hsl(226, 15%, 22%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(226, 23%, 16%);
- --table-header-bg: hsl(226, 23%, 31%);
- --table-alternate-bg: hsl(226, 23%, 14%);
-
- --searchbar-border-color: #aaa;
- --searchbar-bg: #aeaec6;
- --searchbar-fg: #000;
- --searchbar-shadow-color: #aaa;
- --searchresults-header-fg: #5f5f71;
- --searchresults-border-color: #5c5c68;
- --searchresults-li-bg: #242430;
- --search-mark-bg: #a2cff5;
-
- --color-scheme: dark;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(46%) sepia(20%) saturate(1537%) hue-rotate(156deg) brightness(85%) contrast(90%);
-
- --footnote-highlight: #4079ae;
-
- --overlay-bg: rgba(33, 40, 48, 0.4);
-
- --blockquote-note-color: #4493f8;
- --blockquote-tip-color: #09ca09;
- --blockquote-important-color: #ab7df8;
- --blockquote-warning-color: #d29922;
- --blockquote-caution-color: #f21424;
-
- --sidebar-header-border-color: #2f6ab5;
-}
-
-.rust {
- --bg: hsl(60, 9%, 87%);
- --fg: #262625;
-
- --sidebar-bg: #3b2e2a;
- --sidebar-fg: #c8c9db;
- --sidebar-non-existant: #505254;
- --sidebar-active: #e69f67;
- --sidebar-spacer: #45373a;
-
- --scrollbar: var(--sidebar-fg);
-
- --icons: #737480;
- --icons-hover: #262625;
-
- --links: #2b79a2;
-
- --inline-code-color: #6e6b5e;
-
- --theme-popup-bg: #e1e1db;
- --theme-popup-border: #b38f6b;
- --theme-hover: #99908a;
-
- --quote-bg: hsl(60, 5%, 75%);
- --quote-border: hsl(60, 5%, 70%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(60, 9%, 82%);
- --table-header-bg: #b3a497;
- --table-alternate-bg: hsl(60, 9%, 84%);
-
- --searchbar-border-color: #aaa;
- --searchbar-bg: #fafafa;
- --searchbar-fg: #000;
- --searchbar-shadow-color: #aaa;
- --searchresults-header-fg: #666;
- --searchresults-border-color: #888;
- --searchresults-li-bg: #dec2a2;
- --search-mark-bg: #e69f67;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(77%) sepia(16%) saturate(1798%) hue-rotate(328deg) brightness(98%) contrast(83%);
-
- --footnote-highlight: #d3a17a;
-
- --overlay-bg: rgba(150, 150, 150, 0.25);
-
- --blockquote-note-color: #023b95;
- --blockquote-tip-color: #007700;
- --blockquote-important-color: #8250df;
- --blockquote-warning-color: #603700;
- --blockquote-caution-color: #aa1721;
-
- --sidebar-header-border-color: #8c391f;
-}
-
-@media (prefers-color-scheme: dark) {
- html:not(.js) {
- --bg: hsl(200, 7%, 8%);
- --fg: #98a3ad;
-
- --sidebar-bg: #292c2f;
- --sidebar-fg: #a1adb8;
- --sidebar-non-existant: #505254;
- --sidebar-active: #3473ad;
- --sidebar-spacer: #393939;
-
- --scrollbar: var(--sidebar-fg);
-
- --icons: #43484d;
- --icons-hover: #b3c0cc;
-
- --links: #2b79a2;
-
- --inline-code-color: #c5c8c6;
-
- --theme-popup-bg: #141617;
- --theme-popup-border: #43484d;
- --theme-hover: #1f2124;
-
- --quote-bg: hsl(234, 21%, 18%);
- --quote-border: hsl(234, 21%, 23%);
-
- --warning-border: #ff8e00;
-
- --table-border-color: hsl(200, 7%, 13%);
- --table-header-bg: hsl(200, 7%, 28%);
- --table-alternate-bg: hsl(200, 7%, 11%);
-
- --searchbar-border-color: #aaa;
- --searchbar-bg: #b7b7b7;
- --searchbar-fg: #000;
- --searchbar-shadow-color: #aaa;
- --searchresults-header-fg: #666;
- --searchresults-border-color: #98a3ad;
- --searchresults-li-bg: #2b2b2f;
- --search-mark-bg: #355c7d;
-
- --color-scheme: dark;
-
- /* Same as `--icons` */
- --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%);
- /* Same as `--sidebar-active` */
- --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%);
-
- --footnote-highlight: #4079ae;
-
- --overlay-bg: rgba(33, 40, 48, 0.4);
-
- --blockquote-note-color: #4493f8;
- --blockquote-tip-color: #08ae08;
- --blockquote-important-color: #ab7df8;
- --blockquote-warning-color: #d29922;
- --blockquote-caution-color: #d91b29;
-
- --sidebar-header-border-color: #3473ad;
- }
-}
diff --git a/book/pt-br/css/variables-8adf115d.css.gz b/book/pt-br/css/variables-8adf115d.css.gz
deleted file mode 100644
index c276a85..0000000
--- a/book/pt-br/css/variables-8adf115d.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/docker.html b/book/pt-br/docker.html
deleted file mode 100644
index 3cc228c..0000000
--- a/book/pt-br/docker.html
+++ /dev/null
@@ -1,303 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Docker - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="docker"><a class="header" href="#docker">Docker</a></h1>
-<p>Tesseras fornece uma imagem Docker para executar o daemon em conteineres. Isso e util para servidores, testar redes com multiplos nos e ambientes de CI.</p>
-<h2 id="construindo-a-imagem"><a class="header" href="#construindo-a-imagem">Construindo a imagem</a></h2>
-<p>A partir da raiz do repositorio:</p>
-<pre><code class="language-bash">docker build -t tesseras-daemon .
-</code></pre>
-<p>O Dockerfile multi-estagio usa <code>rust:1.85</code> para compilar e <code>debian:bookworm-slim</code> como base de execucao. A imagem resultante e pequena e contem apenas o binario do daemon e certificados CA.</p>
-<h2 id="executando-um-unico-no"><a class="header" href="#executando-um-unico-no">Executando um unico no</a></h2>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- tesseras-daemon
-</code></pre>
-<p>Isso inicia um no que:</p>
-<ul>
-<li>Escuta na porta UDP 4433</li>
-<li>Faz bootstrap a partir dos nos semente padrao</li>
-<li>Armazena dados dentro do conteiner (efemero)</li>
-</ul>
-<p>Para persistir dados entre reinicializacoes do conteiner, monte um volume:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- -v tesseras-data:/root/.local/share/tesseras \
- tesseras-daemon
-</code></pre>
-<h2 id="executando-como-no-semente"><a class="header" href="#executando-como-no-semente">Executando como no semente</a></h2>
-<p>Para executar um no semente que nao faz bootstrap de ninguem:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras-seed \
- -p 4433:4433/udp \
- tesseras-daemon --listen 0.0.0.0:4433 --bootstrap ""
-</code></pre>
-<h2 id="rede-multi-no-com-docker-compose"><a class="header" href="#rede-multi-no-com-docker-compose">Rede multi-no com Docker Compose</a></h2>
-<p>O repositorio inclui um arquivo Docker Compose para testar uma rede de 3 nos:</p>
-<pre><code class="language-yaml">services:
- boot1:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", ""]
- ports: ["4433:4433/udp"]
-
- boot2:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", "boot1:4433"]
- depends_on: [boot1]
-
- client:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", "boot2:4433"]
- depends_on: [boot2]
-</code></pre>
-<p>Iniciar a rede:</p>
-<pre><code class="language-bash">cd tests/smoke
-docker compose up --build -d
-</code></pre>
-<p>Verificar que todos os nos estao executando:</p>
-<pre><code class="language-bash">docker compose logs --tail=5
-</code></pre>
-<p>Voce devera ver <code>daemon ready</code> nos logs de cada no, e <code>bootstrap successful</code> para <code>boot2</code> e <code>client</code>.</p>
-<p>Parar a rede:</p>
-<pre><code class="language-bash">docker compose down
-</code></pre>
-<h2 id="configuracao-personalizada"><a class="header" href="#configuracao-personalizada">Configuracao personalizada</a></h2>
-<p>Para usar um arquivo de configuracao com Docker, monte-o no conteiner:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- -v ./config.toml:/etc/tesseras/config.toml:ro \
- -v tesseras-data:/root/.local/share/tesseras \
- tesseras-daemon --config /etc/tesseras/config.toml
-</code></pre>
-<p>Veja o capitulo <a href="./configuration.html">Configuracao</a> para todas as opcoes disponiveis.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="nat-traversal.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="nat-traversal.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/docker.html.gz b/book/pt-br/docker.html.gz
deleted file mode 100644
index 57898b4..0000000
--- a/book/pt-br/docker.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/elasticlunr-ef4e11c1.min.js b/book/pt-br/elasticlunr-ef4e11c1.min.js
deleted file mode 100644
index 94b20dd..0000000
--- a/book/pt-br/elasticlunr-ef4e11c1.min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * elasticlunr - http://weixsong.github.io
- * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5
- *
- * Copyright (C) 2017 Oliver Nightingale
- * Copyright (C) 2017 Wei Song
- * MIT Licensed
- * @license
- */
-!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u<s.length;u++){var a=s[u];r[a]=this.pipeline.run(t.tokenizer(e[a]))}var l={};for(var c in o){var d=r[c]||r.any;if(d){var f=this.fieldSearch(d,c,o),h=o[c].boost;for(var p in f)f[p]=f[p]*h;for(var p in f)p in l?l[p]+=f[p]:l[p]=f[p]}}var v,g=[];for(var p in l)v={ref:p,score:l[p]},this.documentStore.hasDoc(p)&&(v.doc=this.documentStore.getDoc(p)),g.push(v);return g.sort(function(e,t){return t.score-e.score}),g},t.Index.prototype.fieldSearch=function(e,t,n){var i=n[t].bool,o=n[t].expand,r=n[t].boost,s=null,u={};return 0!==r?(e.forEach(function(e){var n=[e];1==o&&(n=this.index[t].expandToken(e));var r={};n.forEach(function(n){var o=this.index[t].getDocs(n),a=this.idf(n,t);if(s&&"AND"==i){var l={};for(var c in s)c in o&&(l[c]=o[c]);o=l}n==e&&this.fieldSearchStats(u,n,o);for(var c in o){var d=this.index[t].getTermFrequency(n,c),f=this.documentStore.getFieldLength(c,t),h=1;0!=f&&(h=1/Math.sqrt(f));var p=1;n!=e&&(p=.15*(1-(n.length-e.length)/n.length));var v=d*a*h*p;c in r?r[c]+=v:r[c]=v}},this),s=this.mergeScores(s,r,i)},this),s=this.coordNorm(s,u,e.length)):void 0},t.Index.prototype.mergeScores=function(e,t,n){if(!e)return t;if("AND"==n){var i={};for(var o in t)o in e&&(i[o]=e[o]+t[o]);return i}for(var o in t)o in e?e[o]+=t[o]:e[o]=t[o];return e},t.Index.prototype.fieldSearchStats=function(e,t,n){for(var i in n)i in e?e[i].push(t):e[i]=[t]},t.Index.prototype.coordNorm=function(e,t,n){for(var i in e)if(i in t){var o=t[i].length;e[i]=e[i]*o/n}return e},t.Index.prototype.toJSON=function(){var e={};return this._fields.forEach(function(t){e[t]=this.index[t].toJSON()},this),{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),index:e,pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},t.DocumentStore=function(e){this._save=null===e||void 0===e?!0:e,this.docs={},this.docInfo={},this.length=0},t.DocumentStore.load=function(e){var t=new this;return t.length=e.length,t.docs=e.docs,t.docInfo=e.docInfo,t._save=e.save,t},t.DocumentStore.prototype.isDocStored=function(){return this._save},t.DocumentStore.prototype.addDoc=function(t,n){this.hasDoc(t)||this.length++,this.docs[t]=this._save===!0?e(n):null},t.DocumentStore.prototype.getDoc=function(e){return this.hasDoc(e)===!1?null:this.docs[e]},t.DocumentStore.prototype.hasDoc=function(e){return e in this.docs},t.DocumentStore.prototype.removeDoc=function(e){this.hasDoc(e)&&(delete this.docs[e],delete this.docInfo[e],this.length--)},t.DocumentStore.prototype.addFieldLength=function(e,t,n){null!==e&&void 0!==e&&0!=this.hasDoc(e)&&(this.docInfo[e]||(this.docInfo[e]={}),this.docInfo[e][t]=n)},t.DocumentStore.prototype.updateFieldLength=function(e,t,n){null!==e&&void 0!==e&&0!=this.hasDoc(e)&&this.addFieldLength(e,t,n)},t.DocumentStore.prototype.getFieldLength=function(e,t){return null===e||void 0===e?0:e in this.docs&&t in this.docInfo[e]?this.docInfo[e][t]:0},t.DocumentStore.prototype.toJSON=function(){return{docs:this.docs,docInfo:this.docInfo,length:this.length,save:this._save}},t.stemmer=function(){var e={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},t={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,u="^("+o+")?"+r+o+"("+r+")?$",a="^("+o+")?"+r+o+r+o,l="^("+o+")?"+i,c=new RegExp(s),d=new RegExp(a),f=new RegExp(u),h=new RegExp(l),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,x=new RegExp("([^aeiouylsz])\\1$"),w=new RegExp("^"+o+i+"[^aeiouwxy]$"),I=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,D=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,_=/^(.+?)e$/,P=/ll$/,k=new RegExp("^"+o+i+"[^aeiouwxy]$"),z=function(n){var i,o,r,s,u,a,l;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,u=v,s.test(n)?n=n.replace(s,"$1$2"):u.test(n)&&(n=n.replace(u,"$1$2")),s=g,u=m,s.test(n)){var z=s.exec(n);s=c,s.test(z[1])&&(s=y,n=n.replace(s,""))}else if(u.test(n)){var z=u.exec(n);i=z[1],u=h,u.test(i)&&(n=i,u=S,a=x,l=w,u.test(n)?n+="e":a.test(n)?(s=y,n=n.replace(s,"")):l.test(n)&&(n+="e"))}if(s=I,s.test(n)){var z=s.exec(n);i=z[1],n=i+"i"}if(s=b,s.test(n)){var z=s.exec(n);i=z[1],o=z[2],s=c,s.test(i)&&(n=i+e[o])}if(s=E,s.test(n)){var z=s.exec(n);i=z[1],o=z[2],s=c,s.test(i)&&(n=i+t[o])}if(s=D,u=F,s.test(n)){var z=s.exec(n);i=z[1],s=d,s.test(i)&&(n=i)}else if(u.test(n)){var z=u.exec(n);i=z[1]+z[2],u=d,u.test(i)&&(n=i)}if(s=_,s.test(n)){var z=s.exec(n);i=z[1],s=d,u=f,a=k,(s.test(i)||u.test(i)&&!a.test(i))&&(n=i)}return s=P,u=d,s.test(n)&&u.test(n)&&(s=y,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return z}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.stopWordFilter=function(e){return e&&t.stopWordFilter.stopWords[e]!==!0?e:void 0},t.clearStopWords=function(){t.stopWordFilter.stopWords={}},t.addStopWords=function(e){null!=e&&Array.isArray(e)!==!1&&e.forEach(function(e){t.stopWordFilter.stopWords[e]=!0},this)},t.resetStopWords=function(){t.stopWordFilter.stopWords=t.defaultStopWords},t.defaultStopWords={"":!0,a:!0,able:!0,about:!0,across:!0,after:!0,all:!0,almost:!0,also:!0,am:!0,among:!0,an:!0,and:!0,any:!0,are:!0,as:!0,at:!0,be:!0,because:!0,been:!0,but:!0,by:!0,can:!0,cannot:!0,could:!0,dear:!0,did:!0,"do":!0,does:!0,either:!0,"else":!0,ever:!0,every:!0,"for":!0,from:!0,get:!0,got:!0,had:!0,has:!0,have:!0,he:!0,her:!0,hers:!0,him:!0,his:!0,how:!0,however:!0,i:!0,"if":!0,"in":!0,into:!0,is:!0,it:!0,its:!0,just:!0,least:!0,let:!0,like:!0,likely:!0,may:!0,me:!0,might:!0,most:!0,must:!0,my:!0,neither:!0,no:!0,nor:!0,not:!0,of:!0,off:!0,often:!0,on:!0,only:!0,or:!0,other:!0,our:!0,own:!0,rather:!0,said:!0,say:!0,says:!0,she:!0,should:!0,since:!0,so:!0,some:!0,than:!0,that:!0,the:!0,their:!0,them:!0,then:!0,there:!0,these:!0,they:!0,"this":!0,tis:!0,to:!0,too:!0,twas:!0,us:!0,wants:!0,was:!0,we:!0,were:!0,what:!0,when:!0,where:!0,which:!0,"while":!0,who:!0,whom:!0,why:!0,will:!0,"with":!0,would:!0,yet:!0,you:!0,your:!0},t.stopWordFilter.stopWords=t.defaultStopWords,t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(e){if(null===e||void 0===e)throw new Error("token should not be undefined");return e.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.InvertedIndex=function(){this.root={docs:{},df:0}},t.InvertedIndex.load=function(e){var t=new this;return t.root=e.root,t},t.InvertedIndex.prototype.addToken=function(e,t,n){for(var n=n||this.root,i=0;i<=e.length-1;){var o=e[i];o in n||(n[o]={docs:{},df:0}),i+=1,n=n[o]}var r=t.ref;n.docs[r]?n.docs[r]={tf:t.tf}:(n.docs[r]={tf:t.tf},n.df+=1)},t.InvertedIndex.prototype.hasToken=function(e){if(!e)return!1;for(var t=this.root,n=0;n<e.length;n++){if(!t[e[n]])return!1;t=t[e[n]]}return!0},t.InvertedIndex.prototype.getNode=function(e){if(!e)return null;for(var t=this.root,n=0;n<e.length;n++){if(!t[e[n]])return null;t=t[e[n]]}return t},t.InvertedIndex.prototype.getDocs=function(e){var t=this.getNode(e);return null==t?{}:t.docs},t.InvertedIndex.prototype.getTermFrequency=function(e,t){var n=this.getNode(e);return null==n?0:t in n.docs?n.docs[t].tf:0},t.InvertedIndex.prototype.getDocFreq=function(e){var t=this.getNode(e);return null==t?0:t.df},t.InvertedIndex.prototype.removeToken=function(e,t){if(e){var n=this.getNode(e);null!=n&&t in n.docs&&(delete n.docs[t],n.df-=1)}},t.InvertedIndex.prototype.expandToken=function(e,t,n){if(null==e||""==e)return[];var t=t||[];if(void 0==n&&(n=this.getNode(e),null==n))return t;n.df>0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e<arguments.length;e++)t=arguments[e],~this.indexOf(t)||this.elements.splice(this.locationFor(t),0,t);this.length=this.elements.length},lunr.SortedSet.prototype.toArray=function(){return this.elements.slice()},lunr.SortedSet.prototype.map=function(e,t){return this.elements.map(e,t)},lunr.SortedSet.prototype.forEach=function(e,t){return this.elements.forEach(e,t)},lunr.SortedSet.prototype.indexOf=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]<u[i]?n++:s[n]>u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o<r.length;o++)i.add(r[o]);return i},lunr.SortedSet.prototype.toJSON=function(){return this.toArray()},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.elasticlunr=t()}(this,function(){return t})}(); \ No newline at end of file
diff --git a/book/pt-br/elasticlunr-ef4e11c1.min.js.gz b/book/pt-br/elasticlunr-ef4e11c1.min.js.gz
deleted file mode 100644
index f10a125..0000000
--- a/book/pt-br/elasticlunr-ef4e11c1.min.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/encryption.html b/book/pt-br/encryption.html
deleted file mode 100644
index 58604ec..0000000
--- a/book/pt-br/encryption.html
+++ /dev/null
@@ -1,294 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Criptografia e Tesseras Seladas - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="criptografia-e-tesseras-seladas"><a class="header" href="#criptografia-e-tesseras-seladas">Criptografia e Tesseras Seladas</a></h1>
-<p>A maioria das tesseras são públicas — projetadas para serem acessíveis a qualquer pessoa, para sempre. Mas algumas memórias precisam de privacidade. Tesseras suporta dois modos de visibilidade criptografada:</p>
-<ul>
-<li><strong>Privada</strong> — apenas o criador (e seus herdeiros) podem acessar o conteúdo</li>
-<li><strong>Selada</strong> — o conteúdo é bloqueado por tempo e se torna acessível após uma data específica</li>
-</ul>
-<p>Tesseras públicas nunca são criptografadas. Disponibilidade é mais importante que sigilo para preservação.</p>
-<h2 id="como-a-criptografia-funciona"><a class="header" href="#como-a-criptografia-funciona">Como a criptografia funciona</a></h2>
-<p>Quando você cria uma tessera privada ou selada, o seguinte acontece:</p>
-<ol>
-<li>Uma <strong>chave de conteúdo</strong> aleatória (256 bits) é gerada</li>
-<li>Cada arquivo de memória é criptografado com <strong>AES-256-GCM</strong> usando essa chave de conteúdo</li>
-<li>A chave de conteúdo é envolvida em um <strong>envelope de chave selada</strong> usando sua chave pública de criptografia</li>
-<li>A chave envolvida é armazenada junto ao conteúdo criptografado</li>
-</ol>
-<p>Apenas o detentor da chave privada correspondente pode desembrulhar a chave de conteúdo e decriptar o conteúdo.</p>
-<h2 id="encapsulamento-de-chave-híbrido-pós-quântico"><a class="header" href="#encapsulamento-de-chave-híbrido-pós-quântico">Encapsulamento de chave híbrido pós-quântico</a></h2>
-<p>O envelope de chave selada usa um <strong>Mecanismo de Encapsulamento de Chave (KEM) híbrido</strong> combinando dois algoritmos:</p>
-<ul>
-<li><strong>X25519</strong> — uma troca de chaves clássica bem testada baseada em curva elíptica</li>
-<li><strong>ML-KEM-768</strong> — um KEM pós-quântico baseado em reticulados padronizado pelo NIST (anteriormente Kyber)</li>
-</ul>
-<p>Ambos os algoritmos produzem segredos compartilhados que são combinados usando derivação de chaves BLAKE3. Um atacante precisa quebrar <strong>ambos</strong> os algoritmos para recuperar a chave de conteúdo. Isso segue o mesmo princípio das assinaturas duplas do Tesseras (Ed25519 + ML-DSA): não sabemos quais suposições criptográficas se manterão ao longo dos séculos, então apostamos nos dois.</p>
-<h2 id="dados-autenticados-associados-aad"><a class="header" href="#dados-autenticados-associados-aad">Dados autenticados associados (AAD)</a></h2>
-<p>AES-256-GCM suporta dados autenticados associados — informações extras que são verificadas durante a decriptação mas não são criptografadas. Tesseras vincula as seguintes informações no AAD:</p>
-<ul>
-<li>O <strong>hash do conteúdo</strong> da tessera (sempre)</li>
-<li>O <strong>timestamp open_after</strong> (apenas para tesseras seladas)</li>
-</ul>
-<p>Isso previne <strong>ataques de troca de texto cifrado</strong>: um atacante não pode copiar conteúdo criptografado de uma tessera para outra, porque o AAD não vai corresponder e a decriptação vai falhar. Para tesseras seladas, isso também significa que você não pode alterar a data do selo — o timestamp está criptograficamente vinculado ao texto cifrado.</p>
-<h2 id="tesseras-seladas-cápsulas-do-tempo"><a class="header" href="#tesseras-seladas-cápsulas-do-tempo">Tesseras seladas: cápsulas do tempo</a></h2>
-<p>Uma tessera selada é uma verdadeira cápsula do tempo. Quando você cria uma, você especifica uma data <code>open_after</code>. O conteúdo é criptografado e a chave é selada em um envelope que apenas você pode abrir.</p>
-<p>Quando a data <code>open_after</code> passa, o dono publica a chave de conteúdo como uma <strong>Publicação de Chave</strong> assinada — um artefato independente contendo a chave, o hash da tessera e a assinatura do dono. Outros nós podem verificar a assinatura e usar a chave publicada para decriptar o conteúdo.</p>
-<p>O manifesto da tessera nunca é modificado. A Publicação de Chave é um documento separado, preservando a natureza imutável e endereçada por conteúdo das tesseras.</p>
-<h2 id="e-as-chaves"><a class="header" href="#e-as-chaves">E as chaves?</a></h2>
-<p>Cada identidade agora inclui um <strong>par de chaves de criptografia</strong> junto ao par de chaves de assinatura:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Tipo de chave</th><th>Algoritmo</th><th>Finalidade</th></tr>
-</thead>
-<tbody>
-<tr><td>Ed25519</td><td>Clássico</td><td>Assinatura de manifestos e publicações de chave</td></tr>
-<tr><td>ML-DSA</td><td>Pós-quântico</td><td>Assinatura (quando habilitado)</td></tr>
-<tr><td>X25519</td><td>Clássico</td><td>Encapsulamento de chave (criptografia)</td></tr>
-<tr><td>ML-KEM-768</td><td>Pós-quântico</td><td>Encapsulamento de chave (criptografia)</td></tr>
-</tbody>
-</table>
-</div>
-<p>O par de chaves de criptografia é gerado quando a identidade é criada. A metade pública é armazenada no diretório de identidade da tessera; a metade privada fica no dispositivo do dono.</p>
-<h2 id="princípios-de-design"><a class="header" href="#princípios-de-design">Princípios de design</a></h2>
-<ul>
-<li><strong>Criptografar o mínimo possível</strong> — apenas conteúdo privado e selado é criptografado. Memórias públicas permanecem abertas para acessibilidade a longo prazo.</li>
-<li><strong>Algoritmos duplos desde o início</strong> — criptografia clássica e pós-quântica, para que o conteúdo esteja protegido mesmo que um algoritmo seja quebrado.</li>
-<li><strong>Manifestos imutáveis</strong> — chaves são publicadas separadamente, nunca modificando dados existentes.</li>
-<li><strong>Falhar fechado</strong> — o sistema rejeita tentativas de criar tesseras privadas ou seladas sem chaves de criptografia.</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="replication.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="heir-recovery.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="replication.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="heir-recovery.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/encryption.html.gz b/book/pt-br/encryption.html.gz
deleted file mode 100644
index 38b2eaa..0000000
--- a/book/pt-br/encryption.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/favicon-bfbdfe47.png b/book/pt-br/favicon-bfbdfe47.png
deleted file mode 100644
index aec48da..0000000
--- a/book/pt-br/favicon-bfbdfe47.png
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/OPEN-SANS-LICENSE.txt b/book/pt-br/fonts/OPEN-SANS-LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/book/pt-br/fonts/OPEN-SANS-LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/book/pt-br/fonts/OPEN-SANS-LICENSE.txt.gz b/book/pt-br/fonts/OPEN-SANS-LICENSE.txt.gz
deleted file mode 100644
index c6e887a..0000000
--- a/book/pt-br/fonts/OPEN-SANS-LICENSE.txt.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/SOURCE-CODE-PRO-LICENSE.txt b/book/pt-br/fonts/SOURCE-CODE-PRO-LICENSE.txt
deleted file mode 100644
index 366206f..0000000
--- a/book/pt-br/fonts/SOURCE-CODE-PRO-LICENSE.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
-
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/book/pt-br/fonts/SOURCE-CODE-PRO-LICENSE.txt.gz b/book/pt-br/fonts/SOURCE-CODE-PRO-LICENSE.txt.gz
deleted file mode 100644
index 74eeec0..0000000
--- a/book/pt-br/fonts/SOURCE-CODE-PRO-LICENSE.txt.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/fonts-9644e21d.css b/book/pt-br/fonts/fonts-9644e21d.css
deleted file mode 100644
index ce32fdc..0000000
--- a/book/pt-br/fonts/fonts-9644e21d.css
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */
-/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */
-
-/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: normal;
- font-weight: 300;
- src: local('Open Sans Light'), local('OpenSans-Light'),
- url('../fonts/open-sans-v17-all-charsets-300-7736aa35.woff2') format('woff2');
-}
-
-/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: italic;
- font-weight: 300;
- src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'),
- url('../fonts/open-sans-v17-all-charsets-300italic-2c7b95c0.woff2') format('woff2');
-}
-
-/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: normal;
- font-weight: 400;
- src: local('Open Sans Regular'), local('OpenSans-Regular'),
- url('../fonts/open-sans-v17-all-charsets-regular-2e3b1d34.woff2') format('woff2');
-}
-
-/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: italic;
- font-weight: 400;
- src: local('Open Sans Italic'), local('OpenSans-Italic'),
- url('../fonts/open-sans-v17-all-charsets-italic-6c9463f7.woff2') format('woff2');
-}
-
-/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: normal;
- font-weight: 600;
- src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'),
- url('../fonts/open-sans-v17-all-charsets-600-486c6759.woff2') format('woff2');
-}
-
-/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: italic;
- font-weight: 600;
- src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'),
- url('../fonts/open-sans-v17-all-charsets-600italic-1a3e8659.woff2') format('woff2');
-}
-
-/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: normal;
- font-weight: 700;
- src: local('Open Sans Bold'), local('OpenSans-Bold'),
- url('../fonts/open-sans-v17-all-charsets-700-c22fe8c7.woff2') format('woff2');
-}
-
-/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: italic;
- font-weight: 700;
- src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'),
- url('../fonts/open-sans-v17-all-charsets-700italic-238ae959.woff2') format('woff2');
-}
-
-/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: normal;
- font-weight: 800;
- src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'),
- url('../fonts/open-sans-v17-all-charsets-800-3d2c812a.woff2') format('woff2');
-}
-
-/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Open Sans';
- font-style: italic;
- font-weight: 800;
- src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'),
- url('../fonts/open-sans-v17-all-charsets-800italic-ba1521ec.woff2') format('woff2');
-}
-
-/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */
-@font-face {
- font-family: 'Source Code Pro';
- font-style: normal;
- font-weight: 500;
- src: url('../fonts/source-code-pro-v11-all-charsets-500-2bdd9410.woff2') format('woff2');
-}
diff --git a/book/pt-br/fonts/fonts-9644e21d.css.gz b/book/pt-br/fonts/fonts-9644e21d.css.gz
deleted file mode 100644
index c125db3..0000000
--- a/book/pt-br/fonts/fonts-9644e21d.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/open-sans-v17-all-charsets-300-7736aa35.woff2 b/book/pt-br/fonts/open-sans-v17-all-charsets-300-7736aa35.woff2
deleted file mode 100644
index 9f51be3..0000000
--- a/book/pt-br/fonts/open-sans-v17-all-charsets-300-7736aa35.woff2
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/open-sans-v17-all-charsets-300italic-2c7b95c0.woff2 b/book/pt-br/fonts/open-sans-v17-all-charsets-300italic-2c7b95c0.woff2
deleted file mode 100644
index 2f54544..0000000
--- a/book/pt-br/fonts/open-sans-v17-all-charsets-300italic-2c7b95c0.woff2
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/open-sans-v17-all-charsets-600-486c6759.woff2 b/book/pt-br/fonts/open-sans-v17-all-charsets-600-486c6759.woff2
deleted file mode 100644
index f503d55..0000000
--- a/book/pt-br/fonts/open-sans-v17-all-charsets-600-486c6759.woff2
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/open-sans-v17-all-charsets-600italic-1a3e8659.woff2 b/book/pt-br/fonts/open-sans-v17-all-charsets-600italic-1a3e8659.woff2
deleted file mode 100644
index c99aabe..0000000
--- a/book/pt-br/fonts/open-sans-v17-all-charsets-600italic-1a3e8659.woff2
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/open-sans-v17-all-charsets-700-c22fe8c7.woff2 b/book/pt-br/fonts/open-sans-v17-all-charsets-700-c22fe8c7.woff2
deleted file mode 100644
index 421a1ab..0000000
--- a/book/pt-br/fonts/open-sans-v17-all-charsets-700-c22fe8c7.woff2
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/open-sans-v17-all-charsets-700italic-238ae959.woff2 b/book/pt-br/fonts/open-sans-v17-all-charsets-700italic-238ae959.woff2
deleted file mode 100644
index 12ce3d2..0000000
--- a/book/pt-br/fonts/open-sans-v17-all-charsets-700italic-238ae959.woff2
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/open-sans-v17-all-charsets-800-3d2c812a.woff2 b/book/pt-br/fonts/open-sans-v17-all-charsets-800-3d2c812a.woff2
deleted file mode 100644
index c94a223..0000000
--- a/book/pt-br/fonts/open-sans-v17-all-charsets-800-3d2c812a.woff2
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/open-sans-v17-all-charsets-800italic-ba1521ec.woff2 b/book/pt-br/fonts/open-sans-v17-all-charsets-800italic-ba1521ec.woff2
deleted file mode 100644
index eed7d3c..0000000
--- a/book/pt-br/fonts/open-sans-v17-all-charsets-800italic-ba1521ec.woff2
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/open-sans-v17-all-charsets-italic-6c9463f7.woff2 b/book/pt-br/fonts/open-sans-v17-all-charsets-italic-6c9463f7.woff2
deleted file mode 100644
index 398b68a..0000000
--- a/book/pt-br/fonts/open-sans-v17-all-charsets-italic-6c9463f7.woff2
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/open-sans-v17-all-charsets-regular-2e3b1d34.woff2 b/book/pt-br/fonts/open-sans-v17-all-charsets-regular-2e3b1d34.woff2
deleted file mode 100644
index 8383e94..0000000
--- a/book/pt-br/fonts/open-sans-v17-all-charsets-regular-2e3b1d34.woff2
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/fonts/source-code-pro-v11-all-charsets-500-2bdd9410.woff2 b/book/pt-br/fonts/source-code-pro-v11-all-charsets-500-2bdd9410.woff2
deleted file mode 100644
index 7222456..0000000
--- a/book/pt-br/fonts/source-code-pro-v11-all-charsets-500-2bdd9410.woff2
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/heir-recovery.html b/book/pt-br/heir-recovery.html
deleted file mode 100644
index 3ac42ba..0000000
--- a/book/pt-br/heir-recovery.html
+++ /dev/null
@@ -1,314 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Recuperação de Chaves por Herdeiros - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="recuperação-de-chaves-por-herdeiros"><a class="header" href="#recuperação-de-chaves-por-herdeiros">Recuperação de Chaves por Herdeiros</a></h1>
-<p>Suas tesseras podem sobreviver a falhas de infraestrutura, computadores quânticos e séculos de tempo. Mas o que acontece quando você não consegue mais acessar suas próprias chaves? Tesseras usa <strong>Shamir’s Secret Sharing</strong> para permitir que você distribua sua identidade criptográfica para herdeiros de confiança.</p>
-<h2 id="como-funciona"><a class="header" href="#como-funciona">Como funciona</a></h2>
-<p>Shamir’s Secret Sharing divide um segredo em N fragmentos com um limiar T. Qualquer T fragmentos podem reconstruir o segredo original. Menos que T fragmentos não revelam <strong>nada</strong> — isso é informação-teoricamente seguro, não apenas computacionalmente difícil de quebrar.</p>
-<p>Por exemplo, com limiar 2 e 3 fragmentos totais:</p>
-<ul>
-<li>Dê o fragmento 1 ao seu cônjuge</li>
-<li>Dê o fragmento 2 ao seu irmão</li>
-<li>Dê o fragmento 3 ao seu advogado</li>
-</ul>
-<p>Quaisquer dois deles podem recuperar sua identidade. Um único fragmento sozinho é inútil.</p>
-<h2 id="criando-fragmentos-de-herdeiros"><a class="header" href="#criando-fragmentos-de-herdeiros">Criando fragmentos de herdeiros</a></h2>
-<pre><code class="language-bash">tes heir create --threshold 2 --shares 3
-</code></pre>
-<p>Isso divide sua chave de identidade Ed25519 em 3 fragmentos (necessitando 2 para reconstruir) e os salva em <code>./heir-shares/</code>:</p>
-<pre><code>heir-shares/
-├── heir_share_1.bin # Binário MessagePack
-├── heir_share_1.txt # Texto base64 legível por humanos
-├── heir_share_2.bin
-├── heir_share_2.txt
-├── heir_share_3.bin
-└── heir_share_3.txt
-</code></pre>
-<p>Cada fragmento é gerado em dois formatos:</p>
-<ul>
-<li><strong>Binário</strong> (<code>.bin</code>) — MessagePack compacto, adequado para pendrives ou armazenamento digital</li>
-<li><strong>Texto</strong> (<code>.txt</code>) — base64 com cabeçalho legível, adequado para impressão em papel</li>
-</ul>
-<p>O formato texto se parece com isso:</p>
-<pre><code>--- TESSERAS HEIR SHARE ---
-Format: v1
-Owner: a1b2c3d4e5f6a7b8 (fingerprint)
-Share: 1 of 3 (threshold: 2)
-Session: 9f8e7d6c5b4a3210
-Created: 2026-02-15
-
-&lt;dados codificados em base64&gt;
---- END HEIR SHARE ---
-</code></pre>
-<h2 id="reconstruindo-a-partir-de-fragmentos"><a class="header" href="#reconstruindo-a-partir-de-fragmentos">Reconstruindo a partir de fragmentos</a></h2>
-<p>Quando os herdeiros precisam recuperar a identidade:</p>
-<pre><code class="language-bash">tes heir reconstruct heir_share_1.txt heir_share_2.bin --output-dir ./recovered-keys
-</code></pre>
-<p>O comando detecta automaticamente se cada arquivo é formato binário ou texto. Ele valida que todos os fragmentos pertencem à mesma sessão e dono, verifica checksums e reconstrói o par de chaves Ed25519.</p>
-<p>Para instalar as chaves recuperadas como identidade ativa:</p>
-<pre><code class="language-bash">tes heir reconstruct share1.txt share2.txt --output-dir ./recovered --install
-</code></pre>
-<p>Isso faz backup da identidade atual antes de substituí-la.</p>
-<h2 id="inspecionando-um-fragmento"><a class="header" href="#inspecionando-um-fragmento">Inspecionando um fragmento</a></h2>
-<p>Para ver metadados sobre um fragmento sem expor dados secretos:</p>
-<pre><code class="language-bash">tes heir info heir_share_1.txt
-</code></pre>
-<p>Saída:</p>
-<pre><code>Heir Share Information:
- Format version: 1
- Share: 1 of 3 (threshold: 2)
- Session: 9f8e7d6c5b4a3210
- Owner fingerprint: a1b2c3d4e5f6a7b8
- Share data size: 34 bytes
- Checksum: valid
-</code></pre>
-<h2 id="considerações-de-segurança"><a class="header" href="#considerações-de-segurança">Considerações de segurança</a></h2>
-<ul>
-<li><strong>Escolha do limiar</strong>: um limiar de 2-de-3 ou 3-de-5 é recomendado para a maioria das pessoas. Limiares mais altos são mais seguros mas requerem mais herdeiros para cooperar.</li>
-<li><strong>Armazenamento físico</strong>: imprima os arquivos <code>.txt</code> em papel livre de ácido e armazene em locais físicos separados (cofres bancários, casas diferentes). Papel sobrevive décadas sem degradação.</li>
-<li><strong>Nunca armazene fragmentos juntos</strong>: todo o propósito da divisão é a distribuição. Manter todos os fragmentos em um lugar anula o objetivo.</li>
-<li><strong>Isolamento de sessão</strong>: cada chamada <code>heir create</code> gera um novo ID de sessão. Fragmentos de sessões diferentes não podem ser misturados — isso previne confusão após rotações de chave.</li>
-<li><strong>Verificação de checksum</strong>: cada fragmento inclui um checksum BLAKE3. Fragmentos corrompidos (erros de OCR, degradação de bits) são detectados antes de qualquer tentativa de reconstrução.</li>
-<li><strong>Re-dividir após mudanças de chave</strong>: se você regenerar sua identidade, crie novos fragmentos de herdeiros e destrua com segurança os antigos.</li>
-</ul>
-<h2 id="princípios-de-design"><a class="header" href="#princípios-de-design">Princípios de design</a></h2>
-<ul>
-<li><strong>Segurança informação-teórica</strong> — T-1 fragmentos revelam exatamente zero informação sobre o segredo. Isso não é uma suposição computacional; é matematicamente provado.</li>
-<li><strong>Detecção de corrupção</strong> — checksums BLAKE3 detectam degradação de bits, erros de OCR e truncamento antes de qualquer tentativa de reconstrução.</li>
-<li><strong>Resiliência de formato</strong> — saída dupla (binário + texto) garante que fragmentos sobrevivam a diferentes modos de falha de mídia de armazenamento.</li>
-<li><strong>Compatibilidade retroativa</strong> — o blob do segredo é versionado, para que versões futuras possam incluir material de chave adicional sem quebrar fragmentos existentes.</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="encryption.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="nat-traversal.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="encryption.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="nat-traversal.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/heir-recovery.html.gz b/book/pt-br/heir-recovery.html.gz
deleted file mode 100644
index 99fe4f4..0000000
--- a/book/pt-br/heir-recovery.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/highlight-493f70e1.css b/book/pt-br/highlight-493f70e1.css
deleted file mode 100644
index 352c79b..0000000
--- a/book/pt-br/highlight-493f70e1.css
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * An increased contrast highlighting scheme loosely based on the
- * "Base16 Atelier Dune Light" theme by Bram de Haan
- * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune)
- * Original Base16 color scheme by Chris Kempson
- * (https://github.com/chriskempson/base16)
- */
-
-/* Comment */
-.hljs-comment,
-.hljs-quote {
- color: #575757;
-}
-
-/* Red */
-.hljs-variable,
-.hljs-template-variable,
-.hljs-attribute,
-.hljs-attr,
-.hljs-tag,
-.hljs-name,
-.hljs-regexp,
-.hljs-link,
-.hljs-name,
-.hljs-selector-id,
-.hljs-selector-class {
- color: #d70025;
-}
-
-/* Orange */
-.hljs-number,
-.hljs-meta,
-.hljs-built_in,
-.hljs-builtin-name,
-.hljs-literal,
-.hljs-type,
-.hljs-params {
- color: #b21e00;
-}
-
-/* Green */
-.hljs-string,
-.hljs-symbol,
-.hljs-bullet {
- color: #008200;
-}
-
-/* Blue */
-.hljs-title,
-.hljs-section {
- color: #0030f2;
-}
-
-/* Purple */
-.hljs-keyword,
-.hljs-selector-tag {
- color: #9d00ec;
-}
-
-.hljs {
- display: block;
- overflow-x: auto;
- background: #f6f7f6;
- color: #000;
-}
-
-.hljs-emphasis {
- font-style: italic;
-}
-
-.hljs-strong {
- font-weight: bold;
-}
-
-.hljs-addition {
- color: #22863a;
- background-color: #f0fff4;
-}
-
-.hljs-deletion {
- color: #b31d28;
- background-color: #ffeef0;
-}
diff --git a/book/pt-br/highlight-493f70e1.css.gz b/book/pt-br/highlight-493f70e1.css.gz
deleted file mode 100644
index c8f4aaa..0000000
--- a/book/pt-br/highlight-493f70e1.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/highlight-abc7f01d.js b/book/pt-br/highlight-abc7f01d.js
deleted file mode 100644
index 18d2434..0000000
--- a/book/pt-br/highlight-abc7f01d.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- Highlight.js 10.1.1 (93fd0d73)
- License: BSD-3-Clause
- Copyright (c) 2006-2020, Ivan Sagalaev
-*/
-var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){s+="<"+a(e)+[].map.call(e.attributes,(function(e){return" "+e.nodeName+'="'+t(e.value)+'"'})).join("")+">"}function u(e){s+="</"+a(e)+">"}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="</span>",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=`<span class="${e}">`}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"<unnamed>")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i<e.length;i++){var s=r+=1,o=d(e[i]);for(i>0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"<br>":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ /]*>/g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);
-hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"</?",end:">",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}());
-hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}());
-hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"</",contains:[].concat(_,u,d,[s,{begin:"\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",end:">",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin:/</,end:/>/,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}());
-hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}());
-hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}());
-hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}());
-hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:"</?",end:">"}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());
-hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}());
-hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}());
-hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"string",variants:[e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{begin:"`",end:"`"}]},{className:"number",variants:[{begin:e.C_NUMBER_RE+"[i]",relevance:1},e.C_NUMBER_MODE]},{begin:/:=/},{className:"function",beginKeywords:"func",end:"\\s*(\\{|$)",excludeEnd:!0,contains:[e.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,keywords:n,illegal:/["']/}]}]}}}());
-hljs.registerLanguage("http",function(){"use strict";return function(e){var n="HTTP/[0-9\\.]+";return{name:"HTTP",aliases:["https"],illegal:"\\S",contains:[{begin:"^"+n,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+n+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:n},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}}());
-hljs.registerLanguage("ini",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(...n){return n.map(n=>e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}());
-hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}());
-hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:"</>"},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}());
-hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}());
-hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin:/</,end:/>/,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin:/</,end:/>/,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}());
-hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}());
-hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}());
-hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%<?\^\+\*]/}]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,i]},a={className:"variable",begin:/\$\([\w-]+\s/,end:/\)/,keywords:{built_in:"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value"},contains:[i]},r={begin:"^"+e.UNDERSCORE_IDENT_RE+"\\s*(?=[:+?]?=)"},s={className:"section",begin:/^[^\s]+:/,end:/$/,contains:[i]};return{name:"Makefile",aliases:["mk","mak"],keywords:{$pattern:/[\w-]+/,keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath"},contains:[e.HASH_COMMENT_MODE,i,n,a,r,{className:"meta",begin:/^\.PHONY:/,end:/$/,keywords:{$pattern:/[\.\w]+/,"meta-keyword":".PHONY"}},s]}}}());
-hljs.registerLanguage("xml",function(){"use strict";return function(e){var n={className:"symbol",begin:"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;"},a={begin:"\\s",contains:[{className:"meta-keyword",begin:"#?[a-z_][a-z1-9_-]+",illegal:"\\n"}]},s=e.inherit(a,{begin:"\\(",end:"\\)"}),t=e.inherit(e.APOS_STRING_MODE,{className:"meta-string"}),i=e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),c={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[n]},{begin:/'/,end:/'/,contains:[n]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"<![a-z]",end:">",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"<![a-z]",end:">",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:"<style(?=\\s|>)",end:">",keywords:{name:"style"},contains:[c],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>)",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}());
-hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}());
-hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());
-hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"</",contains:[{className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}());
-hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());
-hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());
-hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}());
-hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}());
-hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}());
-hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}());
-hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}());
-hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}());
-hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:"</",contains:[e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{contains:["self"]}),e.inherit(e.QUOTE_STRING_MODE,{begin:/b?"/,illegal:null}),{className:"string",variants:[{begin:/r(#*)"(.|\n)*?"\1(?!#)/},{begin:/b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/}]},{className:"symbol",begin:/'[a-zA-Z_][a-zA-Z0-9_]*/},{className:"number",variants:[{begin:"\\b0b([01_]+)"+n},{begin:"\\b0o([0-7_]+)"+n},{begin:"\\b0x([A-Fa-f0-9_]+)"+n},{begin:"\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)"+n}],relevance:0},{className:"function",beginKeywords:"fn",end:"(\\(|<)",excludeEnd:!0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"meta",begin:"#\\!?\\[",end:"\\]",contains:[{className:"meta-string",begin:/"/,end:/"/}]},{className:"class",beginKeywords:"type",end:";",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"\\S"},{className:"class",beginKeywords:"trait enum struct union",end:"{",contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{endsParent:!0})],illegal:"[\\w\\d]"},{begin:e.IDENT_RE+"::",keywords:{built_in:t}},{begin:"->"}]}}}());
-hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}());
-hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}());
-hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}());
-hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin:/</,end:/>/},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());
-hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}());
-hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}());
-hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}());
-hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}());
-hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}());
-hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}());
-hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}());
-hljs.registerLanguage("nim",function(){"use strict";return function(e){return{name:"Nim",aliases:["nim"],keywords:{keyword:"addr and as asm bind block break case cast const continue converter discard distinct div do elif else end enum except export finally for from func generic if import in include interface is isnot iterator let macro method mixin mod nil not notin object of or out proc ptr raise ref return shl shr static template try tuple type using var when while with without xor yield",literal:"shared guarded stdin stdout stderr result true false",built_in:"int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 bool char string cstring pointer expr stmt void auto any range array openarray varargs seq set clong culong cchar cschar cshort cint csize clonglong cfloat cdouble clongdouble cuchar cushort cuint culonglong cstringarray semistatic"},contains:[{className:"meta",begin:/{\./,end:/\.}/,relevance:10},{className:"string",begin:/[a-zA-Z]\w*"/,end:/"/,contains:[{begin:/""/}]},{className:"string",begin:/([a-zA-Z]\w*)?"""/,end:/"""/},e.QUOTE_STRING_MODE,{className:"type",begin:/\b[A-Z]\w+\b/,relevance:0},{className:"number",relevance:0,variants:[{begin:/\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/},{begin:/\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(\d[_\d]*)('?[iIuUfF](8|16|32|64))?/}]},e.HASH_COMMENT_MODE]}}}());
-hljs.registerLanguage("nix",function(){"use strict";return function(e){var n={keyword:"rec with let in inherit assert if else then",literal:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"},i={className:"subst",begin:/\$\{/,end:/}/,keywords:n},t={className:"string",contains:[i],variants:[{begin:"''",end:"''"},{begin:'"',end:'"'}]},s=[e.NUMBER_MODE,e.HASH_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t,{begin:/[a-zA-Z0-9-_]+(\s*=)/,returnBegin:!0,relevance:0,contains:[{className:"attr",begin:/\S+/}]}];return i.contains=s,{name:"Nix",aliases:["nixos"],keywords:n,contains:s}}}());
-hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}());
-hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}());
-hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}()); \ No newline at end of file
diff --git a/book/pt-br/highlight-abc7f01d.js.gz b/book/pt-br/highlight-abc7f01d.js.gz
deleted file mode 100644
index 675e895..0000000
--- a/book/pt-br/highlight-abc7f01d.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/images/logo.png b/book/pt-br/images/logo.png
deleted file mode 100644
index ae0d24d..0000000
--- a/book/pt-br/images/logo.png
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/index.html b/book/pt-br/index.html
deleted file mode 100644
index dfe310b..0000000
--- a/book/pt-br/index.html
+++ /dev/null
@@ -1,288 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Introdução - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="introdução"><a class="header" href="#introdução">Introdução</a></h1>
-<p>Tesseras é uma rede peer-to-peer para preservar memórias humanas através dos milênios. Cada pessoa cria uma <strong>tessera</strong> — uma cápsula do tempo autocontida de memórias (fotos, áudio, vídeo, texto) que sobrevive independentemente de qualquer software, empresa ou infraestrutura.</p>
-<h2 id="o-que-é-uma-tessera"><a class="header" href="#o-que-é-uma-tessera">O que é uma tessera?</a></h2>
-<p>A palavra <em>tessera</em> vem das pequenas peças usadas para fazer mosaicos no mundo antigo. No Tesseras, cada tessera é uma coleção de memórias empacotada em um formato projetado para ser compreendido mesmo daqui a milhares de anos, sem nenhum software especial.</p>
-<p>Uma tessera contém:</p>
-<ul>
-<li><strong>Memórias</strong> — fotos (JPEG), gravações de áudio (WAV), vídeo (WebM) e texto (UTF-8 puro)</li>
-<li><strong>Metadados</strong> — quando e onde cada memória foi criada, quem está envolvido e o que significa</li>
-<li><strong>Identidade</strong> — assinaturas criptográficas provando quem criou</li>
-<li><strong>Instruções de decodificação</strong> — explicações em texto puro de cada formato utilizado, para que humanos do futuro possam ler o conteúdo</li>
-</ul>
-<h2 id="filosofia-central"><a class="header" href="#filosofia-central">Filosofia central</a></h2>
-<ul>
-<li><strong>Sem dependência de empresas</strong> — suas memórias são suas, armazenadas localmente e replicadas em uma rede peer-to-peer</li>
-<li><strong>Sem aprisionamento de formato</strong> — cada tessera inclui instruções para decodificar seu conteúdo</li>
-<li><strong>Disponibilidade acima de sigilo</strong> — memórias públicas não são criptografadas, porque acessibilidade a longo prazo importa mais do que esconder coisas</li>
-<li><strong>Criptografia mínima</strong> — apenas conteúdo privado e selado é criptografado; todo o resto é aberto</li>
-<li><strong>Resistente a computadores quânticos</strong> — assinaturas duplas (Ed25519 + ML-DSA) protegem a integridade mesmo contra futuros computadores quânticos</li>
-</ul>
-<h2 id="status-atual-fase-4"><a class="header" href="#status-atual-fase-4">Status atual: Fase 4</a></h2>
-<p>Tesseras completou até a <strong>Fase 4</strong> — criptografia e tesseras seladas. O projeto agora cobre gerenciamento local de tesseras, rede, replicação, app mobile e privacidade criptográfica.</p>
-<p>O que está disponível hoje:</p>
-<ul>
-<li>Geração de identidade (par de chaves Ed25519 com prova de trabalho)</li>
-<li>Criação de tesseras a partir de arquivos locais</li>
-<li>Armazenamento endereçado por conteúdo (hashing BLAKE3)</li>
-<li>Verificação de integridade e exportação autocontida</li>
-<li>Daemon de nó completo com transporte QUIC</li>
-<li>Descoberta de pares via DHT Kademlia</li>
-<li>Publicação e busca de ponteiros de tesseras pela rede</li>
-<li>Codificação de apagamento Reed-Solomon com reparo automático de fragmentos</li>
-<li>App mobile Flutter com nó Rust P2P embarcado</li>
-<li><strong>Tesseras privadas</strong> — conteúdo criptografado que apenas o dono pode acessar</li>
-<li><strong>Tesseras seladas</strong> — conteúdo com bloqueio temporal que abre após uma data específica</li>
-<li><strong>Criptografia híbrida pós-quântica</strong> — encapsulamento de chaves X25519 + ML-KEM-768</li>
-<li><strong>AES-256-GCM</strong> para criptografia de conteúdo com vinculação AAD</li>
-</ul>
-<h2 id="conceitos-chave"><a class="header" href="#conceitos-chave">Conceitos-chave</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Conceito</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Tessera</strong></td><td>Uma cápsula do tempo autocontida de memórias</td></tr>
-<tr><td><strong>Memória</strong></td><td>Um item individual (foto, gravação, vídeo ou texto) dentro de uma tessera</td></tr>
-<tr><td><strong>Hash de conteúdo</strong></td><td>Um hash BLAKE3 que identifica unicamente uma tessera pelo seu conteúdo</td></tr>
-<tr><td><strong>Visibilidade</strong></td><td>Controla quem pode acessar uma tessera: pública, privada, selada ou círculo</td></tr>
-<tr><td><strong>Tessera selada</strong></td><td>Uma cápsula do tempo que só pode ser aberta após uma data específica</td></tr>
-<tr><td><strong>MANIFEST</strong></td><td>Um índice em texto puro listando cada arquivo na tessera com seu checksum</td></tr>
-<tr><td><strong>Tipo de memória</strong></td><td>Categoriza uma memória: momento, reflexão, cotidiano, relação ou objeto</td></tr>
-<tr><td><strong>Nó</strong></td><td>Um dispositivo executando o daemon Tesseras, participando da rede P2P</td></tr>
-<tr><td><strong>DHT</strong></td><td>Tabela hash distribuída — como os nós encontram ponteiros de tesseras sem um servidor central</td></tr>
-<tr><td><strong>Bootstrap</strong></td><td>O processo de entrar na rede contactando nós semente conhecidos</td></tr>
-</tbody>
-</table>
-</div>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
-
- <a rel="next prefetch" href="installation.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
-
- <a rel="next prefetch" href="installation.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/index.html.gz b/book/pt-br/index.html.gz
deleted file mode 100644
index a379183..0000000
--- a/book/pt-br/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/installation.html b/book/pt-br/installation.html
deleted file mode 100644
index 808e55e..0000000
--- a/book/pt-br/installation.html
+++ /dev/null
@@ -1,397 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Instalação - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="instalação"><a class="header" href="#instalação">Instalação</a></h1>
-<p>Tesseras está disponível atualmente através de compilação a partir do código-fonte.</p>
-<h2 id="pré-requisitos"><a class="header" href="#pré-requisitos">Pré-requisitos</a></h2>
-<h3 id="rust"><a class="header" href="#rust">Rust</a></h3>
-<p>Tesseras requer <strong>Rust 1.85 ou superior</strong>. A maneira recomendada de instalar o Rust é via <a href="https://rustup.rs/">rustup</a>:</p>
-<pre><code class="language-bash">curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
-</code></pre>
-<p>Após a instalação, certifique-se de que <code>~/.cargo/bin</code> está no seu <code>PATH</code>. O instalador normalmente adiciona isso automaticamente. Verifique com:</p>
-<pre><code class="language-bash">rustc --version
-cargo --version
-</code></pre>
-<p>Se você já tem o Rust instalado, atualize para a versão mais recente:</p>
-<pre><code class="language-bash">rustup update stable
-</code></pre>
-<h3 id="sqlite"><a class="header" href="#sqlite">SQLite</a></h3>
-<p>Tesseras usa SQLite para armazenamento local. Você tem duas opções:</p>
-<p><strong>Opção 1: SQLite do sistema (recomendada)</strong></p>
-<p>Instale as bibliotecas de desenvolvimento do SQLite pelo gerenciador de pacotes do seu sistema:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Distribuição</th><th>Comando</th></tr>
-</thead>
-<tbody>
-<tr><td>Arch Linux</td><td><code>sudo pacman -S sqlite</code></td></tr>
-<tr><td>Debian / Ubuntu</td><td><code>sudo apt install libsqlite3-dev</code></td></tr>
-<tr><td>Fedora</td><td><code>sudo dnf install sqlite-devel</code></td></tr>
-<tr><td>Alpine</td><td><code>apk add sqlite-dev</code></td></tr>
-<tr><td>macOS (Homebrew)</td><td><code>brew install sqlite</code></td></tr>
-<tr><td>FreeBSD</td><td><code>pkg install sqlite3</code></td></tr>
-<tr><td>OpenBSD</td><td>Já incluído no sistema base</td></tr>
-</tbody>
-</table>
-</div>
-<p><strong>Opção 2: SQLite embutido</strong></p>
-<p>Se preferir não instalar o SQLite no sistema, use a feature flag <code>bundled-sqlite</code> durante a compilação. Isso compila o SQLite junto com o Tesseras:</p>
-<pre><code class="language-bash">cargo install --path crates/tesseras-cli --features bundled-sqlite
-cargo install --path crates/tesseras-daemon --features bundled-sqlite
-</code></pre>
-<h3 id="ferramentas-opcionais"><a class="header" href="#ferramentas-opcionais">Ferramentas opcionais</a></h3>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Ferramenta</th><th>Para quê</th><th>Instalação</th></tr>
-</thead>
-<tbody>
-<tr><td><a href="https://github.com/casey/just">just</a></td><td>Executar comandos de build do projeto</td><td><code>cargo install just</code></td></tr>
-<tr><td><a href="https://rust-lang.github.io/mdBook/">mdBook</a></td><td>Compilar a documentação</td><td><code>cargo install mdbook</code></td></tr>
-<tr><td><a href="https://docs.docker.com/get-docker/">Docker</a></td><td>Executar nós em contêineres</td><td>Veja <a href="./docker.html">Docker</a></td></tr>
-<tr><td><a href="https://flutter.dev/docs/get-started/install">Flutter</a></td><td>Compilar o app mobile/desktop</td><td>Veja <a href="#app-flutter">App Flutter</a></td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="compilar-a-partir-do-código-fonte"><a class="header" href="#compilar-a-partir-do-código-fonte">Compilar a partir do código-fonte</a></h2>
-<p>Clone o repositório e instale os binários:</p>
-<pre><code class="language-bash">git clone https://git.sr.ht/~ijanc/tesseras
-cd tesseras
-cargo install --path crates/tesseras-cli
-cargo install --path crates/tesseras-daemon
-</code></pre>
-<p>Ou, se você tiver o <code>just</code> instalado:</p>
-<pre><code class="language-bash">just install
-</code></pre>
-<p>Isso instala dois binários em <code>~/.cargo/bin/</code> e configura auto-completions para o seu shell:</p>
-<ul>
-<li><code>tes</code> — ferramenta CLI para criar, verificar e exportar tesseras</li>
-<li><code>tesseras-daemon</code> — daemon de nó completo que participa da rede P2P</li>
-</ul>
-<h2 id="verificar-a-instalação"><a class="header" href="#verificar-a-instalação">Verificar a instalação</a></h2>
-<pre><code class="language-bash">tes --help
-</code></pre>
-<p>Você deverá ver:</p>
-<pre><code>Create and preserve human memories
-
-Usage: tes [OPTIONS] &lt;COMMAND&gt;
-
-Commands:
- init Initialize identity and local database
- create Create a tessera from a directory of files
- verify Verify integrity of a stored tessera
- export Export tessera to a self-contained directory
- list List local tesseras
- help Print this message or the help of the given subcommand(s)
-
-Options:
- --data-dir &lt;DATA_DIR&gt; Base directory for data storage [default: ~/.tesseras]
- -h, --help Print help
-</code></pre>
-<h2 id="auto-completions-do-shell"><a class="header" href="#auto-completions-do-shell">Auto-completions do shell</a></h2>
-<p>O comando <code>just install</code> configura completions automaticamente. Se você instalou manualmente, gere as completions para o seu shell:</p>
-<pre><code class="language-bash"># Fish
-tes completions fish &gt; ~/.config/fish/completions/tes.fish
-
-# Zsh
-tes completions zsh &gt; "${XDG_DATA_HOME:-$HOME/.local/share}/zsh/site-functions/_tes"
-
-# Bash
-tes completions bash &gt; "${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion/completions/tes"
-</code></pre>
-<h2 id="app-flutter"><a class="header" href="#app-flutter">App Flutter</a></h2>
-<p>Para compilar o app mobile ou desktop, você precisa de dependências adicionais:</p>
-<h3 id="pré-requisitos-do-flutter"><a class="header" href="#pré-requisitos-do-flutter">Pré-requisitos do Flutter</a></h3>
-<ol>
-<li><strong>Flutter SDK</strong> — instale seguindo o <a href="https://flutter.dev/docs/get-started/install">guia oficial</a></li>
-<li><strong>Rust</strong> — já instalado conforme acima</li>
-<li><strong>Dependências de plataforma:</strong></li>
-</ol>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Plataforma</th><th>Dependências</th></tr>
-</thead>
-<tbody>
-<tr><td>Android</td><td>Android SDK, Android NDK, Java 17+</td></tr>
-<tr><td>iOS</td><td>Xcode, CocoaPods</td></tr>
-<tr><td>Linux desktop</td><td>GTK 3.0+, pkg-config (<code>sudo apt install libgtk-3-dev pkg-config</code> no Debian/Ubuntu)</td></tr>
-<tr><td>macOS desktop</td><td>Xcode Command Line Tools</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="compilar-o-app"><a class="header" href="#compilar-o-app">Compilar o app</a></h3>
-<pre><code class="language-bash">cd apps/flutter
-flutter pub get
-
-# Linux desktop
-flutter build linux --debug
-
-# Android
-flutter build apk --debug
-
-# iOS
-flutter build ios --debug
-
-# Testes
-flutter test
-</code></pre>
-<p>Ou usando <code>just</code> a partir da raiz do repositório:</p>
-<pre><code class="language-bash">just build-linux # Linux desktop
-just build-android # Android APK
-just test-flutter # Testes
-</code></pre>
-<h2 id="portas-de-rede"><a class="header" href="#portas-de-rede">Portas de rede</a></h2>
-<p>O daemon Tesseras usa QUIC (protocolo sobre UDP). Se você estiver atrás de um firewall, permita tráfego na porta:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Protocolo</th><th>Porta</th><th>Direção</th></tr>
-</thead>
-<tbody>
-<tr><td>UDP</td><td>4433</td><td>Entrada e saída</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="próximos-passos"><a class="header" href="#próximos-passos">Próximos passos</a></h2>
-<ul>
-<li><a href="./quick-start.html">Início Rápido</a> — crie sua primeira tessera</li>
-<li><a href="./running-a-node.html">Executando um Nó</a> — configure e execute o daemon</li>
-<li><a href="./configuration.html">Configuração</a> — opções de configuração</li>
-<li><a href="./docker.html">Docker</a> — execute em contêineres</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="introduction.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="quick-start.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="introduction.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="quick-start.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/installation.html.gz b/book/pt-br/installation.html.gz
deleted file mode 100644
index da81572..0000000
--- a/book/pt-br/installation.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/introduction.html b/book/pt-br/introduction.html
deleted file mode 100644
index dfe310b..0000000
--- a/book/pt-br/introduction.html
+++ /dev/null
@@ -1,288 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Introdução - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="introdução"><a class="header" href="#introdução">Introdução</a></h1>
-<p>Tesseras é uma rede peer-to-peer para preservar memórias humanas através dos milênios. Cada pessoa cria uma <strong>tessera</strong> — uma cápsula do tempo autocontida de memórias (fotos, áudio, vídeo, texto) que sobrevive independentemente de qualquer software, empresa ou infraestrutura.</p>
-<h2 id="o-que-é-uma-tessera"><a class="header" href="#o-que-é-uma-tessera">O que é uma tessera?</a></h2>
-<p>A palavra <em>tessera</em> vem das pequenas peças usadas para fazer mosaicos no mundo antigo. No Tesseras, cada tessera é uma coleção de memórias empacotada em um formato projetado para ser compreendido mesmo daqui a milhares de anos, sem nenhum software especial.</p>
-<p>Uma tessera contém:</p>
-<ul>
-<li><strong>Memórias</strong> — fotos (JPEG), gravações de áudio (WAV), vídeo (WebM) e texto (UTF-8 puro)</li>
-<li><strong>Metadados</strong> — quando e onde cada memória foi criada, quem está envolvido e o que significa</li>
-<li><strong>Identidade</strong> — assinaturas criptográficas provando quem criou</li>
-<li><strong>Instruções de decodificação</strong> — explicações em texto puro de cada formato utilizado, para que humanos do futuro possam ler o conteúdo</li>
-</ul>
-<h2 id="filosofia-central"><a class="header" href="#filosofia-central">Filosofia central</a></h2>
-<ul>
-<li><strong>Sem dependência de empresas</strong> — suas memórias são suas, armazenadas localmente e replicadas em uma rede peer-to-peer</li>
-<li><strong>Sem aprisionamento de formato</strong> — cada tessera inclui instruções para decodificar seu conteúdo</li>
-<li><strong>Disponibilidade acima de sigilo</strong> — memórias públicas não são criptografadas, porque acessibilidade a longo prazo importa mais do que esconder coisas</li>
-<li><strong>Criptografia mínima</strong> — apenas conteúdo privado e selado é criptografado; todo o resto é aberto</li>
-<li><strong>Resistente a computadores quânticos</strong> — assinaturas duplas (Ed25519 + ML-DSA) protegem a integridade mesmo contra futuros computadores quânticos</li>
-</ul>
-<h2 id="status-atual-fase-4"><a class="header" href="#status-atual-fase-4">Status atual: Fase 4</a></h2>
-<p>Tesseras completou até a <strong>Fase 4</strong> — criptografia e tesseras seladas. O projeto agora cobre gerenciamento local de tesseras, rede, replicação, app mobile e privacidade criptográfica.</p>
-<p>O que está disponível hoje:</p>
-<ul>
-<li>Geração de identidade (par de chaves Ed25519 com prova de trabalho)</li>
-<li>Criação de tesseras a partir de arquivos locais</li>
-<li>Armazenamento endereçado por conteúdo (hashing BLAKE3)</li>
-<li>Verificação de integridade e exportação autocontida</li>
-<li>Daemon de nó completo com transporte QUIC</li>
-<li>Descoberta de pares via DHT Kademlia</li>
-<li>Publicação e busca de ponteiros de tesseras pela rede</li>
-<li>Codificação de apagamento Reed-Solomon com reparo automático de fragmentos</li>
-<li>App mobile Flutter com nó Rust P2P embarcado</li>
-<li><strong>Tesseras privadas</strong> — conteúdo criptografado que apenas o dono pode acessar</li>
-<li><strong>Tesseras seladas</strong> — conteúdo com bloqueio temporal que abre após uma data específica</li>
-<li><strong>Criptografia híbrida pós-quântica</strong> — encapsulamento de chaves X25519 + ML-KEM-768</li>
-<li><strong>AES-256-GCM</strong> para criptografia de conteúdo com vinculação AAD</li>
-</ul>
-<h2 id="conceitos-chave"><a class="header" href="#conceitos-chave">Conceitos-chave</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Conceito</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Tessera</strong></td><td>Uma cápsula do tempo autocontida de memórias</td></tr>
-<tr><td><strong>Memória</strong></td><td>Um item individual (foto, gravação, vídeo ou texto) dentro de uma tessera</td></tr>
-<tr><td><strong>Hash de conteúdo</strong></td><td>Um hash BLAKE3 que identifica unicamente uma tessera pelo seu conteúdo</td></tr>
-<tr><td><strong>Visibilidade</strong></td><td>Controla quem pode acessar uma tessera: pública, privada, selada ou círculo</td></tr>
-<tr><td><strong>Tessera selada</strong></td><td>Uma cápsula do tempo que só pode ser aberta após uma data específica</td></tr>
-<tr><td><strong>MANIFEST</strong></td><td>Um índice em texto puro listando cada arquivo na tessera com seu checksum</td></tr>
-<tr><td><strong>Tipo de memória</strong></td><td>Categoriza uma memória: momento, reflexão, cotidiano, relação ou objeto</td></tr>
-<tr><td><strong>Nó</strong></td><td>Um dispositivo executando o daemon Tesseras, participando da rede P2P</td></tr>
-<tr><td><strong>DHT</strong></td><td>Tabela hash distribuída — como os nós encontram ponteiros de tesseras sem um servidor central</td></tr>
-<tr><td><strong>Bootstrap</strong></td><td>O processo de entrar na rede contactando nós semente conhecidos</td></tr>
-</tbody>
-</table>
-</div>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
-
- <a rel="next prefetch" href="installation.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
-
- <a rel="next prefetch" href="installation.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/introduction.html.gz b/book/pt-br/introduction.html.gz
deleted file mode 100644
index 401c44a..0000000
--- a/book/pt-br/introduction.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/mark-09e88c2c.min.js b/book/pt-br/mark-09e88c2c.min.js
deleted file mode 100644
index 1636231..0000000
--- a/book/pt-br/mark-09e88c2c.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!***************************************************
-* mark.js v8.11.1
-* https://markjs.io/
-* Copyright (c) 2014–2018, Julian Kühnel
-* Released under the MIT license https://git.io/vwTVl
-*****************************************************/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Mark=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=function(){function e(n){var r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&o(c)};s||u(),a.forEach(function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach(function(e,t){e.val===n&&(i=t,o=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o,a=this,s=this.createIterator(t,e,r),c=[],u=[],l=void 0,h=void 0;void 0,o=a.getIteratorNode(s),h=o.prevNode,l=o.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(l,h,e,c)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return u.push(e)},r)}),u.push(l);u.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(c,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach(function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,function(){--a<=0&&i()})};r.iframes?r.waitForIframes(o,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),o=function(){function e(n){t(this,e),this.opt=r({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},n)}return n(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm"+(this.opt.caseSensitive?"":"i"))}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynonyms(a)+"|"+this.processSynonyms(s)+")"+r))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="";switch(("string"==typeof n?[]:n.limiters).forEach(function(e){i+="|"+t.escapeStr(e)}),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=o.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,i){for(var o=t.length,a=1;a<o;a++){var s=e.textContent.indexOf(t[a]);t[a]&&s>-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,i))}return e}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];){if(o.opt.separateGroups)t=o.separateGroups(t,i,a,n,r);else{if(!n(i[a],t))continue;var s=i.index;if(0!==a)for(var c=1;c<a;c++)s+=i[c].length;t=o.wrapGroups(t,s,i[a].length,r)}e.lastIndex=0}}),i()})}},{key:"wrapMatchesAcrossElements",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){for(var s=void 0;null!==(s=e.exec(t.value))&&""!==s[a];){var c=s.index;if(0!==a)for(var u=1;u<a;u++)c+=s[u].length;var l=c+s[a].length;o.wrapRangeInMappedTextNode(t,c,l,function(e){return n(s[a],e)},function(t,n){e.lastIndex=n,r(t)})}i()})}},{key:"wrapRangeFromIndex",value:function(e,t,n,r){var i=this;this.getTextNodes(function(o){var a=o.value.length;e.forEach(function(e,r){var s=i.checkWhitespaceRanges(e,a,o.value),c=s.start,u=s.end;s.valid&&i.wrapRangeInMappedTextNode(o,c,u,function(n){return t(n,e,o.value.substring(c,u),r)},function(t){n(t,e)})}),r()})}},{key:"unwrapMatches",value:function(e){for(var t=e.parentNode,n=document.createDocumentFragment();e.firstChild;)n.appendChild(e.removeChild(e.firstChild));t.replaceChild(n,e),this.ie?this.normalizeTextNode(t):t.normalize()}},{key:"normalizeTextNode",value:function(e){if(e){if(3===e.nodeType)for(;e.nextSibling&&3===e.nextSibling.nodeType;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}},{key:"markRegExp",value:function(e,t){var n=this;this.opt=t,this.log('Searching with expression "'+e+'"');var r=0,i="wrapMatches";this.opt.acrossElements&&(i="wrapMatchesAcrossElements"),this[i](e,this.opt.ignoreGroups,function(e,t){return n.opt.filter(t,e,r)},function(e){r++,n.opt.each(e)},function(){0===r&&n.opt.noMatch(e),n.opt.done(r)})}},{key:"mark",value:function(e,t){var n=this;this.opt=t;var r=0,i="wrapMatches",a=this.getSeparatedKeywords("string"==typeof e?[e]:e),s=a.keywords,c=a.length;this.opt.acrossElements&&(i="wrapMatchesAcrossElements"),0===c?this.opt.done(r):function e(t){var a=new o(n.opt).create(t),u=0;n.log('Searching with expression "'+a+'"'),n[i](a,1,function(e,i){return n.opt.filter(i,t,r,u)},function(e){u++,r++,n.opt.each(e)},function(){0===u&&n.opt.noMatch(t),s[c-1]===t?n.opt.done(r):e(s[s.indexOf(t)+1])})}(s[0])}},{key:"markRanges",value:function(e,t){var n=this;this.opt=t;var r=0,i=this.checkRanges(e);i&&i.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(i)),this.wrapRangeFromIndex(i,function(e,t,r,i){return n.opt.filter(e,t,r,i)},function(e,t){r++,n.opt.each(e,t)},function(){n.opt.done(r)})):this.opt.done(r)}},{key:"unmark",value:function(e){var t=this;this.opt=e;var n=this.opt.element?this.opt.element:"*";n+="[data-markjs]",this.opt.className&&(n+="."+this.opt.className),this.log('Removal selector "'+n+'"'),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,function(e){t.unwrapMatches(e)},function(e){var r=i.matches(e,n),o=t.matchesExclude(e);return!r||o?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}},{key:"opt",set:function(e){this._opt=r({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,acrossElements:!1,ignoreGroups:0,each:function(){},noMatch:function(){},filter:function(){return!0},done:function(){},debug:!1,log:window.console},e)},get:function(){return this._opt}},{key:"iterator",get:function(){return new i(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}}]),a}();return function(e){var t=this,n=new a(e);return this.mark=function(e,r){return n.mark(e,r),t},this.markRegExp=function(e,r){return n.markRegExp(e,r),t},this.markRanges=function(e,r){return n.markRanges(e,r),t},this.unmark=function(e){return n.unmark(e),t},this}});
diff --git a/book/pt-br/mark-09e88c2c.min.js.gz b/book/pt-br/mark-09e88c2c.min.js.gz
deleted file mode 100644
index 6c4a8a5..0000000
--- a/book/pt-br/mark-09e88c2c.min.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/nat-traversal.html b/book/pt-br/nat-traversal.html
deleted file mode 100644
index 9f71da9..0000000
--- a/book/pt-br/nat-traversal.html
+++ /dev/null
@@ -1,334 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Travessia de NAT - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="travessia-de-nat"><a class="header" href="#travessia-de-nat">Travessia de NAT</a></h1>
-<p>A maioria dos dispositivos na internet ficam atras de um <strong>NAT</strong> (Network Address Translator). Seu roteador atribui ao seu dispositivo um endereco privado (como <code>192.168.1.100</code>) e o traduz para um endereco publico quando voce conecta para fora. Isso funciona bem para navegar na web, mas cria um problema para redes P2P: dois dispositivos atras de NATs diferentes nao conseguem se conectar diretamente sem ajuda.</p>
-<p>Tesseras resolve isso com uma abordagem em tres camadas, tentando a opcao mais barata primeiro:</p>
-<ol>
-<li><strong>Conexao direta</strong> — se ambos os nos tem IPs publicos, eles conectam diretamente</li>
-<li><strong>UDP hole punching</strong> — um terceiro no apresenta os dois peers para que eles possam furar seus NATs</li>
-<li><strong>Relay</strong> — um no com IP publico encaminha pacotes entre os dois peers</li>
-</ol>
-<h2 id="descoberta-do-tipo-de-nat"><a class="header" href="#descoberta-do-tipo-de-nat">Descoberta do tipo de NAT</a></h2>
-<p>Quando um no inicia, ele envia requisicoes STUN (Session Traversal Utilities for NAT) para multiplos servidores publicos. Comparando os enderecos externos que esses servidores reportam, o no classifica seu NAT:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Tipo de NAT</th><th>O que significa</th><th>Hole punching?</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Public</strong></td><td>Sem NAT — seu dispositivo tem IP publico</td><td>Nao necessario</td></tr>
-<tr><td><strong>Cone</strong></td><td>NAT mapeia a mesma porta interna para a mesma porta externa independente do destino</td><td>Funciona bem (~80%)</td></tr>
-<tr><td><strong>Symmetric</strong></td><td>NAT atribui uma porta externa diferente para cada destino</td><td>Nao confiavel</td></tr>
-<tr><td><strong>Unknown</strong></td><td>Nao conseguiu alcancar servidores STUN</td><td>Relay necessario</td></tr>
-</tbody>
-</table>
-</div>
-<p>Seu no divulga seu tipo de NAT em mensagens Pong do DHT, para que outros nos saibam se hole punching vale a pena tentar.</p>
-<h2 id="hole-punching"><a class="header" href="#hole-punching">Hole punching</a></h2>
-<p>Quando o no A (atras de um NAT Cone) quer conectar ao no B (tambem atras de um NAT Cone), nenhum consegue alcancar o outro diretamente. A solucao:</p>
-<ol>
-<li>
-<p>A envia uma mensagem <strong>PunchIntro</strong> ao no I (um introdutor — qualquer no com IP publico que ambos conhecam). A mensagem inclui o endereco externo de A (do STUN) e uma assinatura Ed25519 provando a identidade de A.</p>
-</li>
-<li>
-<p>I verifica a assinatura e encaminha um <strong>PunchRequest</strong> a B, incluindo o endereco de A e a assinatura original.</p>
-</li>
-<li>
-<p>B verifica a assinatura (provando que a requisicao realmente veio de A, nao de uma fonte falsificada). B entao envia um pacote UDP para o endereco externo de A — isso abre um pinhole no NAT de B. B tambem envia uma mensagem <strong>PunchReady</strong> de volta a A com o endereco externo de B.</p>
-</li>
-<li>
-<p>A envia um pacote UDP para o endereco externo de B. Ambos os NATs agora tem pinholes, e os dois nos podem se comunicar diretamente.</p>
-</li>
-</ol>
-<p>O processo inteiro leva 2-5 segundos. As assinaturas Ed25519 previnem <strong>ataques de reflexao</strong>, onde um atacante reproduz uma introducao antiga para redirecionar trafego.</p>
-<h2 id="fallback-por-relay"><a class="header" href="#fallback-por-relay">Fallback por relay</a></h2>
-<p>Quando hole punching falha (NAT Symmetric, firewalls estritos ou redes corporativas), nos usam relay atraves de um no com IP publico:</p>
-<ol>
-<li>A envia um <strong>RelayRequest</strong> ao no R (um no com IP publico com relay habilitado).</li>
-<li>R cria uma sessao e envia um <strong>RelayOffer</strong> a ambos A e B, contendo o endereco do relay e um token de sessao.</li>
-<li>A e B enviam seus pacotes a R, prefixados com o token de sessao. R remove o token e encaminha o payload ao outro peer.</li>
-</ol>
-<p>Sessoes de relay tem limites de largura de banda:</p>
-<ul>
-<li><strong>256 KB/s</strong> para peers com boa reciprocidade (eles armazenam fragmentos para outros)</li>
-<li><strong>64 KB/s</strong> para peers sem reciprocidade</li>
-<li>Sessoes nao reciprocas sao limitadas a 10 minutos</li>
-</ul>
-<p>Isso incentiva nos a contribuir armazenamento — bons cidadaos da rede recebem melhor servico de relay.</p>
-<h2 id="migracao-de-endereco"><a class="header" href="#migracao-de-endereco">Migracao de endereco</a></h2>
-<p>Quando um dispositivo movel troca de rede (Wi-Fi para celular), seu endereco IP muda. Ao inves de encerrar e reconstruir sessoes de relay, o no envia uma mensagem <strong>RelayMigrate</strong> assinada para atualizar seu endereco na sessao existente. Isso evita reestabelecer conexoes do zero.</p>
-<h2 id="configuracao"><a class="header" href="#configuracao">Configuracao</a></h2>
-<p>A secao <code>[nat]</code> na configuracao do daemon controla a travessia de NAT:</p>
-<pre><code class="language-toml">[nat]
-# Servidores STUN para deteccao de tipo de NAT
-stun_servers = ["stun.l.google.com:19302", "stun.cloudflare.com:3478"]
-
-# Habilitar relay (encaminhar trafego para outros nos com NAT)
-relay_enabled = false
-
-# Maximo de sessoes de relay simultaneas
-relay_max_sessions = 50
-
-# Limite de largura de banda para peers reciprocos (KB/s)
-relay_reciprocal_kbps = 256
-
-# Limite de largura de banda para peers nao reciprocos (KB/s)
-relay_bootstrap_kbps = 64
-
-# Timeout de inatividade de sessao relay (segundos)
-relay_idle_timeout_secs = 60
-</code></pre>
-<p>Para executar um no relay, defina <code>relay_enabled = true</code>. Seu no deve ter um IP publico (ou roteador com port forwarding) para servir como relay.</p>
-<h2 id="reconexao-mobile"><a class="header" href="#reconexao-mobile">Reconexao mobile</a></h2>
-<p>Quando o app Tesseras detecta uma mudanca de rede em um dispositivo movel, ele executa uma sequencia de reconexao em tres fases:</p>
-<ol>
-<li><strong>Migracao QUIC</strong> (0-2s) — QUIC suporta migracao de conexao nativamente. O app tenta migrar todas as conexoes ativas para o novo endereco.</li>
-<li><strong>Re-STUN</strong> (2-5s) — descobre o novo endereco externo e re-anuncia ao DHT.</li>
-<li><strong>Reestabelecimento</strong> (5-10s) — reconecta peers que a migracao nao conseguiu salvar, em ordem de prioridade: nos bootstrap primeiro, depois nos que guardam seus fragmentos, depois nos cujos fragmentos voce guarda.</li>
-</ol>
-<p>O app mostra progresso de reconexao atraves do stream de eventos <code>NetworkChanged</code>.</p>
-<h2 id="monitoramento"><a class="header" href="#monitoramento">Monitoramento</a></h2>
-<p>A travessia de NAT expoe metricas Prometheus em <code>/metrics</code>:</p>
-<ul>
-<li><code>tesseras_nat_type</code> — tipo de NAT detectado atualmente</li>
-<li><code>tesseras_stun_requests_total</code> / <code>tesseras_stun_failures_total</code> — confiabilidade STUN</li>
-<li><code>tesseras_punch_attempts_total{initiator_nat, target_nat}</code> — taxa de sucesso de punch por par de NAT</li>
-<li><code>tesseras_relay_sessions_active</code> — carga atual de relay</li>
-<li><code>tesseras_relay_bytes_forwarded</code> — largura de banda total de relay</li>
-<li><code>tesseras_network_change_total</code> — frequencia de mudanca de rede no mobile</li>
-</ul>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="heir-recovery.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="docker.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="heir-recovery.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="docker.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/nat-traversal.html.gz b/book/pt-br/nat-traversal.html.gz
deleted file mode 100644
index ff2e09e..0000000
--- a/book/pt-br/nat-traversal.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/network-concepts.html b/book/pt-br/network-concepts.html
deleted file mode 100644
index 0f675a6..0000000
--- a/book/pt-br/network-concepts.html
+++ /dev/null
@@ -1,285 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Conceitos de Rede - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="conceitos-de-rede"><a class="header" href="#conceitos-de-rede">Conceitos de Rede</a></h1>
-<p>Este capitulo explica como os nos do Tesseras se encontram e localizam ponteiros de tesseras na rede. Voce nao precisa entender esses detalhes para usar o Tesseras, mas eles ajudam a explicar o que o daemon esta fazendo em segundo plano.</p>
-<h2 id="como-os-nos-se-encontram"><a class="header" href="#como-os-nos-se-encontram">Como os nos se encontram</a></h2>
-<p>Tesseras usa uma <strong>tabela hash distribuida (DHT) Kademlia</strong> — um algoritmo comprovado usado pelo BitTorrent e outros sistemas P2P por mais de 20 anos. Nao ha servidor central. Cada no mantem uma tabela de roteamento dos pares que conhece, e os nos cooperam para direcionar consultas ao lugar certo.</p>
-<p>Quando seu no inicia, ele contacta um ou mais <strong>nos de bootstrap</strong> (nos semente com enderecos conhecidos). Atraves dessas conexoes iniciais, seu no descobre outros pares e constroi sua tabela de roteamento. Com o tempo, seu no naturalmente aprende sobre mais pares conforme participa da rede.</p>
-<h2 id="o-que-a-dht-armazena"><a class="header" href="#o-que-a-dht-armazena">O que a DHT armazena</a></h2>
-<p>A DHT armazena <strong>ponteiros</strong>, nao dados. Um ponteiro e um registro leve que diz “a tessera X esta com os nos Y e Z.” Quando alguem quer recuperar uma tessera, primeiro busca seu ponteiro na DHT para descobrir quais nos a possuem, depois conecta diretamente a esses nos para baixar os dados reais.</p>
-<p>Isso significa que a DHT permanece pequena e rapida — ela rastreia apenas quem tem o que, nao o conteudo em si.</p>
-<h2 id="identidade-do-no-e-prova-de-trabalho"><a class="header" href="#identidade-do-no-e-prova-de-trabalho">Identidade do no e prova de trabalho</a></h2>
-<p>Cada no tem um <strong>ID de no</strong> de 160 bits derivado de sua chave publica. Para evitar que um atacante crie milhares de nos falsos de forma barata (um <strong>ataque Sybil</strong>), gerar um ID de no requer uma pequena prova de trabalho: o no deve encontrar um nonce tal que <code>BLAKE3(chave_publica || nonce)</code> comece com 8 bits zero.</p>
-<p>Isso leva cerca de 256 tentativas de hash — menos de um segundo em qualquer dispositivo, incluindo um Raspberry Pi. Mas um atacante tentando criar 10.000 identidades falsas precisaria de milhoes de tentativas, tornando o ataque impraticavel.</p>
-<h2 id="distancia-xor"><a class="header" href="#distancia-xor">Distancia XOR</a></h2>
-<p>Kademlia define “proximidade” entre nos usando a <strong>metrica XOR</strong>: a distancia entre dois IDs de no e seu XOR bit a bit. Os nos sao responsaveis por armazenar ponteiros cujas chaves estao proximas de seu proprio ID (em distancia XOR). Isso distribui dados uniformemente pela rede sem nenhuma coordenacao.</p>
-<p>Ao buscar um ponteiro de tessera, seu no pergunta aos pares que conhece que estao mais proximos da chave alvo. Esses pares apontam para outros ainda mais proximos, e assim por diante, ate que o ponteiro seja encontrado. Essa <strong>busca iterativa</strong> tipicamente alcanca qualquer no na rede em poucos saltos.</p>
-<h2 id="transporte-quic"><a class="header" href="#transporte-quic">Transporte: QUIC</a></h2>
-<p>Toda comunicacao entre nos usa <strong>QUIC</strong>, um protocolo de transporte moderno construido sobre UDP. O QUIC oferece:</p>
-<ul>
-<li><strong>Criptografia integrada</strong> — cada conexao usa TLS 1.3</li>
-<li><strong>Amigavel a NAT</strong> — funciona atraves da maioria dos tradutores de endereco de rede por ser baseado em UDP</li>
-<li><strong>Multiplexacao</strong> — multiplas operacoes independentes sobre uma conexao sem bloqueio head-of-line</li>
-<li><strong>Migracao de conexao</strong> — sobrevive a mudancas de rede (ex: trocar de Wi-Fi para dados moveis)</li>
-</ul>
-<p>O daemon escuta na porta UDP <strong>4433</strong> por padrao.</p>
-<h2 id="processo-de-bootstrap"><a class="header" href="#processo-de-bootstrap">Processo de bootstrap</a></h2>
-<p>Quando um no inicia, ele segue esta sequencia:</p>
-<ol>
-<li><strong>Contactar nos semente</strong> — conectar a um ou mais enderecos de bootstrap conhecidos</li>
-<li><strong>Trocar pings</strong> — verificar que o semente esta vivo e trocar identidades de no</li>
-<li><strong>Auto-busca</strong> — perguntar ao semente por nos proximos ao seu proprio ID, para popular sua tabela de roteamento</li>
-<li><strong>Descoberta iterativa</strong> — contactar os nos recem-descobertos, que apontam para ainda mais pares</li>
-</ol>
-<p>Apos o bootstrap, o no mantem sua tabela de roteamento automaticamente: ele atualiza buckets periodicamente e substitui pares nao responsivos por novos.</p>
-<h2 id="tipos-de-no"><a class="header" href="#tipos-de-no">Tipos de no</a></h2>
-<p>Nem todo dispositivo participa da rede da mesma forma:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Tipo</th><th>Descricao</th><th>Sempre ligado?</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>No completo</strong></td><td>Desktop, servidor ou Raspberry Pi executando <code>tesseras-daemon</code>. Participa plenamente da DHT e armazena dados de outros nos.</td><td>Sim</td></tr>
-<tr><td><strong>No movel</strong></td><td>Celular ou tablet executando o app Tesseras. Participa da DHT quando o app esta ativo.</td><td>Nao</td></tr>
-<tr><td><strong>No navegador</strong></td><td>Navegador web executando o cliente WASM. Conecta via um no relay. Somente leitura.</td><td>Nao</td></tr>
-<tr><td><strong>No IoT</strong></td><td>ESP32 ou dispositivo similar na rede local. Armazena fragmentos passivamente, nao participa da DHT.</td><td>Sim</td></tr>
-</tbody>
-</table>
-</div>
-<p>O daemon de no completo e a espinha dorsal da rede. Quanto mais nos completos em execucao, mais resiliente a rede se torna.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="configuration.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="replication.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="configuration.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="replication.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/network-concepts.html.gz b/book/pt-br/network-concepts.html.gz
deleted file mode 100644
index 7bc955a..0000000
--- a/book/pt-br/network-concepts.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/print.html b/book/pt-br/print.html
deleted file mode 100644
index c8e30ce..0000000
--- a/book/pt-br/print.html
+++ /dev/null
@@ -1,1532 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Guia do Usuário Tesseras</title>
- <meta name="robots" content="noindex">
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="introdução"><a class="header" href="#introdução">Introdução</a></h1>
-<p>Tesseras é uma rede peer-to-peer para preservar memórias humanas através dos milênios. Cada pessoa cria uma <strong>tessera</strong> — uma cápsula do tempo autocontida de memórias (fotos, áudio, vídeo, texto) que sobrevive independentemente de qualquer software, empresa ou infraestrutura.</p>
-<h2 id="o-que-é-uma-tessera"><a class="header" href="#o-que-é-uma-tessera">O que é uma tessera?</a></h2>
-<p>A palavra <em>tessera</em> vem das pequenas peças usadas para fazer mosaicos no mundo antigo. No Tesseras, cada tessera é uma coleção de memórias empacotada em um formato projetado para ser compreendido mesmo daqui a milhares de anos, sem nenhum software especial.</p>
-<p>Uma tessera contém:</p>
-<ul>
-<li><strong>Memórias</strong> — fotos (JPEG), gravações de áudio (WAV), vídeo (WebM) e texto (UTF-8 puro)</li>
-<li><strong>Metadados</strong> — quando e onde cada memória foi criada, quem está envolvido e o que significa</li>
-<li><strong>Identidade</strong> — assinaturas criptográficas provando quem criou</li>
-<li><strong>Instruções de decodificação</strong> — explicações em texto puro de cada formato utilizado, para que humanos do futuro possam ler o conteúdo</li>
-</ul>
-<h2 id="filosofia-central"><a class="header" href="#filosofia-central">Filosofia central</a></h2>
-<ul>
-<li><strong>Sem dependência de empresas</strong> — suas memórias são suas, armazenadas localmente e replicadas em uma rede peer-to-peer</li>
-<li><strong>Sem aprisionamento de formato</strong> — cada tessera inclui instruções para decodificar seu conteúdo</li>
-<li><strong>Disponibilidade acima de sigilo</strong> — memórias públicas não são criptografadas, porque acessibilidade a longo prazo importa mais do que esconder coisas</li>
-<li><strong>Criptografia mínima</strong> — apenas conteúdo privado e selado é criptografado; todo o resto é aberto</li>
-<li><strong>Resistente a computadores quânticos</strong> — assinaturas duplas (Ed25519 + ML-DSA) protegem a integridade mesmo contra futuros computadores quânticos</li>
-</ul>
-<h2 id="status-atual-fase-4"><a class="header" href="#status-atual-fase-4">Status atual: Fase 4</a></h2>
-<p>Tesseras completou até a <strong>Fase 4</strong> — criptografia e tesseras seladas. O projeto agora cobre gerenciamento local de tesseras, rede, replicação, app mobile e privacidade criptográfica.</p>
-<p>O que está disponível hoje:</p>
-<ul>
-<li>Geração de identidade (par de chaves Ed25519 com prova de trabalho)</li>
-<li>Criação de tesseras a partir de arquivos locais</li>
-<li>Armazenamento endereçado por conteúdo (hashing BLAKE3)</li>
-<li>Verificação de integridade e exportação autocontida</li>
-<li>Daemon de nó completo com transporte QUIC</li>
-<li>Descoberta de pares via DHT Kademlia</li>
-<li>Publicação e busca de ponteiros de tesseras pela rede</li>
-<li>Codificação de apagamento Reed-Solomon com reparo automático de fragmentos</li>
-<li>App mobile Flutter com nó Rust P2P embarcado</li>
-<li><strong>Tesseras privadas</strong> — conteúdo criptografado que apenas o dono pode acessar</li>
-<li><strong>Tesseras seladas</strong> — conteúdo com bloqueio temporal que abre após uma data específica</li>
-<li><strong>Criptografia híbrida pós-quântica</strong> — encapsulamento de chaves X25519 + ML-KEM-768</li>
-<li><strong>AES-256-GCM</strong> para criptografia de conteúdo com vinculação AAD</li>
-</ul>
-<h2 id="conceitos-chave"><a class="header" href="#conceitos-chave">Conceitos-chave</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Conceito</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Tessera</strong></td><td>Uma cápsula do tempo autocontida de memórias</td></tr>
-<tr><td><strong>Memória</strong></td><td>Um item individual (foto, gravação, vídeo ou texto) dentro de uma tessera</td></tr>
-<tr><td><strong>Hash de conteúdo</strong></td><td>Um hash BLAKE3 que identifica unicamente uma tessera pelo seu conteúdo</td></tr>
-<tr><td><strong>Visibilidade</strong></td><td>Controla quem pode acessar uma tessera: pública, privada, selada ou círculo</td></tr>
-<tr><td><strong>Tessera selada</strong></td><td>Uma cápsula do tempo que só pode ser aberta após uma data específica</td></tr>
-<tr><td><strong>MANIFEST</strong></td><td>Um índice em texto puro listando cada arquivo na tessera com seu checksum</td></tr>
-<tr><td><strong>Tipo de memória</strong></td><td>Categoriza uma memória: momento, reflexão, cotidiano, relação ou objeto</td></tr>
-<tr><td><strong>Nó</strong></td><td>Um dispositivo executando o daemon Tesseras, participando da rede P2P</td></tr>
-<tr><td><strong>DHT</strong></td><td>Tabela hash distribuída — como os nós encontram ponteiros de tesseras sem um servidor central</td></tr>
-<tr><td><strong>Bootstrap</strong></td><td>O processo de entrar na rede contactando nós semente conhecidos</td></tr>
-</tbody>
-</table>
-</div>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="instalação"><a class="header" href="#instalação">Instalação</a></h1>
-<p>Tesseras está disponível atualmente através de compilação a partir do código-fonte.</p>
-<h2 id="pré-requisitos"><a class="header" href="#pré-requisitos">Pré-requisitos</a></h2>
-<h3 id="rust"><a class="header" href="#rust">Rust</a></h3>
-<p>Tesseras requer <strong>Rust 1.85 ou superior</strong>. A maneira recomendada de instalar o Rust é via <a href="https://rustup.rs/">rustup</a>:</p>
-<pre><code class="language-bash">curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
-</code></pre>
-<p>Após a instalação, certifique-se de que <code>~/.cargo/bin</code> está no seu <code>PATH</code>. O instalador normalmente adiciona isso automaticamente. Verifique com:</p>
-<pre><code class="language-bash">rustc --version
-cargo --version
-</code></pre>
-<p>Se você já tem o Rust instalado, atualize para a versão mais recente:</p>
-<pre><code class="language-bash">rustup update stable
-</code></pre>
-<h3 id="sqlite"><a class="header" href="#sqlite">SQLite</a></h3>
-<p>Tesseras usa SQLite para armazenamento local. Você tem duas opções:</p>
-<p><strong>Opção 1: SQLite do sistema (recomendada)</strong></p>
-<p>Instale as bibliotecas de desenvolvimento do SQLite pelo gerenciador de pacotes do seu sistema:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Distribuição</th><th>Comando</th></tr>
-</thead>
-<tbody>
-<tr><td>Arch Linux</td><td><code>sudo pacman -S sqlite</code></td></tr>
-<tr><td>Debian / Ubuntu</td><td><code>sudo apt install libsqlite3-dev</code></td></tr>
-<tr><td>Fedora</td><td><code>sudo dnf install sqlite-devel</code></td></tr>
-<tr><td>Alpine</td><td><code>apk add sqlite-dev</code></td></tr>
-<tr><td>macOS (Homebrew)</td><td><code>brew install sqlite</code></td></tr>
-<tr><td>FreeBSD</td><td><code>pkg install sqlite3</code></td></tr>
-<tr><td>OpenBSD</td><td>Já incluído no sistema base</td></tr>
-</tbody>
-</table>
-</div>
-<p><strong>Opção 2: SQLite embutido</strong></p>
-<p>Se preferir não instalar o SQLite no sistema, use a feature flag <code>bundled-sqlite</code> durante a compilação. Isso compila o SQLite junto com o Tesseras:</p>
-<pre><code class="language-bash">cargo install --path crates/tesseras-cli --features bundled-sqlite
-cargo install --path crates/tesseras-daemon --features bundled-sqlite
-</code></pre>
-<h3 id="ferramentas-opcionais"><a class="header" href="#ferramentas-opcionais">Ferramentas opcionais</a></h3>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Ferramenta</th><th>Para quê</th><th>Instalação</th></tr>
-</thead>
-<tbody>
-<tr><td><a href="https://github.com/casey/just">just</a></td><td>Executar comandos de build do projeto</td><td><code>cargo install just</code></td></tr>
-<tr><td><a href="https://rust-lang.github.io/mdBook/">mdBook</a></td><td>Compilar a documentação</td><td><code>cargo install mdbook</code></td></tr>
-<tr><td><a href="https://docs.docker.com/get-docker/">Docker</a></td><td>Executar nós em contêineres</td><td>Veja <a href="#docker">Docker</a></td></tr>
-<tr><td><a href="https://flutter.dev/docs/get-started/install">Flutter</a></td><td>Compilar o app mobile/desktop</td><td>Veja <a href="#app-flutter">App Flutter</a></td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="compilar-a-partir-do-código-fonte"><a class="header" href="#compilar-a-partir-do-código-fonte">Compilar a partir do código-fonte</a></h2>
-<p>Clone o repositório e instale os binários:</p>
-<pre><code class="language-bash">git clone https://git.sr.ht/~ijanc/tesseras
-cd tesseras
-cargo install --path crates/tesseras-cli
-cargo install --path crates/tesseras-daemon
-</code></pre>
-<p>Ou, se você tiver o <code>just</code> instalado:</p>
-<pre><code class="language-bash">just install
-</code></pre>
-<p>Isso instala dois binários em <code>~/.cargo/bin/</code> e configura auto-completions para o seu shell:</p>
-<ul>
-<li><code>tes</code> — ferramenta CLI para criar, verificar e exportar tesseras</li>
-<li><code>tesseras-daemon</code> — daemon de nó completo que participa da rede P2P</li>
-</ul>
-<h2 id="verificar-a-instalação"><a class="header" href="#verificar-a-instalação">Verificar a instalação</a></h2>
-<pre><code class="language-bash">tes --help
-</code></pre>
-<p>Você deverá ver:</p>
-<pre><code>Create and preserve human memories
-
-Usage: tes [OPTIONS] &lt;COMMAND&gt;
-
-Commands:
- init Initialize identity and local database
- create Create a tessera from a directory of files
- verify Verify integrity of a stored tessera
- export Export tessera to a self-contained directory
- list List local tesseras
- help Print this message or the help of the given subcommand(s)
-
-Options:
- --data-dir &lt;DATA_DIR&gt; Base directory for data storage [default: ~/.tesseras]
- -h, --help Print help
-</code></pre>
-<h2 id="auto-completions-do-shell"><a class="header" href="#auto-completions-do-shell">Auto-completions do shell</a></h2>
-<p>O comando <code>just install</code> configura completions automaticamente. Se você instalou manualmente, gere as completions para o seu shell:</p>
-<pre><code class="language-bash"># Fish
-tes completions fish &gt; ~/.config/fish/completions/tes.fish
-
-# Zsh
-tes completions zsh &gt; "${XDG_DATA_HOME:-$HOME/.local/share}/zsh/site-functions/_tes"
-
-# Bash
-tes completions bash &gt; "${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion/completions/tes"
-</code></pre>
-<h2 id="app-flutter"><a class="header" href="#app-flutter">App Flutter</a></h2>
-<p>Para compilar o app mobile ou desktop, você precisa de dependências adicionais:</p>
-<h3 id="pré-requisitos-do-flutter"><a class="header" href="#pré-requisitos-do-flutter">Pré-requisitos do Flutter</a></h3>
-<ol>
-<li><strong>Flutter SDK</strong> — instale seguindo o <a href="https://flutter.dev/docs/get-started/install">guia oficial</a></li>
-<li><strong>Rust</strong> — já instalado conforme acima</li>
-<li><strong>Dependências de plataforma:</strong></li>
-</ol>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Plataforma</th><th>Dependências</th></tr>
-</thead>
-<tbody>
-<tr><td>Android</td><td>Android SDK, Android NDK, Java 17+</td></tr>
-<tr><td>iOS</td><td>Xcode, CocoaPods</td></tr>
-<tr><td>Linux desktop</td><td>GTK 3.0+, pkg-config (<code>sudo apt install libgtk-3-dev pkg-config</code> no Debian/Ubuntu)</td></tr>
-<tr><td>macOS desktop</td><td>Xcode Command Line Tools</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="compilar-o-app"><a class="header" href="#compilar-o-app">Compilar o app</a></h3>
-<pre><code class="language-bash">cd apps/flutter
-flutter pub get
-
-# Linux desktop
-flutter build linux --debug
-
-# Android
-flutter build apk --debug
-
-# iOS
-flutter build ios --debug
-
-# Testes
-flutter test
-</code></pre>
-<p>Ou usando <code>just</code> a partir da raiz do repositório:</p>
-<pre><code class="language-bash">just build-linux # Linux desktop
-just build-android # Android APK
-just test-flutter # Testes
-</code></pre>
-<h2 id="portas-de-rede"><a class="header" href="#portas-de-rede">Portas de rede</a></h2>
-<p>O daemon Tesseras usa QUIC (protocolo sobre UDP). Se você estiver atrás de um firewall, permita tráfego na porta:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Protocolo</th><th>Porta</th><th>Direção</th></tr>
-</thead>
-<tbody>
-<tr><td>UDP</td><td>4433</td><td>Entrada e saída</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="próximos-passos"><a class="header" href="#próximos-passos">Próximos passos</a></h2>
-<ul>
-<li><a href="#início-rápido">Início Rápido</a> — crie sua primeira tessera</li>
-<li><a href="#executando-um-no">Executando um Nó</a> — configure e execute o daemon</li>
-<li><a href="#configuracao">Configuração</a> — opções de configuração</li>
-<li><a href="#docker">Docker</a> — execute em contêineres</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="início-rápido"><a class="header" href="#início-rápido">Início Rápido</a></h1>
-<p>Este tutorial guia você por um fluxo completo: criar uma identidade, construir uma tessera a partir de arquivos, verificá-la e exportá-la.</p>
-<h2 id="1-inicializar-sua-identidade"><a class="header" href="#1-inicializar-sua-identidade">1. Inicializar sua identidade</a></h2>
-<p>Primeiro, configure sua identidade local e banco de dados:</p>
-<pre><code class="language-bash">tes init
-</code></pre>
-<pre><code>Generated Ed25519 identity
-Database initialized
-Config written to /home/user/.tesseras/config.toml
-Tesseras initialized at /home/user/.tesseras
-</code></pre>
-<p>Isso cria:</p>
-<ul>
-<li><code>~/.tesseras/identity/</code> — seu par de chaves Ed25519</li>
-<li><code>~/.tesseras/db/</code> — banco de dados SQLite para indexação</li>
-<li><code>~/.tesseras/blobs/</code> — armazenamento para arquivos de memória</li>
-<li><code>~/.tesseras/config.toml</code> — arquivo de configuração</li>
-</ul>
-<h2 id="2-preparar-seus-arquivos"><a class="header" href="#2-preparar-seus-arquivos">2. Preparar seus arquivos</a></h2>
-<p>Crie um diretório com as memórias que deseja preservar:</p>
-<pre><code class="language-bash">mkdir minhas-memorias
-cp ~/fotos/jantar-familia.jpg minhas-memorias/
-cp ~/fotos/jardim.jpg minhas-memorias/
-echo "Uma tarde quente de domingo com a família." &gt; minhas-memorias/reflexao.txt
-</code></pre>
-<p>Formatos suportados: <code>.jpg</code>, <code>.jpeg</code>, <code>.png</code> (imagens), <code>.wav</code> (áudio), <code>.webm</code> (vídeo), <code>.txt</code> (texto).</p>
-<h2 id="3-pré-visualizar-com-dry-run"><a class="header" href="#3-pré-visualizar-com-dry-run">3. Pré-visualizar com dry run</a></h2>
-<p>Veja o que seria incluído sem criar nada:</p>
-<pre><code class="language-bash">tes create minhas-memorias --dry-run
-</code></pre>
-<h2 id="4-criar-uma-tessera"><a class="header" href="#4-criar-uma-tessera">4. Criar uma tessera</a></h2>
-<pre><code class="language-bash">tes create minhas-memorias --tags "familia,domingo" --location "Casa"
-</code></pre>
-<p>A saída inclui o hash de conteúdo — uma string hexadecimal de 64 caracteres que identifica unicamente sua tessera. Copie-o para os próximos passos.</p>
-<h2 id="5-listar-suas-tesseras"><a class="header" href="#5-listar-suas-tesseras">5. Listar suas tesseras</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>Hash Created Memories Size Visibility
-9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public
-</code></pre>
-<h2 id="6-verificar-integridade"><a class="header" href="#6-verificar-integridade">6. Verificar integridade</a></h2>
-<p>Use o hash de conteúdo para verificar que todos os arquivos estão intactos e a assinatura é válida:</p>
-<pre><code class="language-bash">tes verify 9f2c4a1b3e7d8f0c...
-</code></pre>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0c...
-Signature: VALID
- [OK] memories/a1b2c3/media.jpg
- [OK] memories/d4e5f6/media.jpg
- [OK] memories/g7h8i9/media.txt
-Verification: PASSED
-</code></pre>
-<h2 id="7-exportar-uma-cópia-autocontida"><a class="header" href="#7-exportar-uma-cópia-autocontida">7. Exportar uma cópia autocontida</a></h2>
-<p>Exporte a tessera para um diretório que pode ser lido sem o Tesseras:</p>
-<pre><code class="language-bash">tes export 9f2c4a1b3e7d8f0c... ./backup
-</code></pre>
-<pre><code>Exported to ./backup/tessera-9f2c4a1b3e7d8f0c...
-</code></pre>
-<h2 id="8-inspecionar-a-exportação"><a class="header" href="#8-inspecionar-a-exportação">8. Inspecionar a exportação</a></h2>
-<p>O diretório exportado é totalmente autocontido:</p>
-<pre><code>tessera-9f2c4a1b3e7d8f0c.../
-├── MANIFEST # Índice em texto puro com checksums
-├── README.decode # Como ler esta tessera sem software
-├── identity/
-│ ├── creator.pub.ed25519 # Sua chave pública
-│ └── signature.ed25519.sig # Assinatura do MANIFEST
-├── memories/
-│ ├── &lt;hash&gt;/
-│ │ ├── media.jpg # A foto
-│ │ ├── context.txt # Descrição em texto puro
-│ │ └── meta.json # Metadados estruturados
-│ └── .../
-└── decode/
- ├── formats.txt # Explicação de todos os formatos usados
- ├── jpeg.txt # Como decodificar JPEG
- └── json.txt # Como decodificar JSON
-</code></pre>
-<p>Tudo que um leitor futuro precisa para entender o conteúdo está incluído no próprio diretório — nenhum software Tesseras é necessário.</p>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="tes-init"><a class="header" href="#tes-init">tes init</a></h1>
-<p>Inicializar identidade e banco de dados local.</p>
-<h2 id="uso"><a class="header" href="#uso">Uso</a></h2>
-<pre><code class="language-bash">tes init
-</code></pre>
-<h2 id="descrição"><a class="header" href="#descrição">Descrição</a></h2>
-<p>Configura seu ambiente Tesseras local. Este é o primeiro comando que você deve executar após instalar o Tesseras.</p>
-<p>O comando cria:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Caminho</th><th>Conteúdo</th></tr>
-</thead>
-<tbody>
-<tr><td><code>~/.tesseras/identity/</code></td><td>Par de chaves Ed25519 para assinar tesseras</td></tr>
-<tr><td><code>~/.tesseras/db/</code></td><td>Banco de dados SQLite para indexação</td></tr>
-<tr><td><code>~/.tesseras/blobs/</code></td><td>Armazenamento de blobs para arquivos de memória</td></tr>
-<tr><td><code>~/.tesseras/config.toml</code></td><td>Arquivo de configuração</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="opções"><a class="header" href="#opções">Opções</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opção</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;CAMINHO&gt;</code></td><td>Diretório base para armazenamento de dados (padrão: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="idempotente"><a class="header" href="#idempotente">Idempotente</a></h2>
-<p>Executar <code>init</code> novamente é seguro. Se uma identidade já existe, ela é preservada:</p>
-<pre><code class="language-bash">tes init
-</code></pre>
-<pre><code>Ed25519 identity already exists
-Database initialized
-Tesseras initialized at /home/user/.tesseras
-</code></pre>
-<h2 id="diretório-de-dados-personalizado"><a class="header" href="#diretório-de-dados-personalizado">Diretório de dados personalizado</a></h2>
-<pre><code class="language-bash">tes --data-dir /mnt/usb/tesseras init
-</code></pre>
-<p>Isso cria toda a estrutura de diretórios em <code>/mnt/usb/tesseras/</code> ao invés do local padrão.</p>
-<h2 id="o-que-acontece-internamente"><a class="header" href="#o-que-acontece-internamente">O que acontece internamente</a></h2>
-<ol>
-<li>Cria a estrutura de diretórios (<code>identity/</code>, <code>db/</code>, <code>blobs/</code>)</li>
-<li>Gera um par de chaves Ed25519 (a chave privada permanece local, a chave pública identifica você)</li>
-<li>Executa as migrações SQLite para configurar o esquema do banco de dados</li>
-<li>Escreve um <code>config.toml</code> padrão</li>
-</ol>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="tes-create"><a class="header" href="#tes-create">tes create</a></h1>
-<p>Criar uma tessera a partir de um diretório de arquivos.</p>
-<h2 id="uso-1"><a class="header" href="#uso-1">Uso</a></h2>
-<pre><code class="language-bash">tes create &lt;CAMINHO&gt; [OPÇÕES]
-</code></pre>
-<h2 id="argumentos"><a class="header" href="#argumentos">Argumentos</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argumento</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;CAMINHO&gt;</code></td><td>Diretório contendo os arquivos a incluir</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="opções-1"><a class="header" href="#opções-1">Opções</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opção</th><th>Descrição</th><th>Padrão</th></tr>
-</thead>
-<tbody>
-<tr><td><code>-n, --non-interactive</code></td><td>Pular prompts</td><td>desativado</td></tr>
-<tr><td><code>--dry-run</code></td><td>Pré-visualizar o que seria incluído</td><td>desativado</td></tr>
-<tr><td><code>--visibility &lt;VALOR&gt;</code></td><td>Nível de visibilidade: <code>public</code>, <code>private</code>, <code>circle</code></td><td><code>public</code></td></tr>
-<tr><td><code>--language &lt;CÓDIGO&gt;</code></td><td>Código de idioma (ex.: <code>en</code>, <code>pt-BR</code>)</td><td><code>en</code></td></tr>
-<tr><td><code>--tags &lt;LISTA&gt;</code></td><td>Tags separadas por vírgula</td><td>nenhuma</td></tr>
-<tr><td><code>--location &lt;DESC&gt;</code></td><td>Descrição do local</td><td>nenhuma</td></tr>
-<tr><td><code>--data-dir &lt;CAMINHO&gt;</code></td><td>Diretório base para armazenamento de dados</td><td><code>~/.tesseras</code></td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="formatos-de-arquivo-suportados"><a class="header" href="#formatos-de-arquivo-suportados">Formatos de arquivo suportados</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Extensão</th><th>Tipo</th><th>Tipo de memória</th></tr>
-</thead>
-<tbody>
-<tr><td><code>.jpg</code>, <code>.jpeg</code></td><td>Imagem (JPEG)</td><td>Momento</td></tr>
-<tr><td><code>.png</code></td><td>Imagem (PNG)</td><td>Momento</td></tr>
-<tr><td><code>.wav</code></td><td>Áudio (WAV PCM)</td><td>Momento</td></tr>
-<tr><td><code>.webm</code></td><td>Vídeo (WebM)</td><td>Momento</td></tr>
-<tr><td><code>.txt</code></td><td>Texto puro (UTF-8)</td><td>Reflexão</td></tr>
-</tbody>
-</table>
-</div>
-<p>Arquivos com outras extensões são ignorados.</p>
-<h2 id="inferência-de-tipo-de-memória"><a class="header" href="#inferência-de-tipo-de-memória">Inferência de tipo de memória</a></h2>
-<p>O comando atribui automaticamente um tipo de memória baseado no formato do arquivo:</p>
-<ul>
-<li><strong>Arquivos de texto</strong> (<code>.txt</code>) são classificados como <strong>Reflexão</strong> — pensamentos, crenças ou opiniões</li>
-<li><strong>Todos os outros formatos</strong> são classificados como <strong>Momento</strong> — uma foto, gravação ou vídeo de algo acontecendo</li>
-</ul>
-<h2 id="exemplos"><a class="header" href="#exemplos">Exemplos</a></h2>
-<h3 id="pré-visualizar-antes-de-criar"><a class="header" href="#pré-visualizar-antes-de-criar">Pré-visualizar antes de criar</a></h3>
-<pre><code class="language-bash">tes create ./minhas-fotos --dry-run
-</code></pre>
-<h3 id="criar-com-metadados"><a class="header" href="#criar-com-metadados">Criar com metadados</a></h3>
-<pre><code class="language-bash">tes create ./ferias-2026 \
- --tags "ferias,verao,praia" \
- --location "Florianópolis, Brasil" \
- --language pt-BR \
- --visibility public
-</code></pre>
-<h3 id="modo-não-interativo"><a class="header" href="#modo-não-interativo">Modo não-interativo</a></h3>
-<pre><code class="language-bash">tes create ./diario --non-interactive --tags "cotidiano"
-</code></pre>
-<h2 id="níveis-de-visibilidade"><a class="header" href="#níveis-de-visibilidade">Níveis de visibilidade</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Nível</th><th>Quem pode acessar</th></tr>
-</thead>
-<tbody>
-<tr><td><code>public</code></td><td>Qualquer pessoa (padrão)</td></tr>
-<tr><td><code>private</code></td><td>Apenas você (e herdeiros designados)</td></tr>
-<tr><td><code>circle</code></td><td>Pessoas explicitamente escolhidas</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="o-que-acontece-internamente-1"><a class="header" href="#o-que-acontece-internamente-1">O que acontece internamente</a></h2>
-<ol>
-<li>Varre o diretório em busca de arquivos suportados</li>
-<li>Calcula um hash BLAKE3 para cada arquivo</li>
-<li>Atribui um tipo de memória baseado na extensão do arquivo</li>
-<li>Gera um MANIFEST listando todos os arquivos com seus checksums</li>
-<li>Assina o MANIFEST com sua chave privada Ed25519</li>
-<li>Armazena os arquivos e metadados no banco de dados local</li>
-<li>Exibe o hash de conteúdo que identifica unicamente esta tessera</li>
-</ol>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="tes-verify"><a class="header" href="#tes-verify">tes verify</a></h1>
-<p>Verificar integridade de uma tessera armazenada.</p>
-<h2 id="uso-2"><a class="header" href="#uso-2">Uso</a></h2>
-<pre><code class="language-bash">tes verify &lt;HASH&gt;
-</code></pre>
-<h2 id="argumentos-1"><a class="header" href="#argumentos-1">Argumentos</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argumento</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;HASH&gt;</code></td><td>Hash de conteúdo da tessera (64 caracteres hexadecimais)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="opções-2"><a class="header" href="#opções-2">Opções</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opção</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;CAMINHO&gt;</code></td><td>Diretório base para armazenamento de dados (padrão: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="o-que-é-verificado"><a class="header" href="#o-que-é-verificado">O que é verificado</a></h2>
-<ol>
-<li><strong>Validade da assinatura</strong> — verifica a assinatura Ed25519 sobre o MANIFEST</li>
-<li><strong>Integridade dos arquivos</strong> — recalcula o hash BLAKE3 de cada arquivo e compara com o MANIFEST</li>
-</ol>
-<h2 id="códigos-de-saída"><a class="header" href="#códigos-de-saída">Códigos de saída</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Código</th><th>Significado</th></tr>
-</thead>
-<tbody>
-<tr><td><code>0</code></td><td>Verificação passou — todos os arquivos intactos, assinatura válida</td></tr>
-<tr><td><code>1</code></td><td>Verificação falhou — arquivos corrompidos ou assinatura inválida</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="exemplos-1"><a class="header" href="#exemplos-1">Exemplos</a></h2>
-<h3 id="verificação-bem-sucedida"><a class="header" href="#verificação-bem-sucedida">Verificação bem-sucedida</a></h3>
-<pre><code class="language-bash">tes verify 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-</code></pre>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-Signature: VALID
- [OK] memories/a1b2c3d4/media.jpg
- [OK] memories/e5f6a7b8/media.txt
- [OK] memories/c9d0e1f2/media.wav
-Verification: PASSED
-</code></pre>
-<h3 id="verificação-com-falha"><a class="header" href="#verificação-com-falha">Verificação com falha</a></h3>
-<p>Se um arquivo foi modificado ou corrompido:</p>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01
-Signature: VALID
- [OK] memories/a1b2c3d4/media.jpg
- [FAILED] memories/e5f6a7b8/media.txt
- [OK] memories/c9d0e1f2/media.wav
-Verification: FAILED
-</code></pre>
-<h2 id="casos-de-uso"><a class="header" href="#casos-de-uso">Casos de uso</a></h2>
-<ul>
-<li><strong>Verificações rotineiras de integridade</strong> — verifique periodicamente que suas tesseras armazenadas não foram corrompidas</li>
-<li><strong>Após transferência</strong> — verifique após copiar tesseras para um novo dispositivo ou meio de armazenamento</li>
-<li><strong>Verificação de confiança</strong> — confirme que uma tessera recebida de outra pessoa não foi adulterada</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="tes-export"><a class="header" href="#tes-export">tes export</a></h1>
-<p>Exportar uma tessera como um diretório autocontido.</p>
-<h2 id="uso-3"><a class="header" href="#uso-3">Uso</a></h2>
-<pre><code class="language-bash">tes export &lt;HASH&gt; &lt;DESTINO&gt;
-</code></pre>
-<h2 id="argumentos-2"><a class="header" href="#argumentos-2">Argumentos</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Argumento</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>&lt;HASH&gt;</code></td><td>Hash de conteúdo da tessera (64 caracteres hexadecimais)</td></tr>
-<tr><td><code>&lt;DESTINO&gt;</code></td><td>Diretório de destino</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="opções-3"><a class="header" href="#opções-3">Opções</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opção</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;CAMINHO&gt;</code></td><td>Diretório base para armazenamento de dados (padrão: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="estrutura-de-saída"><a class="header" href="#estrutura-de-saída">Estrutura de saída</a></h2>
-<p>A exportação cria um diretório chamado <code>tessera-&lt;hash&gt;</code> dentro do destino:</p>
-<pre><code>tessera-9f2c4a1b.../
-├── MANIFEST # Índice em texto puro com checksums
-├── README.decode # Instruções de decodificação legíveis por humanos
-├── identity/
-│ ├── creator.pub.ed25519 # Chave pública do criador
-│ └── signature.ed25519.sig # Assinatura do MANIFEST
-├── memories/
-│ ├── &lt;hash-conteudo&gt;/
-│ │ ├── media.jpg # Arquivo de mídia principal
-│ │ ├── context.txt # Contexto humano em UTF-8 puro
-│ │ └── meta.json # Metadados estruturados
-│ └── .../
-├── schema/
-│ └── v1.json # Esquema JSON para validação de metadados
-└── decode/
- ├── formats.txt # Explicação de todos os formatos usados
- ├── jpeg.txt # Como decodificar JPEG
- ├── wav.txt # Como decodificar WAV
- └── json.txt # Como decodificar JSON
-</code></pre>
-<h2 id="exemplo"><a class="header" href="#exemplo">Exemplo</a></h2>
-<pre><code class="language-bash">tes export 9f2c4a1b3e7d8f0cabc123def4567890... ./backup
-</code></pre>
-<pre><code>Exported to ./backup/tessera-9f2c4a1b3e7d8f0cabc123def4567890...
-</code></pre>
-<h2 id="característica-principal-autocontido"><a class="header" href="#característica-principal-autocontido">Característica principal: autocontido</a></h2>
-<p>O diretório exportado é projetado para ser legível <strong>sem o software Tesseras</strong>. Ele inclui:</p>
-<ul>
-<li><strong>MANIFEST</strong> — um arquivo em texto puro listando cada arquivo com seu checksum BLAKE3, legível por qualquer editor de texto</li>
-<li><strong>README.decode</strong> — instruções legíveis por humanos para compreender o conteúdo</li>
-<li><strong>decode/</strong> — explicações detalhadas de cada formato de arquivo usado (JPEG, WAV, JSON, UTF-8)</li>
-</ul>
-<p>Isso significa que alguém daqui a milhares de anos, sem conhecimento algum sobre o Tesseras, ainda pode entender e acessar as memórias.</p>
-<h2 id="casos-de-uso-1"><a class="header" href="#casos-de-uso-1">Casos de uso</a></h2>
-<ul>
-<li><strong>Backup</strong> — exporte para um disco externo, pendrive ou armazenamento em nuvem</li>
-<li><strong>Compartilhamento</strong> — entregue a alguém uma cópia completa de uma tessera</li>
-<li><strong>Arquivamento</strong> — armazene em mídia de escrita única (DVD, Blu-ray, fita)</li>
-<li><strong>Migração</strong> — mova tesseras entre máquinas sem precisar do banco de dados</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="tes-list"><a class="header" href="#tes-list">tes list</a></h1>
-<p>Listar todas as tesseras locais.</p>
-<h2 id="uso-4"><a class="header" href="#uso-4">Uso</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<h2 id="opções-4"><a class="header" href="#opções-4">Opções</a></h2>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opção</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><code>--data-dir &lt;CAMINHO&gt;</code></td><td>Diretório base para armazenamento de dados (padrão: <code>~/.tesseras</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="saída"><a class="header" href="#saída">Saída</a></h2>
-<p>Exibe uma tabela com as seguintes colunas:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Coluna</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Hash</strong></td><td>Primeiros 16 caracteres do hash de conteúdo</td></tr>
-<tr><td><strong>Created</strong></td><td>Data de criação (AAAA-MM-DD)</td></tr>
-<tr><td><strong>Memories</strong></td><td>Número de memórias na tessera</td></tr>
-<tr><td><strong>Size</strong></td><td>Tamanho total (B, KB, MB ou GB)</td></tr>
-<tr><td><strong>Visibility</strong></td><td>Nível de visibilidade (public, private ou circle)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="exemplo-1"><a class="header" href="#exemplo-1">Exemplo</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>Hash Created Memories Size Visibility
-9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public
-a3b7c2d9e4f01823 2026-02-10 1 12 KB private
-f8e7d6c5b4a39201 2026-01-28 12 4 MB public
-</code></pre>
-<h2 id="banco-de-dados-vazio"><a class="header" href="#banco-de-dados-vazio">Banco de dados vazio</a></h2>
-<p>Se nenhuma tessera foi criada ainda:</p>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>No tesseras found.
-</code></pre>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="executando-um-no"><a class="header" href="#executando-um-no">Executando um No</a></h1>
-<p>O binario <code>tesseras-daemon</code> executa um no completo do Tesseras que participa da rede peer-to-peer. Ele escuta conexoes sobre QUIC, entra na tabela hash distribuida (DHT) e permite que outros nos descubram e encontrem ponteiros de tesseras.</p>
-<h2 id="iniciando-o-daemon"><a class="header" href="#iniciando-o-daemon">Iniciando o daemon</a></h2>
-<pre><code class="language-bash">tesseras-daemon
-</code></pre>
-<p>Na primeira execucao, o daemon:</p>
-<ol>
-<li>Cria o diretorio de dados (<code>~/.local/share/tesseras</code> no Linux, <code>~/Library/Application Support/tesseras</code> no macOS)</li>
-<li>Gera uma identidade de no com prova de trabalho (leva cerca de 1 segundo)</li>
-<li>Abre um listener QUIC em <code>0.0.0.0:4433</code></li>
-<li>Faz bootstrap na rede contactando nos semente</li>
-<li>Imprime <code>daemon ready</code> quando totalmente operacional</li>
-</ol>
-<h2 id="opcoes-de-linha-de-comando"><a class="header" href="#opcoes-de-linha-de-comando">Opcoes de linha de comando</a></h2>
-<pre><code>tesseras-daemon [OPTIONS]
-</code></pre>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opcao</th><th>Descricao</th><th>Padrao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>-c, --config &lt;PATH&gt;</code></td><td>Caminho para um arquivo de configuracao TOML</td><td>Nenhum (usa padroes internos)</td></tr>
-<tr><td><code>-l, --listen &lt;ADDR&gt;</code></td><td>Endereco e porta para escutar</td><td><code>0.0.0.0:4433</code></td></tr>
-<tr><td><code>-b, --bootstrap &lt;ADDRS&gt;</code></td><td>Enderecos de bootstrap separados por virgula</td><td><code>boot1.tesseras.net:4433,boot2.tesseras.net:4433</code></td></tr>
-<tr><td><code>-d, --data-dir &lt;PATH&gt;</code></td><td>Diretorio de dados</td><td>Especifico da plataforma (veja acima)</td></tr>
-</tbody>
-</table>
-</div>
-<p>Opcoes CLI sobrescrevem valores do arquivo de configuracao.</p>
-<h2 id="exemplos-2"><a class="header" href="#exemplos-2">Exemplos</a></h2>
-<p>Executar com padroes (entrar na rede publica):</p>
-<pre><code class="language-bash">tesseras-daemon
-</code></pre>
-<p>Executar como no semente (sem bootstrap, outros nos conectam a voce):</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap ""
-</code></pre>
-<p>Executar em uma porta personalizada com um diretorio de dados especifico:</p>
-<pre><code class="language-bash">tesseras-daemon --listen 0.0.0.0:5000 --data-dir /var/lib/tesseras
-</code></pre>
-<p>Fazer bootstrap a partir de um no especifico:</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap "192.168.1.50:4433"
-</code></pre>
-<p>Entrar em uma rede local com multiplos nos:</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap "192.168.1.10:4433,192.168.1.11:4433"
-</code></pre>
-<h2 id="identidade-do-no"><a class="header" href="#identidade-do-no">Identidade do no</a></h2>
-<p>Cada no tem uma identidade unica armazenada em <code>&lt;data-dir&gt;/identity.key</code>. Este arquivo contem uma chave publica de 32 bytes e um nonce de prova de trabalho de 8 bytes.</p>
-<p>O ID do no e derivado da chave publica: <code>BLAKE3(pubkey || nonce)</code> truncado para 20 bytes. O nonce deve produzir um hash com 8 bits zero iniciais, o que leva cerca de 256 tentativas de hash. Esta prova de trabalho leve torna caro criar milhares de identidades falsas enquanto custa menos de um segundo para usuarios legitimos.</p>
-<p>A identidade e gerada automaticamente na primeira execucao e reutilizada nas execucoes seguintes. Se voce apagar <code>identity.key</code>, uma nova identidade sera gerada.</p>
-<h2 id="logging"><a class="header" href="#logging">Logging</a></h2>
-<p>O daemon usa logging estruturado via <code>tracing</code>. Controle o nivel de log com a variavel de ambiente <code>RUST_LOG</code>:</p>
-<pre><code class="language-bash"># Padrao (nivel info)
-tesseras-daemon
-
-# Logging de debug
-RUST_LOG=debug tesseras-daemon
-
-# Mostrar apenas avisos e erros
-RUST_LOG=warn tesseras-daemon
-
-# Debug para DHT, info para o resto
-RUST_LOG=info,tesseras_dht=debug tesseras-daemon
-</code></pre>
-<h2 id="desligamento"><a class="header" href="#desligamento">Desligamento</a></h2>
-<p>Pressione <strong>Ctrl+C</strong> para iniciar o desligamento gracioso. O daemon ira:</p>
-<ol>
-<li>Parar de aceitar novas conexoes</li>
-<li>Finalizar operacoes em andamento (ate 5 segundos)</li>
-<li>Fechar todas as conexoes QUIC</li>
-<li>Sair de forma limpa</li>
-</ol>
-<h2 id="firewall"><a class="header" href="#firewall">Firewall</a></h2>
-<p>O daemon se comunica pela porta UDP 4433 (QUIC). Se voce esta atras de um firewall, certifique-se de que esta porta esta aberta para trafego UDP de entrada e saida.</p>
-<pre><code class="language-bash"># Exemplo: Linux com ufw
-sudo ufw allow 4433/udp
-</code></pre>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="configuracao"><a class="header" href="#configuracao">Configuracao</a></h1>
-<p>O daemon pode ser configurado via um arquivo TOML. Passe o caminho com <code>--config</code>:</p>
-<pre><code class="language-bash">tesseras-daemon --config /etc/tesseras/config.toml
-</code></pre>
-<p>Se nenhum arquivo de configuracao for fornecido, o daemon usa padroes sensiveis. Opcoes CLI (<code>--listen</code>, <code>--bootstrap</code>, <code>--data-dir</code>) sobrescrevem os valores correspondentes da configuracao.</p>
-<h2 id="exemplo-completo"><a class="header" href="#exemplo-completo">Exemplo completo</a></h2>
-<pre><code class="language-toml">[node]
-data_dir = "~/.local/share/tesseras"
-listen_addr = "0.0.0.0:4433"
-
-[dht]
-k = 20
-alpha = 3
-bucket_refresh_interval_secs = 3600
-republish_interval_secs = 3600
-pointer_ttl_secs = 86400
-max_stored_pointers = 100000
-ping_failure_threshold = 3
-
-[bootstrap]
-dns_domain = "_tesseras._udp.tesseras.net"
-hardcoded = [
- "boot1.tesseras.net:4433",
- "boot2.tesseras.net:4433",
-]
-
-[network]
-enable_mdns = true
-
-[observability]
-metrics_addr = "127.0.0.1:9190"
-log_format = "json"
-</code></pre>
-<h2 id="secoes"><a class="header" href="#secoes">Secoes</a></h2>
-<h3 id="node"><a class="header" href="#node"><code>[node]</code></a></h3>
-<p>Configuracoes basicas do no.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Chave</th><th>Tipo</th><th>Padrao</th><th>Descricao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>data_dir</code></td><td>caminho</td><td>Especifico da plataforma</td><td>Onde armazenar identidade, banco de dados e blobs</td></tr>
-<tr><td><code>listen_addr</code></td><td>endereco</td><td><code>0.0.0.0:4433</code></td><td>Endereco do listener QUIC</td></tr>
-</tbody>
-</table>
-</div>
-<p>O <code>data_dir</code> padrao e <code>~/.local/share/tesseras</code> no Linux e <code>~/Library/Application Support/tesseras</code> no macOS.</p>
-<h3 id="dht"><a class="header" href="#dht"><code>[dht]</code></a></h3>
-<p>Parametros de ajuste da DHT Kademlia. Os padroes funcionam bem para a maioria das implantacoes.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Chave</th><th>Tipo</th><th>Padrao</th><th>Descricao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>k</code></td><td>inteiro</td><td><code>20</code></td><td>Maximo de entradas por bucket da tabela de roteamento</td></tr>
-<tr><td><code>alpha</code></td><td>inteiro</td><td><code>3</code></td><td>Paralelismo para buscas iterativas</td></tr>
-<tr><td><code>bucket_refresh_interval_secs</code></td><td>inteiro</td><td><code>3600</code></td><td>Com que frequencia atualizar buckets da tabela de roteamento (segundos)</td></tr>
-<tr><td><code>republish_interval_secs</code></td><td>inteiro</td><td><code>3600</code></td><td>Com que frequencia republicar ponteiros armazenados (segundos)</td></tr>
-<tr><td><code>pointer_ttl_secs</code></td><td>inteiro</td><td><code>86400</code></td><td>Quanto tempo manter um ponteiro antes de expirar (segundos)</td></tr>
-<tr><td><code>max_stored_pointers</code></td><td>inteiro</td><td><code>100000</code></td><td>Numero maximo de ponteiros armazenados localmente</td></tr>
-<tr><td><code>ping_failure_threshold</code></td><td>inteiro</td><td><code>3</code></td><td>Quantas falhas consecutivas de ping antes de remover um par</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="bootstrap"><a class="header" href="#bootstrap"><code>[bootstrap]</code></a></h3>
-<p>Como o no descobre seus primeiros pares ao entrar na rede.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Chave</th><th>Tipo</th><th>Padrao</th><th>Descricao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>dns_domain</code></td><td>string</td><td><code>_tesseras._udp.tesseras.net</code></td><td>Dominio DNS para descoberta de pares via registros TXT</td></tr>
-<tr><td><code>hardcoded</code></td><td>lista de strings</td><td><code>["boot1.tesseras.net:4433", "boot2.tesseras.net:4433"]</code></td><td>Enderecos de bootstrap de fallback</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="network"><a class="header" href="#network"><code>[network]</code></a></h3>
-<p>Funcionalidades de nivel de rede.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Chave</th><th>Tipo</th><th>Padrao</th><th>Descricao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>enable_mdns</code></td><td>booleano</td><td><code>true</code></td><td>Habilitar descoberta na rede local via mDNS</td></tr>
-</tbody>
-</table>
-</div>
-<h3 id="observability"><a class="header" href="#observability"><code>[observability]</code></a></h3>
-<p>Monitoramento e logging.</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Chave</th><th>Tipo</th><th>Padrao</th><th>Descricao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>metrics_addr</code></td><td>endereco</td><td><code>127.0.0.1:9190</code></td><td>Endereco para o endpoint de metricas Prometheus</td></tr>
-<tr><td><code>log_format</code></td><td>string</td><td><code>json</code></td><td>Formato de saida de log (<code>json</code> ou <code>text</code>)</td></tr>
-</tbody>
-</table>
-</div>
-<h2 id="suporte-a-ipv6"><a class="header" href="#suporte-a-ipv6">Suporte a IPv6</a></h2>
-<p>Tesseras suporta IPv6 nativamente. Os campos <code>listen_addr</code> e <code>listen_addrs</code> aceitam tanto enderecos IPv4 quanto IPv6.</p>
-<h3 id="escutando-em-ipv6"><a class="header" href="#escutando-em-ipv6">Escutando em IPv6</a></h3>
-<p>Para escutar em todas as interfaces IPv6:</p>
-<pre><code class="language-toml">[node]
-listen_addr = "[::]:4433"
-</code></pre>
-<p>No Linux e na maioria dos BSDs, vincular a <code>[::]</code> tambem aceita conexoes IPv4 (dual-stack) por padrao. Em alguns sistemas (notavelmente OpenBSD), <code>[::]</code> e somente IPv6 porque <code>IPV6_V6ONLY</code> e habilitado por padrao. Para garantir tanto IPv4 quanto IPv6 em todas as plataformas, use <code>listen_addrs</code> com enderecos explicitos:</p>
-<pre><code class="language-toml">[node]
-listen_addrs = ["0.0.0.0:4433", "[::]:4433"]
-</code></pre>
-<p>Para loopback IPv6 apenas (testes):</p>
-<pre><code class="language-toml">[node]
-listen_addr = "[::1]:4433"
-</code></pre>
-<h3 id="bootstrap-com-ipv6"><a class="header" href="#bootstrap-com-ipv6">Bootstrap com IPv6</a></h3>
-<p>Enderecos de bootstrap podem ser IPv6:</p>
-<pre><code class="language-toml">[bootstrap]
-hardcoded = [
- "boot1.tesseras.net:4433",
- "[2001:db8::1]:4433",
-]
-</code></pre>
-<p>Hostnames DNS com registros A e AAAA sao resolvidos para todos os enderecos, entao o daemon se conectara pelo protocolo que estiver acessivel.</p>
-<h3 id="comportamento-de-ipv6_v6only-por-so"><a class="header" href="#comportamento-de-ipv6_v6only-por-so">Comportamento de <code>IPV6_V6ONLY</code> por SO</a></h3>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>SO</th><th><code>[::]</code> aceita IPv4?</th><th>Notas</th></tr>
-</thead>
-<tbody>
-<tr><td>Linux</td><td>Sim (dual-stack)</td><td><code>IPV6_V6ONLY</code> padrao 0</td></tr>
-<tr><td>macOS</td><td>Sim (dual-stack)</td><td><code>IPV6_V6ONLY</code> padrao 0</td></tr>
-<tr><td>FreeBSD</td><td>Sim (dual-stack)</td><td><code>IPV6_V6ONLY</code> padrao 0</td></tr>
-<tr><td>OpenBSD</td><td>Nao (somente IPv6)</td><td><code>IPV6_V6ONLY</code> sempre 1</td></tr>
-<tr><td>Windows</td><td>Sim (dual-stack)</td><td><code>IPV6_V6ONLY</code> padrao 0</td></tr>
-</tbody>
-</table>
-</div>
-<p>Se precisar de controle explicito, use <code>listen_addrs</code> com um endereco IPv4 e um IPv6.</p>
-<h2 id="configuracao-minima"><a class="header" href="#configuracao-minima">Configuracao minima</a></h2>
-<p>A maioria dos usuarios nao precisa de um arquivo de configuracao. Se precisar, uma configuracao minima sobrescrevendo apenas o necessario e suficiente:</p>
-<pre><code class="language-toml">[node]
-listen_addr = "0.0.0.0:5000"
-
-[bootstrap]
-hardcoded = ["192.168.1.10:4433"]
-</code></pre>
-<p>Todos os outros valores usam seus padroes.</p>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="conceitos-de-rede"><a class="header" href="#conceitos-de-rede">Conceitos de Rede</a></h1>
-<p>Este capitulo explica como os nos do Tesseras se encontram e localizam ponteiros de tesseras na rede. Voce nao precisa entender esses detalhes para usar o Tesseras, mas eles ajudam a explicar o que o daemon esta fazendo em segundo plano.</p>
-<h2 id="como-os-nos-se-encontram"><a class="header" href="#como-os-nos-se-encontram">Como os nos se encontram</a></h2>
-<p>Tesseras usa uma <strong>tabela hash distribuida (DHT) Kademlia</strong> — um algoritmo comprovado usado pelo BitTorrent e outros sistemas P2P por mais de 20 anos. Nao ha servidor central. Cada no mantem uma tabela de roteamento dos pares que conhece, e os nos cooperam para direcionar consultas ao lugar certo.</p>
-<p>Quando seu no inicia, ele contacta um ou mais <strong>nos de bootstrap</strong> (nos semente com enderecos conhecidos). Atraves dessas conexoes iniciais, seu no descobre outros pares e constroi sua tabela de roteamento. Com o tempo, seu no naturalmente aprende sobre mais pares conforme participa da rede.</p>
-<h2 id="o-que-a-dht-armazena"><a class="header" href="#o-que-a-dht-armazena">O que a DHT armazena</a></h2>
-<p>A DHT armazena <strong>ponteiros</strong>, nao dados. Um ponteiro e um registro leve que diz “a tessera X esta com os nos Y e Z.” Quando alguem quer recuperar uma tessera, primeiro busca seu ponteiro na DHT para descobrir quais nos a possuem, depois conecta diretamente a esses nos para baixar os dados reais.</p>
-<p>Isso significa que a DHT permanece pequena e rapida — ela rastreia apenas quem tem o que, nao o conteudo em si.</p>
-<h2 id="identidade-do-no-e-prova-de-trabalho"><a class="header" href="#identidade-do-no-e-prova-de-trabalho">Identidade do no e prova de trabalho</a></h2>
-<p>Cada no tem um <strong>ID de no</strong> de 160 bits derivado de sua chave publica. Para evitar que um atacante crie milhares de nos falsos de forma barata (um <strong>ataque Sybil</strong>), gerar um ID de no requer uma pequena prova de trabalho: o no deve encontrar um nonce tal que <code>BLAKE3(chave_publica || nonce)</code> comece com 8 bits zero.</p>
-<p>Isso leva cerca de 256 tentativas de hash — menos de um segundo em qualquer dispositivo, incluindo um Raspberry Pi. Mas um atacante tentando criar 10.000 identidades falsas precisaria de milhoes de tentativas, tornando o ataque impraticavel.</p>
-<h2 id="distancia-xor"><a class="header" href="#distancia-xor">Distancia XOR</a></h2>
-<p>Kademlia define “proximidade” entre nos usando a <strong>metrica XOR</strong>: a distancia entre dois IDs de no e seu XOR bit a bit. Os nos sao responsaveis por armazenar ponteiros cujas chaves estao proximas de seu proprio ID (em distancia XOR). Isso distribui dados uniformemente pela rede sem nenhuma coordenacao.</p>
-<p>Ao buscar um ponteiro de tessera, seu no pergunta aos pares que conhece que estao mais proximos da chave alvo. Esses pares apontam para outros ainda mais proximos, e assim por diante, ate que o ponteiro seja encontrado. Essa <strong>busca iterativa</strong> tipicamente alcanca qualquer no na rede em poucos saltos.</p>
-<h2 id="transporte-quic"><a class="header" href="#transporte-quic">Transporte: QUIC</a></h2>
-<p>Toda comunicacao entre nos usa <strong>QUIC</strong>, um protocolo de transporte moderno construido sobre UDP. O QUIC oferece:</p>
-<ul>
-<li><strong>Criptografia integrada</strong> — cada conexao usa TLS 1.3</li>
-<li><strong>Amigavel a NAT</strong> — funciona atraves da maioria dos tradutores de endereco de rede por ser baseado em UDP</li>
-<li><strong>Multiplexacao</strong> — multiplas operacoes independentes sobre uma conexao sem bloqueio head-of-line</li>
-<li><strong>Migracao de conexao</strong> — sobrevive a mudancas de rede (ex: trocar de Wi-Fi para dados moveis)</li>
-</ul>
-<p>O daemon escuta na porta UDP <strong>4433</strong> por padrao.</p>
-<h2 id="processo-de-bootstrap"><a class="header" href="#processo-de-bootstrap">Processo de bootstrap</a></h2>
-<p>Quando um no inicia, ele segue esta sequencia:</p>
-<ol>
-<li><strong>Contactar nos semente</strong> — conectar a um ou mais enderecos de bootstrap conhecidos</li>
-<li><strong>Trocar pings</strong> — verificar que o semente esta vivo e trocar identidades de no</li>
-<li><strong>Auto-busca</strong> — perguntar ao semente por nos proximos ao seu proprio ID, para popular sua tabela de roteamento</li>
-<li><strong>Descoberta iterativa</strong> — contactar os nos recem-descobertos, que apontam para ainda mais pares</li>
-</ol>
-<p>Apos o bootstrap, o no mantem sua tabela de roteamento automaticamente: ele atualiza buckets periodicamente e substitui pares nao responsivos por novos.</p>
-<h2 id="tipos-de-no"><a class="header" href="#tipos-de-no">Tipos de no</a></h2>
-<p>Nem todo dispositivo participa da rede da mesma forma:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Tipo</th><th>Descricao</th><th>Sempre ligado?</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>No completo</strong></td><td>Desktop, servidor ou Raspberry Pi executando <code>tesseras-daemon</code>. Participa plenamente da DHT e armazena dados de outros nos.</td><td>Sim</td></tr>
-<tr><td><strong>No movel</strong></td><td>Celular ou tablet executando o app Tesseras. Participa da DHT quando o app esta ativo.</td><td>Nao</td></tr>
-<tr><td><strong>No navegador</strong></td><td>Navegador web executando o cliente WASM. Conecta via um no relay. Somente leitura.</td><td>Nao</td></tr>
-<tr><td><strong>No IoT</strong></td><td>ESP32 ou dispositivo similar na rede local. Armazena fragmentos passivamente, nao participa da DHT.</td><td>Sim</td></tr>
-</tbody>
-</table>
-</div>
-<p>O daemon de no completo e a espinha dorsal da rede. Quanto mais nos completos em execucao, mais resiliente a rede se torna.</p>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="replicação-e-reparo"><a class="header" href="#replicação-e-reparo">Replicação e Reparo</a></h1>
-<p>Este capítulo explica como o Tesseras mantém suas memórias seguras mesmo quando nós individuais ficam offline ou sofrem falhas de hardware. Você não precisa entender esses detalhes para usar o Tesseras — o daemon cuida de tudo automaticamente.</p>
-<h2 id="por-que-a-replicação-importa"><a class="header" href="#por-que-a-replicação-importa">Por que a replicação importa</a></h2>
-<p>Uma tessera armazenada em uma única máquina morre quando essa máquina morre. O Tesseras resolve isso dividindo os dados em fragmentos, espalhando-os entre múltiplos pares e verificando continuamente que cópias suficientes existem. Se alguns fragmentos desaparecem, a rede se repara automaticamente.</p>
-<h2 id="codificação-de-apagamento"><a class="header" href="#codificação-de-apagamento">Codificação de apagamento</a></h2>
-<p>O Tesseras usa <strong>codificação de apagamento Reed-Solomon</strong> para criar fragmentos redundantes. A ideia é simples: a partir de N fragmentos de dados, gerar M fragmentos extras de paridade. Quaisquer N dos N+M fragmentos totais podem reconstruir os dados originais.</p>
-<p>Isso é muito mais eficiente em armazenamento do que replicação simples. Armazenar 3 cópias completas de um arquivo de 100 MB custa 300 MB. Com 16 dados + 8 fragmentos de paridade, você obtém proteção mais forte (pode perder até 8 de 24 fragmentos — 33%) por apenas 150 MB no total.</p>
-<h2 id="camadas-de-fragmentação"><a class="header" href="#camadas-de-fragmentação">Camadas de fragmentação</a></h2>
-<p>Nem toda tessera é tratada da mesma forma. Arquivos pequenos não se beneficiam do overhead da codificação de apagamento, então o Tesseras usa três camadas:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Camada</th><th>Tamanho</th><th>Estratégia</th><th>Fragmentos</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Small</strong></td><td>&lt; 4 MB</td><td>Replicação do arquivo inteiro</td><td>7 cópias do arquivo completo</td></tr>
-<tr><td><strong>Medium</strong></td><td>4–256 MB</td><td>Reed-Solomon 16+8</td><td>16 dados + 8 paridade = 24 fragmentos</td></tr>
-<tr><td><strong>Large</strong></td><td>≥ 256 MB</td><td>Reed-Solomon 48+24</td><td>48 dados + 24 paridade = 72 fragmentos</td></tr>
-</tbody>
-</table>
-</div>
-<p>Todas as camadas visam um <strong>fator de replicação de 7</strong> — significando que os fragmentos são distribuídos para 7 pares diferentes.</p>
-<h2 id="como-a-distribuição-funciona"><a class="header" href="#como-a-distribuição-funciona">Como a distribuição funciona</a></h2>
-<p>Quando você cria uma tessera e o daemon a replica, isto é o que acontece:</p>
-<ol>
-<li><strong>Codificar</strong> — os dados da tessera são divididos em fragmentos de acordo com sua camada de tamanho</li>
-<li><strong>Encontrar pares</strong> — o daemon consulta a DHT pelos nós mais próximos ao hash da tessera</li>
-<li><strong>Diversidade de sub-rede</strong> — os pares são filtrados para que poucos venham da mesma sub-rede (para evitar falhas correlacionadas se um datacenter cair)</li>
-<li><strong>Distribuir</strong> — os fragmentos são enviados aos pares selecionados em ordem round-robin</li>
-<li><strong>Confirmar</strong> — cada par valida o checksum do fragmento e confirma o recebimento</li>
-</ol>
-<p>O dono da tessera envia os fragmentos aos pares. Os pares não puxam — isso mantém o protocolo simples e garante distribuição imediata.</p>
-<h2 id="verificação-de-fragmentos"><a class="header" href="#verificação-de-fragmentos">Verificação de fragmentos</a></h2>
-<p>Cada fragmento carrega um checksum BLAKE3. Quando um nó recebe um fragmento, ele recalcula o hash e compara com o checksum esperado. Se não coincidem, o fragmento é rejeitado. Isso detecta tanto erros de transmissão quanto adulteração deliberada.</p>
-<p>Os fragmentos sao armazenados em um <strong>armazenamento enderecavel por conteudo (CAS)</strong> onde cada dado unico existe exatamente uma vez em disco, indexado pelo seu hash BLAKE3. Uma tabela de referencias no SQLite mapeia identificadores logicos de fragmentos para hashes CAS, habilitando deduplicacao automatica — se duas tesseras compartilham dados de fragmento identicos, apenas uma copia e armazenada. Contagem de referencias garante que os dados sejam limpos apenas quando nenhuma tessera os referencia.</p>
-<h2 id="loop-de-reparo"><a class="header" href="#loop-de-reparo">Loop de reparo</a></h2>
-<p>O daemon executa um loop de reparo em segundo plano a cada 24 horas (com jitter aleatório para evitar tempestades em toda a rede). Para cada tessera sob sua responsabilidade, o loop de reparo:</p>
-<ol>
-<li><strong>Solicita atestações</strong> dos detentores conhecidos — cada detentor prova que ainda possui os fragmentos reportando seus checksums</li>
-<li><strong>Recorre ao ping</strong> se a atestação falhar — para distinguir entre “nó está offline” e “nó perdeu os dados”</li>
-<li><strong>Verifica fragmentos locais</strong> — verifica a integridade de quaisquer fragmentos armazenados localmente recalculando checksums BLAKE3</li>
-<li><strong>Decide a ação</strong>:
-<ul>
-<li><strong>Healthy</strong> — todos os detentores responderam, todos os checksums válidos, nada a fazer</li>
-<li><strong>Needs replication</strong> — alguns detentores sumiram, encontrar novos pares e redistribuir fragmentos ausentes</li>
-<li><strong>Corrupt local</strong> — um fragmento local tem dados corrompidos, buscar uma substituição na rede</li>
-</ul>
-</li>
-</ol>
-<h2 id="reciprocidade"><a class="header" href="#reciprocidade">Reciprocidade</a></h2>
-<p>O Tesseras usa um <strong>livro-razão de reciprocidade bilateral</strong> para garantir troca justa de armazenamento. Não há criptomoeda, não há blockchain, não há consenso global — cada nó simplesmente rastreia seu saldo com cada par localmente:</p>
-<pre><code>par_a: +500 MB (eles armazenam 500 MB meus)
-par_b: -200 MB (eu armazeno 200 MB a mais deles do que eles armazenam meu)
-par_c: 0 MB (equilibrado)
-</code></pre>
-<p>As regras são simples:</p>
-<ul>
-<li>Armazene 1 GB na rede → você deveria armazenar aproximadamente 1 GB para outros</li>
-<li>Nós com saldo positivo (eles armazenam mais para você) recebem prioridade quando você precisa distribuir novos fragmentos</li>
-<li>Free riders perdem redundância gradualmente — seus fragmentos são despriorizados para reparo, mas nunca deletados</li>
-<li>Ao receber um fragmento, um nó verifica o déficit do remetente. Se o remetente deve muito armazenamento, o fragmento é rejeitado</li>
-<li>Nós institucionais (universidades, arquivos) podem operar altruisticamente com proporções desequilibradas</li>
-</ul>
-<h2 id="tamanho-máximo-de-tessera"><a class="header" href="#tamanho-máximo-de-tessera">Tamanho máximo de tessera</a></h2>
-<p>O tamanho máximo de uma tessera é <strong>1 GB</strong>. Este é um limite prático que mantém os tamanhos de fragmentos gerenciáveis e a replicação rápida. Para coleções maiores de memórias, crie múltiplas tesseras.</p>
-<h2 id="configuração"><a class="header" href="#configuração">Configuração</a></h2>
-<p>O comportamento de replicação do daemon pode ser ajustado através da configuração:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Parâmetro</th><th>Padrão</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td>Intervalo de reparo</td><td>24 horas</td><td>Com que frequência o loop de reparo roda</td></tr>
-<tr><td>Jitter de reparo</td><td>2 horas</td><td>Atraso aleatório adicionado para evitar tempestades na rede</td></tr>
-<tr><td>Transferências simultâneas</td><td>4</td><td>Máximo de transferências paralelas de fragmentos</td></tr>
-<tr><td>Espaço livre mínimo</td><td>1 GB</td><td>Parar de aceitar fragmentos abaixo deste limite</td></tr>
-<tr><td>Tolerância de déficit</td><td>256 MB</td><td>Déficit máximo de armazenamento antes de rejeitar fragmentos de um par</td></tr>
-<tr><td>Limite por par</td><td>1 GB</td><td>Armazenamento total máximo para qualquer par individual</td></tr>
-</tbody>
-</table>
-</div>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="criptografia-e-tesseras-seladas"><a class="header" href="#criptografia-e-tesseras-seladas">Criptografia e Tesseras Seladas</a></h1>
-<p>A maioria das tesseras são públicas — projetadas para serem acessíveis a qualquer pessoa, para sempre. Mas algumas memórias precisam de privacidade. Tesseras suporta dois modos de visibilidade criptografada:</p>
-<ul>
-<li><strong>Privada</strong> — apenas o criador (e seus herdeiros) podem acessar o conteúdo</li>
-<li><strong>Selada</strong> — o conteúdo é bloqueado por tempo e se torna acessível após uma data específica</li>
-</ul>
-<p>Tesseras públicas nunca são criptografadas. Disponibilidade é mais importante que sigilo para preservação.</p>
-<h2 id="como-a-criptografia-funciona"><a class="header" href="#como-a-criptografia-funciona">Como a criptografia funciona</a></h2>
-<p>Quando você cria uma tessera privada ou selada, o seguinte acontece:</p>
-<ol>
-<li>Uma <strong>chave de conteúdo</strong> aleatória (256 bits) é gerada</li>
-<li>Cada arquivo de memória é criptografado com <strong>AES-256-GCM</strong> usando essa chave de conteúdo</li>
-<li>A chave de conteúdo é envolvida em um <strong>envelope de chave selada</strong> usando sua chave pública de criptografia</li>
-<li>A chave envolvida é armazenada junto ao conteúdo criptografado</li>
-</ol>
-<p>Apenas o detentor da chave privada correspondente pode desembrulhar a chave de conteúdo e decriptar o conteúdo.</p>
-<h2 id="encapsulamento-de-chave-híbrido-pós-quântico"><a class="header" href="#encapsulamento-de-chave-híbrido-pós-quântico">Encapsulamento de chave híbrido pós-quântico</a></h2>
-<p>O envelope de chave selada usa um <strong>Mecanismo de Encapsulamento de Chave (KEM) híbrido</strong> combinando dois algoritmos:</p>
-<ul>
-<li><strong>X25519</strong> — uma troca de chaves clássica bem testada baseada em curva elíptica</li>
-<li><strong>ML-KEM-768</strong> — um KEM pós-quântico baseado em reticulados padronizado pelo NIST (anteriormente Kyber)</li>
-</ul>
-<p>Ambos os algoritmos produzem segredos compartilhados que são combinados usando derivação de chaves BLAKE3. Um atacante precisa quebrar <strong>ambos</strong> os algoritmos para recuperar a chave de conteúdo. Isso segue o mesmo princípio das assinaturas duplas do Tesseras (Ed25519 + ML-DSA): não sabemos quais suposições criptográficas se manterão ao longo dos séculos, então apostamos nos dois.</p>
-<h2 id="dados-autenticados-associados-aad"><a class="header" href="#dados-autenticados-associados-aad">Dados autenticados associados (AAD)</a></h2>
-<p>AES-256-GCM suporta dados autenticados associados — informações extras que são verificadas durante a decriptação mas não são criptografadas. Tesseras vincula as seguintes informações no AAD:</p>
-<ul>
-<li>O <strong>hash do conteúdo</strong> da tessera (sempre)</li>
-<li>O <strong>timestamp open_after</strong> (apenas para tesseras seladas)</li>
-</ul>
-<p>Isso previne <strong>ataques de troca de texto cifrado</strong>: um atacante não pode copiar conteúdo criptografado de uma tessera para outra, porque o AAD não vai corresponder e a decriptação vai falhar. Para tesseras seladas, isso também significa que você não pode alterar a data do selo — o timestamp está criptograficamente vinculado ao texto cifrado.</p>
-<h2 id="tesseras-seladas-cápsulas-do-tempo"><a class="header" href="#tesseras-seladas-cápsulas-do-tempo">Tesseras seladas: cápsulas do tempo</a></h2>
-<p>Uma tessera selada é uma verdadeira cápsula do tempo. Quando você cria uma, você especifica uma data <code>open_after</code>. O conteúdo é criptografado e a chave é selada em um envelope que apenas você pode abrir.</p>
-<p>Quando a data <code>open_after</code> passa, o dono publica a chave de conteúdo como uma <strong>Publicação de Chave</strong> assinada — um artefato independente contendo a chave, o hash da tessera e a assinatura do dono. Outros nós podem verificar a assinatura e usar a chave publicada para decriptar o conteúdo.</p>
-<p>O manifesto da tessera nunca é modificado. A Publicação de Chave é um documento separado, preservando a natureza imutável e endereçada por conteúdo das tesseras.</p>
-<h2 id="e-as-chaves"><a class="header" href="#e-as-chaves">E as chaves?</a></h2>
-<p>Cada identidade agora inclui um <strong>par de chaves de criptografia</strong> junto ao par de chaves de assinatura:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Tipo de chave</th><th>Algoritmo</th><th>Finalidade</th></tr>
-</thead>
-<tbody>
-<tr><td>Ed25519</td><td>Clássico</td><td>Assinatura de manifestos e publicações de chave</td></tr>
-<tr><td>ML-DSA</td><td>Pós-quântico</td><td>Assinatura (quando habilitado)</td></tr>
-<tr><td>X25519</td><td>Clássico</td><td>Encapsulamento de chave (criptografia)</td></tr>
-<tr><td>ML-KEM-768</td><td>Pós-quântico</td><td>Encapsulamento de chave (criptografia)</td></tr>
-</tbody>
-</table>
-</div>
-<p>O par de chaves de criptografia é gerado quando a identidade é criada. A metade pública é armazenada no diretório de identidade da tessera; a metade privada fica no dispositivo do dono.</p>
-<h2 id="princípios-de-design"><a class="header" href="#princípios-de-design">Princípios de design</a></h2>
-<ul>
-<li><strong>Criptografar o mínimo possível</strong> — apenas conteúdo privado e selado é criptografado. Memórias públicas permanecem abertas para acessibilidade a longo prazo.</li>
-<li><strong>Algoritmos duplos desde o início</strong> — criptografia clássica e pós-quântica, para que o conteúdo esteja protegido mesmo que um algoritmo seja quebrado.</li>
-<li><strong>Manifestos imutáveis</strong> — chaves são publicadas separadamente, nunca modificando dados existentes.</li>
-<li><strong>Falhar fechado</strong> — o sistema rejeita tentativas de criar tesseras privadas ou seladas sem chaves de criptografia.</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="recuperação-de-chaves-por-herdeiros"><a class="header" href="#recuperação-de-chaves-por-herdeiros">Recuperação de Chaves por Herdeiros</a></h1>
-<p>Suas tesseras podem sobreviver a falhas de infraestrutura, computadores quânticos e séculos de tempo. Mas o que acontece quando você não consegue mais acessar suas próprias chaves? Tesseras usa <strong>Shamir’s Secret Sharing</strong> para permitir que você distribua sua identidade criptográfica para herdeiros de confiança.</p>
-<h2 id="como-funciona"><a class="header" href="#como-funciona">Como funciona</a></h2>
-<p>Shamir’s Secret Sharing divide um segredo em N fragmentos com um limiar T. Qualquer T fragmentos podem reconstruir o segredo original. Menos que T fragmentos não revelam <strong>nada</strong> — isso é informação-teoricamente seguro, não apenas computacionalmente difícil de quebrar.</p>
-<p>Por exemplo, com limiar 2 e 3 fragmentos totais:</p>
-<ul>
-<li>Dê o fragmento 1 ao seu cônjuge</li>
-<li>Dê o fragmento 2 ao seu irmão</li>
-<li>Dê o fragmento 3 ao seu advogado</li>
-</ul>
-<p>Quaisquer dois deles podem recuperar sua identidade. Um único fragmento sozinho é inútil.</p>
-<h2 id="criando-fragmentos-de-herdeiros"><a class="header" href="#criando-fragmentos-de-herdeiros">Criando fragmentos de herdeiros</a></h2>
-<pre><code class="language-bash">tes heir create --threshold 2 --shares 3
-</code></pre>
-<p>Isso divide sua chave de identidade Ed25519 em 3 fragmentos (necessitando 2 para reconstruir) e os salva em <code>./heir-shares/</code>:</p>
-<pre><code>heir-shares/
-├── heir_share_1.bin # Binário MessagePack
-├── heir_share_1.txt # Texto base64 legível por humanos
-├── heir_share_2.bin
-├── heir_share_2.txt
-├── heir_share_3.bin
-└── heir_share_3.txt
-</code></pre>
-<p>Cada fragmento é gerado em dois formatos:</p>
-<ul>
-<li><strong>Binário</strong> (<code>.bin</code>) — MessagePack compacto, adequado para pendrives ou armazenamento digital</li>
-<li><strong>Texto</strong> (<code>.txt</code>) — base64 com cabeçalho legível, adequado para impressão em papel</li>
-</ul>
-<p>O formato texto se parece com isso:</p>
-<pre><code>--- TESSERAS HEIR SHARE ---
-Format: v1
-Owner: a1b2c3d4e5f6a7b8 (fingerprint)
-Share: 1 of 3 (threshold: 2)
-Session: 9f8e7d6c5b4a3210
-Created: 2026-02-15
-
-&lt;dados codificados em base64&gt;
---- END HEIR SHARE ---
-</code></pre>
-<h2 id="reconstruindo-a-partir-de-fragmentos"><a class="header" href="#reconstruindo-a-partir-de-fragmentos">Reconstruindo a partir de fragmentos</a></h2>
-<p>Quando os herdeiros precisam recuperar a identidade:</p>
-<pre><code class="language-bash">tes heir reconstruct heir_share_1.txt heir_share_2.bin --output-dir ./recovered-keys
-</code></pre>
-<p>O comando detecta automaticamente se cada arquivo é formato binário ou texto. Ele valida que todos os fragmentos pertencem à mesma sessão e dono, verifica checksums e reconstrói o par de chaves Ed25519.</p>
-<p>Para instalar as chaves recuperadas como identidade ativa:</p>
-<pre><code class="language-bash">tes heir reconstruct share1.txt share2.txt --output-dir ./recovered --install
-</code></pre>
-<p>Isso faz backup da identidade atual antes de substituí-la.</p>
-<h2 id="inspecionando-um-fragmento"><a class="header" href="#inspecionando-um-fragmento">Inspecionando um fragmento</a></h2>
-<p>Para ver metadados sobre um fragmento sem expor dados secretos:</p>
-<pre><code class="language-bash">tes heir info heir_share_1.txt
-</code></pre>
-<p>Saída:</p>
-<pre><code>Heir Share Information:
- Format version: 1
- Share: 1 of 3 (threshold: 2)
- Session: 9f8e7d6c5b4a3210
- Owner fingerprint: a1b2c3d4e5f6a7b8
- Share data size: 34 bytes
- Checksum: valid
-</code></pre>
-<h2 id="considerações-de-segurança"><a class="header" href="#considerações-de-segurança">Considerações de segurança</a></h2>
-<ul>
-<li><strong>Escolha do limiar</strong>: um limiar de 2-de-3 ou 3-de-5 é recomendado para a maioria das pessoas. Limiares mais altos são mais seguros mas requerem mais herdeiros para cooperar.</li>
-<li><strong>Armazenamento físico</strong>: imprima os arquivos <code>.txt</code> em papel livre de ácido e armazene em locais físicos separados (cofres bancários, casas diferentes). Papel sobrevive décadas sem degradação.</li>
-<li><strong>Nunca armazene fragmentos juntos</strong>: todo o propósito da divisão é a distribuição. Manter todos os fragmentos em um lugar anula o objetivo.</li>
-<li><strong>Isolamento de sessão</strong>: cada chamada <code>heir create</code> gera um novo ID de sessão. Fragmentos de sessões diferentes não podem ser misturados — isso previne confusão após rotações de chave.</li>
-<li><strong>Verificação de checksum</strong>: cada fragmento inclui um checksum BLAKE3. Fragmentos corrompidos (erros de OCR, degradação de bits) são detectados antes de qualquer tentativa de reconstrução.</li>
-<li><strong>Re-dividir após mudanças de chave</strong>: se você regenerar sua identidade, crie novos fragmentos de herdeiros e destrua com segurança os antigos.</li>
-</ul>
-<h2 id="princípios-de-design-1"><a class="header" href="#princípios-de-design-1">Princípios de design</a></h2>
-<ul>
-<li><strong>Segurança informação-teórica</strong> — T-1 fragmentos revelam exatamente zero informação sobre o segredo. Isso não é uma suposição computacional; é matematicamente provado.</li>
-<li><strong>Detecção de corrupção</strong> — checksums BLAKE3 detectam degradação de bits, erros de OCR e truncamento antes de qualquer tentativa de reconstrução.</li>
-<li><strong>Resiliência de formato</strong> — saída dupla (binário + texto) garante que fragmentos sobrevivam a diferentes modos de falha de mídia de armazenamento.</li>
-<li><strong>Compatibilidade retroativa</strong> — o blob do segredo é versionado, para que versões futuras possam incluir material de chave adicional sem quebrar fragmentos existentes.</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="travessia-de-nat"><a class="header" href="#travessia-de-nat">Travessia de NAT</a></h1>
-<p>A maioria dos dispositivos na internet ficam atras de um <strong>NAT</strong> (Network Address Translator). Seu roteador atribui ao seu dispositivo um endereco privado (como <code>192.168.1.100</code>) e o traduz para um endereco publico quando voce conecta para fora. Isso funciona bem para navegar na web, mas cria um problema para redes P2P: dois dispositivos atras de NATs diferentes nao conseguem se conectar diretamente sem ajuda.</p>
-<p>Tesseras resolve isso com uma abordagem em tres camadas, tentando a opcao mais barata primeiro:</p>
-<ol>
-<li><strong>Conexao direta</strong> — se ambos os nos tem IPs publicos, eles conectam diretamente</li>
-<li><strong>UDP hole punching</strong> — um terceiro no apresenta os dois peers para que eles possam furar seus NATs</li>
-<li><strong>Relay</strong> — um no com IP publico encaminha pacotes entre os dois peers</li>
-</ol>
-<h2 id="descoberta-do-tipo-de-nat"><a class="header" href="#descoberta-do-tipo-de-nat">Descoberta do tipo de NAT</a></h2>
-<p>Quando um no inicia, ele envia requisicoes STUN (Session Traversal Utilities for NAT) para multiplos servidores publicos. Comparando os enderecos externos que esses servidores reportam, o no classifica seu NAT:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Tipo de NAT</th><th>O que significa</th><th>Hole punching?</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Public</strong></td><td>Sem NAT — seu dispositivo tem IP publico</td><td>Nao necessario</td></tr>
-<tr><td><strong>Cone</strong></td><td>NAT mapeia a mesma porta interna para a mesma porta externa independente do destino</td><td>Funciona bem (~80%)</td></tr>
-<tr><td><strong>Symmetric</strong></td><td>NAT atribui uma porta externa diferente para cada destino</td><td>Nao confiavel</td></tr>
-<tr><td><strong>Unknown</strong></td><td>Nao conseguiu alcancar servidores STUN</td><td>Relay necessario</td></tr>
-</tbody>
-</table>
-</div>
-<p>Seu no divulga seu tipo de NAT em mensagens Pong do DHT, para que outros nos saibam se hole punching vale a pena tentar.</p>
-<h2 id="hole-punching"><a class="header" href="#hole-punching">Hole punching</a></h2>
-<p>Quando o no A (atras de um NAT Cone) quer conectar ao no B (tambem atras de um NAT Cone), nenhum consegue alcancar o outro diretamente. A solucao:</p>
-<ol>
-<li>
-<p>A envia uma mensagem <strong>PunchIntro</strong> ao no I (um introdutor — qualquer no com IP publico que ambos conhecam). A mensagem inclui o endereco externo de A (do STUN) e uma assinatura Ed25519 provando a identidade de A.</p>
-</li>
-<li>
-<p>I verifica a assinatura e encaminha um <strong>PunchRequest</strong> a B, incluindo o endereco de A e a assinatura original.</p>
-</li>
-<li>
-<p>B verifica a assinatura (provando que a requisicao realmente veio de A, nao de uma fonte falsificada). B entao envia um pacote UDP para o endereco externo de A — isso abre um pinhole no NAT de B. B tambem envia uma mensagem <strong>PunchReady</strong> de volta a A com o endereco externo de B.</p>
-</li>
-<li>
-<p>A envia um pacote UDP para o endereco externo de B. Ambos os NATs agora tem pinholes, e os dois nos podem se comunicar diretamente.</p>
-</li>
-</ol>
-<p>O processo inteiro leva 2-5 segundos. As assinaturas Ed25519 previnem <strong>ataques de reflexao</strong>, onde um atacante reproduz uma introducao antiga para redirecionar trafego.</p>
-<h2 id="fallback-por-relay"><a class="header" href="#fallback-por-relay">Fallback por relay</a></h2>
-<p>Quando hole punching falha (NAT Symmetric, firewalls estritos ou redes corporativas), nos usam relay atraves de um no com IP publico:</p>
-<ol>
-<li>A envia um <strong>RelayRequest</strong> ao no R (um no com IP publico com relay habilitado).</li>
-<li>R cria uma sessao e envia um <strong>RelayOffer</strong> a ambos A e B, contendo o endereco do relay e um token de sessao.</li>
-<li>A e B enviam seus pacotes a R, prefixados com o token de sessao. R remove o token e encaminha o payload ao outro peer.</li>
-</ol>
-<p>Sessoes de relay tem limites de largura de banda:</p>
-<ul>
-<li><strong>256 KB/s</strong> para peers com boa reciprocidade (eles armazenam fragmentos para outros)</li>
-<li><strong>64 KB/s</strong> para peers sem reciprocidade</li>
-<li>Sessoes nao reciprocas sao limitadas a 10 minutos</li>
-</ul>
-<p>Isso incentiva nos a contribuir armazenamento — bons cidadaos da rede recebem melhor servico de relay.</p>
-<h2 id="migracao-de-endereco"><a class="header" href="#migracao-de-endereco">Migracao de endereco</a></h2>
-<p>Quando um dispositivo movel troca de rede (Wi-Fi para celular), seu endereco IP muda. Ao inves de encerrar e reconstruir sessoes de relay, o no envia uma mensagem <strong>RelayMigrate</strong> assinada para atualizar seu endereco na sessao existente. Isso evita reestabelecer conexoes do zero.</p>
-<h2 id="configuracao-1"><a class="header" href="#configuracao-1">Configuracao</a></h2>
-<p>A secao <code>[nat]</code> na configuracao do daemon controla a travessia de NAT:</p>
-<pre><code class="language-toml">[nat]
-# Servidores STUN para deteccao de tipo de NAT
-stun_servers = ["stun.l.google.com:19302", "stun.cloudflare.com:3478"]
-
-# Habilitar relay (encaminhar trafego para outros nos com NAT)
-relay_enabled = false
-
-# Maximo de sessoes de relay simultaneas
-relay_max_sessions = 50
-
-# Limite de largura de banda para peers reciprocos (KB/s)
-relay_reciprocal_kbps = 256
-
-# Limite de largura de banda para peers nao reciprocos (KB/s)
-relay_bootstrap_kbps = 64
-
-# Timeout de inatividade de sessao relay (segundos)
-relay_idle_timeout_secs = 60
-</code></pre>
-<p>Para executar um no relay, defina <code>relay_enabled = true</code>. Seu no deve ter um IP publico (ou roteador com port forwarding) para servir como relay.</p>
-<h2 id="reconexao-mobile"><a class="header" href="#reconexao-mobile">Reconexao mobile</a></h2>
-<p>Quando o app Tesseras detecta uma mudanca de rede em um dispositivo movel, ele executa uma sequencia de reconexao em tres fases:</p>
-<ol>
-<li><strong>Migracao QUIC</strong> (0-2s) — QUIC suporta migracao de conexao nativamente. O app tenta migrar todas as conexoes ativas para o novo endereco.</li>
-<li><strong>Re-STUN</strong> (2-5s) — descobre o novo endereco externo e re-anuncia ao DHT.</li>
-<li><strong>Reestabelecimento</strong> (5-10s) — reconecta peers que a migracao nao conseguiu salvar, em ordem de prioridade: nos bootstrap primeiro, depois nos que guardam seus fragmentos, depois nos cujos fragmentos voce guarda.</li>
-</ol>
-<p>O app mostra progresso de reconexao atraves do stream de eventos <code>NetworkChanged</code>.</p>
-<h2 id="monitoramento"><a class="header" href="#monitoramento">Monitoramento</a></h2>
-<p>A travessia de NAT expoe metricas Prometheus em <code>/metrics</code>:</p>
-<ul>
-<li><code>tesseras_nat_type</code> — tipo de NAT detectado atualmente</li>
-<li><code>tesseras_stun_requests_total</code> / <code>tesseras_stun_failures_total</code> — confiabilidade STUN</li>
-<li><code>tesseras_punch_attempts_total{initiator_nat, target_nat}</code> — taxa de sucesso de punch por par de NAT</li>
-<li><code>tesseras_relay_sessions_active</code> — carga atual de relay</li>
-<li><code>tesseras_relay_bytes_forwarded</code> — largura de banda total de relay</li>
-<li><code>tesseras_network_change_total</code> — frequencia de mudanca de rede no mobile</li>
-</ul>
-<div style="break-before: page; page-break-before: always;"></div>
-<h1 id="docker"><a class="header" href="#docker">Docker</a></h1>
-<p>Tesseras fornece uma imagem Docker para executar o daemon em conteineres. Isso e util para servidores, testar redes com multiplos nos e ambientes de CI.</p>
-<h2 id="construindo-a-imagem"><a class="header" href="#construindo-a-imagem">Construindo a imagem</a></h2>
-<p>A partir da raiz do repositorio:</p>
-<pre><code class="language-bash">docker build -t tesseras-daemon .
-</code></pre>
-<p>O Dockerfile multi-estagio usa <code>rust:1.85</code> para compilar e <code>debian:bookworm-slim</code> como base de execucao. A imagem resultante e pequena e contem apenas o binario do daemon e certificados CA.</p>
-<h2 id="executando-um-unico-no"><a class="header" href="#executando-um-unico-no">Executando um unico no</a></h2>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- tesseras-daemon
-</code></pre>
-<p>Isso inicia um no que:</p>
-<ul>
-<li>Escuta na porta UDP 4433</li>
-<li>Faz bootstrap a partir dos nos semente padrao</li>
-<li>Armazena dados dentro do conteiner (efemero)</li>
-</ul>
-<p>Para persistir dados entre reinicializacoes do conteiner, monte um volume:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- -v tesseras-data:/root/.local/share/tesseras \
- tesseras-daemon
-</code></pre>
-<h2 id="executando-como-no-semente"><a class="header" href="#executando-como-no-semente">Executando como no semente</a></h2>
-<p>Para executar um no semente que nao faz bootstrap de ninguem:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras-seed \
- -p 4433:4433/udp \
- tesseras-daemon --listen 0.0.0.0:4433 --bootstrap ""
-</code></pre>
-<h2 id="rede-multi-no-com-docker-compose"><a class="header" href="#rede-multi-no-com-docker-compose">Rede multi-no com Docker Compose</a></h2>
-<p>O repositorio inclui um arquivo Docker Compose para testar uma rede de 3 nos:</p>
-<pre><code class="language-yaml">services:
- boot1:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", ""]
- ports: ["4433:4433/udp"]
-
- boot2:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", "boot1:4433"]
- depends_on: [boot1]
-
- client:
- build: ../..
- command: ["--listen", "0.0.0.0:4433", "--bootstrap", "boot2:4433"]
- depends_on: [boot2]
-</code></pre>
-<p>Iniciar a rede:</p>
-<pre><code class="language-bash">cd tests/smoke
-docker compose up --build -d
-</code></pre>
-<p>Verificar que todos os nos estao executando:</p>
-<pre><code class="language-bash">docker compose logs --tail=5
-</code></pre>
-<p>Voce devera ver <code>daemon ready</code> nos logs de cada no, e <code>bootstrap successful</code> para <code>boot2</code> e <code>client</code>.</p>
-<p>Parar a rede:</p>
-<pre><code class="language-bash">docker compose down
-</code></pre>
-<h2 id="configuracao-personalizada"><a class="header" href="#configuracao-personalizada">Configuracao personalizada</a></h2>
-<p>Para usar um arquivo de configuracao com Docker, monte-o no conteiner:</p>
-<pre><code class="language-bash">docker run -d \
- --name tesseras \
- -p 4433:4433/udp \
- -v ./config.toml:/etc/tesseras/config.toml:ro \
- -v tesseras-data:/root/.local/share/tesseras \
- tesseras-daemon --config /etc/tesseras/config.toml
-</code></pre>
-<p>Veja o capitulo <a href="#configuracao">Configuracao</a> para todas as opcoes disponiveis.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
-
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
-
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
- <script>
- window.addEventListener('load', function() {
- window.setTimeout(window.print, 100);
- });
- </script>
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/print.html.gz b/book/pt-br/print.html.gz
deleted file mode 100644
index e57bcaf..0000000
--- a/book/pt-br/print.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/quick-start.html b/book/pt-br/quick-start.html
deleted file mode 100644
index c73801e..0000000
--- a/book/pt-br/quick-start.html
+++ /dev/null
@@ -1,314 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Início Rápido - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="início-rápido"><a class="header" href="#início-rápido">Início Rápido</a></h1>
-<p>Este tutorial guia você por um fluxo completo: criar uma identidade, construir uma tessera a partir de arquivos, verificá-la e exportá-la.</p>
-<h2 id="1-inicializar-sua-identidade"><a class="header" href="#1-inicializar-sua-identidade">1. Inicializar sua identidade</a></h2>
-<p>Primeiro, configure sua identidade local e banco de dados:</p>
-<pre><code class="language-bash">tes init
-</code></pre>
-<pre><code>Generated Ed25519 identity
-Database initialized
-Config written to /home/user/.tesseras/config.toml
-Tesseras initialized at /home/user/.tesseras
-</code></pre>
-<p>Isso cria:</p>
-<ul>
-<li><code>~/.tesseras/identity/</code> — seu par de chaves Ed25519</li>
-<li><code>~/.tesseras/db/</code> — banco de dados SQLite para indexação</li>
-<li><code>~/.tesseras/blobs/</code> — armazenamento para arquivos de memória</li>
-<li><code>~/.tesseras/config.toml</code> — arquivo de configuração</li>
-</ul>
-<h2 id="2-preparar-seus-arquivos"><a class="header" href="#2-preparar-seus-arquivos">2. Preparar seus arquivos</a></h2>
-<p>Crie um diretório com as memórias que deseja preservar:</p>
-<pre><code class="language-bash">mkdir minhas-memorias
-cp ~/fotos/jantar-familia.jpg minhas-memorias/
-cp ~/fotos/jardim.jpg minhas-memorias/
-echo "Uma tarde quente de domingo com a família." &gt; minhas-memorias/reflexao.txt
-</code></pre>
-<p>Formatos suportados: <code>.jpg</code>, <code>.jpeg</code>, <code>.png</code> (imagens), <code>.wav</code> (áudio), <code>.webm</code> (vídeo), <code>.txt</code> (texto).</p>
-<h2 id="3-pré-visualizar-com-dry-run"><a class="header" href="#3-pré-visualizar-com-dry-run">3. Pré-visualizar com dry run</a></h2>
-<p>Veja o que seria incluído sem criar nada:</p>
-<pre><code class="language-bash">tes create minhas-memorias --dry-run
-</code></pre>
-<h2 id="4-criar-uma-tessera"><a class="header" href="#4-criar-uma-tessera">4. Criar uma tessera</a></h2>
-<pre><code class="language-bash">tes create minhas-memorias --tags "familia,domingo" --location "Casa"
-</code></pre>
-<p>A saída inclui o hash de conteúdo — uma string hexadecimal de 64 caracteres que identifica unicamente sua tessera. Copie-o para os próximos passos.</p>
-<h2 id="5-listar-suas-tesseras"><a class="header" href="#5-listar-suas-tesseras">5. Listar suas tesseras</a></h2>
-<pre><code class="language-bash">tes list
-</code></pre>
-<pre><code>Hash Created Memories Size Visibility
-9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public
-</code></pre>
-<h2 id="6-verificar-integridade"><a class="header" href="#6-verificar-integridade">6. Verificar integridade</a></h2>
-<p>Use o hash de conteúdo para verificar que todos os arquivos estão intactos e a assinatura é válida:</p>
-<pre><code class="language-bash">tes verify 9f2c4a1b3e7d8f0c...
-</code></pre>
-<pre><code>Tessera: 9f2c4a1b3e7d8f0c...
-Signature: VALID
- [OK] memories/a1b2c3/media.jpg
- [OK] memories/d4e5f6/media.jpg
- [OK] memories/g7h8i9/media.txt
-Verification: PASSED
-</code></pre>
-<h2 id="7-exportar-uma-cópia-autocontida"><a class="header" href="#7-exportar-uma-cópia-autocontida">7. Exportar uma cópia autocontida</a></h2>
-<p>Exporte a tessera para um diretório que pode ser lido sem o Tesseras:</p>
-<pre><code class="language-bash">tes export 9f2c4a1b3e7d8f0c... ./backup
-</code></pre>
-<pre><code>Exported to ./backup/tessera-9f2c4a1b3e7d8f0c...
-</code></pre>
-<h2 id="8-inspecionar-a-exportação"><a class="header" href="#8-inspecionar-a-exportação">8. Inspecionar a exportação</a></h2>
-<p>O diretório exportado é totalmente autocontido:</p>
-<pre><code>tessera-9f2c4a1b3e7d8f0c.../
-├── MANIFEST # Índice em texto puro com checksums
-├── README.decode # Como ler esta tessera sem software
-├── identity/
-│ ├── creator.pub.ed25519 # Sua chave pública
-│ └── signature.ed25519.sig # Assinatura do MANIFEST
-├── memories/
-│ ├── &lt;hash&gt;/
-│ │ ├── media.jpg # A foto
-│ │ ├── context.txt # Descrição em texto puro
-│ │ └── meta.json # Metadados estruturados
-│ └── .../
-└── decode/
- ├── formats.txt # Explicação de todos os formatos usados
- ├── jpeg.txt # Como decodificar JPEG
- └── json.txt # Como decodificar JSON
-</code></pre>
-<p>Tudo que um leitor futuro precisa para entender o conteúdo está incluído no próprio diretório — nenhum software Tesseras é necessário.</p>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="installation.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="commands/init.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="installation.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="commands/init.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/quick-start.html.gz b/book/pt-br/quick-start.html.gz
deleted file mode 100644
index c24a2ba..0000000
--- a/book/pt-br/quick-start.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/replication.html b/book/pt-br/replication.html
deleted file mode 100644
index 7fd2d1f..0000000
--- a/book/pt-br/replication.html
+++ /dev/null
@@ -1,319 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Replicação e Reparo - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="replicação-e-reparo"><a class="header" href="#replicação-e-reparo">Replicação e Reparo</a></h1>
-<p>Este capítulo explica como o Tesseras mantém suas memórias seguras mesmo quando nós individuais ficam offline ou sofrem falhas de hardware. Você não precisa entender esses detalhes para usar o Tesseras — o daemon cuida de tudo automaticamente.</p>
-<h2 id="por-que-a-replicação-importa"><a class="header" href="#por-que-a-replicação-importa">Por que a replicação importa</a></h2>
-<p>Uma tessera armazenada em uma única máquina morre quando essa máquina morre. O Tesseras resolve isso dividindo os dados em fragmentos, espalhando-os entre múltiplos pares e verificando continuamente que cópias suficientes existem. Se alguns fragmentos desaparecem, a rede se repara automaticamente.</p>
-<h2 id="codificação-de-apagamento"><a class="header" href="#codificação-de-apagamento">Codificação de apagamento</a></h2>
-<p>O Tesseras usa <strong>codificação de apagamento Reed-Solomon</strong> para criar fragmentos redundantes. A ideia é simples: a partir de N fragmentos de dados, gerar M fragmentos extras de paridade. Quaisquer N dos N+M fragmentos totais podem reconstruir os dados originais.</p>
-<p>Isso é muito mais eficiente em armazenamento do que replicação simples. Armazenar 3 cópias completas de um arquivo de 100 MB custa 300 MB. Com 16 dados + 8 fragmentos de paridade, você obtém proteção mais forte (pode perder até 8 de 24 fragmentos — 33%) por apenas 150 MB no total.</p>
-<h2 id="camadas-de-fragmentação"><a class="header" href="#camadas-de-fragmentação">Camadas de fragmentação</a></h2>
-<p>Nem toda tessera é tratada da mesma forma. Arquivos pequenos não se beneficiam do overhead da codificação de apagamento, então o Tesseras usa três camadas:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Camada</th><th>Tamanho</th><th>Estratégia</th><th>Fragmentos</th></tr>
-</thead>
-<tbody>
-<tr><td><strong>Small</strong></td><td>&lt; 4 MB</td><td>Replicação do arquivo inteiro</td><td>7 cópias do arquivo completo</td></tr>
-<tr><td><strong>Medium</strong></td><td>4–256 MB</td><td>Reed-Solomon 16+8</td><td>16 dados + 8 paridade = 24 fragmentos</td></tr>
-<tr><td><strong>Large</strong></td><td>≥ 256 MB</td><td>Reed-Solomon 48+24</td><td>48 dados + 24 paridade = 72 fragmentos</td></tr>
-</tbody>
-</table>
-</div>
-<p>Todas as camadas visam um <strong>fator de replicação de 7</strong> — significando que os fragmentos são distribuídos para 7 pares diferentes.</p>
-<h2 id="como-a-distribuição-funciona"><a class="header" href="#como-a-distribuição-funciona">Como a distribuição funciona</a></h2>
-<p>Quando você cria uma tessera e o daemon a replica, isto é o que acontece:</p>
-<ol>
-<li><strong>Codificar</strong> — os dados da tessera são divididos em fragmentos de acordo com sua camada de tamanho</li>
-<li><strong>Encontrar pares</strong> — o daemon consulta a DHT pelos nós mais próximos ao hash da tessera</li>
-<li><strong>Diversidade de sub-rede</strong> — os pares são filtrados para que poucos venham da mesma sub-rede (para evitar falhas correlacionadas se um datacenter cair)</li>
-<li><strong>Distribuir</strong> — os fragmentos são enviados aos pares selecionados em ordem round-robin</li>
-<li><strong>Confirmar</strong> — cada par valida o checksum do fragmento e confirma o recebimento</li>
-</ol>
-<p>O dono da tessera envia os fragmentos aos pares. Os pares não puxam — isso mantém o protocolo simples e garante distribuição imediata.</p>
-<h2 id="verificação-de-fragmentos"><a class="header" href="#verificação-de-fragmentos">Verificação de fragmentos</a></h2>
-<p>Cada fragmento carrega um checksum BLAKE3. Quando um nó recebe um fragmento, ele recalcula o hash e compara com o checksum esperado. Se não coincidem, o fragmento é rejeitado. Isso detecta tanto erros de transmissão quanto adulteração deliberada.</p>
-<p>Os fragmentos sao armazenados em um <strong>armazenamento enderecavel por conteudo (CAS)</strong> onde cada dado unico existe exatamente uma vez em disco, indexado pelo seu hash BLAKE3. Uma tabela de referencias no SQLite mapeia identificadores logicos de fragmentos para hashes CAS, habilitando deduplicacao automatica — se duas tesseras compartilham dados de fragmento identicos, apenas uma copia e armazenada. Contagem de referencias garante que os dados sejam limpos apenas quando nenhuma tessera os referencia.</p>
-<h2 id="loop-de-reparo"><a class="header" href="#loop-de-reparo">Loop de reparo</a></h2>
-<p>O daemon executa um loop de reparo em segundo plano a cada 24 horas (com jitter aleatório para evitar tempestades em toda a rede). Para cada tessera sob sua responsabilidade, o loop de reparo:</p>
-<ol>
-<li><strong>Solicita atestações</strong> dos detentores conhecidos — cada detentor prova que ainda possui os fragmentos reportando seus checksums</li>
-<li><strong>Recorre ao ping</strong> se a atestação falhar — para distinguir entre “nó está offline” e “nó perdeu os dados”</li>
-<li><strong>Verifica fragmentos locais</strong> — verifica a integridade de quaisquer fragmentos armazenados localmente recalculando checksums BLAKE3</li>
-<li><strong>Decide a ação</strong>:
-<ul>
-<li><strong>Healthy</strong> — todos os detentores responderam, todos os checksums válidos, nada a fazer</li>
-<li><strong>Needs replication</strong> — alguns detentores sumiram, encontrar novos pares e redistribuir fragmentos ausentes</li>
-<li><strong>Corrupt local</strong> — um fragmento local tem dados corrompidos, buscar uma substituição na rede</li>
-</ul>
-</li>
-</ol>
-<h2 id="reciprocidade"><a class="header" href="#reciprocidade">Reciprocidade</a></h2>
-<p>O Tesseras usa um <strong>livro-razão de reciprocidade bilateral</strong> para garantir troca justa de armazenamento. Não há criptomoeda, não há blockchain, não há consenso global — cada nó simplesmente rastreia seu saldo com cada par localmente:</p>
-<pre><code>par_a: +500 MB (eles armazenam 500 MB meus)
-par_b: -200 MB (eu armazeno 200 MB a mais deles do que eles armazenam meu)
-par_c: 0 MB (equilibrado)
-</code></pre>
-<p>As regras são simples:</p>
-<ul>
-<li>Armazene 1 GB na rede → você deveria armazenar aproximadamente 1 GB para outros</li>
-<li>Nós com saldo positivo (eles armazenam mais para você) recebem prioridade quando você precisa distribuir novos fragmentos</li>
-<li>Free riders perdem redundância gradualmente — seus fragmentos são despriorizados para reparo, mas nunca deletados</li>
-<li>Ao receber um fragmento, um nó verifica o déficit do remetente. Se o remetente deve muito armazenamento, o fragmento é rejeitado</li>
-<li>Nós institucionais (universidades, arquivos) podem operar altruisticamente com proporções desequilibradas</li>
-</ul>
-<h2 id="tamanho-máximo-de-tessera"><a class="header" href="#tamanho-máximo-de-tessera">Tamanho máximo de tessera</a></h2>
-<p>O tamanho máximo de uma tessera é <strong>1 GB</strong>. Este é um limite prático que mantém os tamanhos de fragmentos gerenciáveis e a replicação rápida. Para coleções maiores de memórias, crie múltiplas tesseras.</p>
-<h2 id="configuração"><a class="header" href="#configuração">Configuração</a></h2>
-<p>O comportamento de replicação do daemon pode ser ajustado através da configuração:</p>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Parâmetro</th><th>Padrão</th><th>Descrição</th></tr>
-</thead>
-<tbody>
-<tr><td>Intervalo de reparo</td><td>24 horas</td><td>Com que frequência o loop de reparo roda</td></tr>
-<tr><td>Jitter de reparo</td><td>2 horas</td><td>Atraso aleatório adicionado para evitar tempestades na rede</td></tr>
-<tr><td>Transferências simultâneas</td><td>4</td><td>Máximo de transferências paralelas de fragmentos</td></tr>
-<tr><td>Espaço livre mínimo</td><td>1 GB</td><td>Parar de aceitar fragmentos abaixo deste limite</td></tr>
-<tr><td>Tolerância de déficit</td><td>256 MB</td><td>Déficit máximo de armazenamento antes de rejeitar fragmentos de um par</td></tr>
-<tr><td>Limite por par</td><td>1 GB</td><td>Armazenamento total máximo para qualquer par individual</td></tr>
-</tbody>
-</table>
-</div>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="network-concepts.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="encryption.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="network-concepts.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="encryption.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/replication.html.gz b/book/pt-br/replication.html.gz
deleted file mode 100644
index bb5b2d3..0000000
--- a/book/pt-br/replication.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/running-a-node.html b/book/pt-br/running-a-node.html
deleted file mode 100644
index 981a654..0000000
--- a/book/pt-br/running-a-node.html
+++ /dev/null
@@ -1,314 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light sidebar-visible" dir="ltr">
- <head>
- <!-- Book generated using mdBook -->
- <meta charset="UTF-8">
- <title>Executando um No - Guia do Usuário Tesseras</title>
-
-
- <!-- Custom HTML head -->
-
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
-
- <link rel="shortcut icon" href="favicon-bfbdfe47.png">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
-
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
-
- <!-- Highlight.js Stylesheets -->
- <link rel="stylesheet" id="mdbook-highlight-css" href="highlight-493f70e1.css">
- <link rel="stylesheet" id="mdbook-tomorrow-night-css" href="tomorrow-night-4c0ae647.css">
- <link rel="stylesheet" id="mdbook-ayu-highlight-css" href="ayu-highlight-3fdfc3ac.css">
-
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
-
-
- <!-- Provide site root and default themes to javascript -->
- <script>
- const path_to_root = "";
- const default_light_theme = "light";
- const default_dark_theme = "navy";
- window.path_to_searchindex_js = "searchindex-3eaa3696.js";
- </script>
- <!-- Start loading toc.js asap -->
- <script src="toc-25102ebc.js"></script>
- </head>
- <body>
- <div id="mdbook-help-container">
- <div id="mdbook-help-popup">
- <h2 class="mdbook-help-title">Keyboard shortcuts</h2>
- <div>
- <p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
- <p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
- <p>Press <kbd>?</kbd> to show this help</p>
- <p>Press <kbd>Esc</kbd> to hide this help</p>
- </div>
- </div>
- </div>
- <div id="mdbook-body-container">
- <!-- Work around some values being stored in localStorage wrapped in quotes -->
- <script>
- try {
- let theme = localStorage.getItem('mdbook-theme');
- let sidebar = localStorage.getItem('mdbook-sidebar');
-
- if (theme.startsWith('"') && theme.endsWith('"')) {
- localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
- }
-
- if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
- localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
- }
- } catch (e) { }
- </script>
-
- <!-- Set the theme before any content is loaded, prevents flash -->
- <script>
- const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
- let theme;
- try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
- if (theme === null || theme === undefined) { theme = default_theme; }
- const html = document.documentElement;
- html.classList.remove('light')
- html.classList.add(theme);
- html.classList.add("js");
- </script>
-
- <input type="checkbox" id="mdbook-sidebar-toggle-anchor" class="hidden">
-
- <!-- Hide / unhide sidebar before it is displayed -->
- <script>
- let sidebar = null;
- const sidebar_toggle = document.getElementById("mdbook-sidebar-toggle-anchor");
- if (document.body.clientWidth >= 1080) {
- try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
- sidebar = sidebar || 'visible';
- } else {
- sidebar = 'hidden';
- sidebar_toggle.checked = false;
- }
- if (sidebar === 'visible') {
- sidebar_toggle.checked = true;
- } else {
- html.classList.remove('sidebar-visible');
- }
- </script>
-
- <nav id="mdbook-sidebar" class="sidebar" aria-label="Table of contents">
- <!-- populated by js -->
- <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
- <noscript>
- <iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
- </noscript>
- <div id="mdbook-sidebar-resize-handle" class="sidebar-resize-handle">
- <div class="sidebar-resize-indicator"></div>
- </div>
- </nav>
-
- <div id="mdbook-page-wrapper" class="page-wrapper">
-
- <div class="page">
- <div id="mdbook-menu-bar-hover-placeholder"></div>
- <div id="mdbook-menu-bar" class="menu-bar sticky">
- <div class="left-buttons">
- <label id="mdbook-sidebar-toggle" class="icon-button" for="mdbook-sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="mdbook-sidebar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M0 96C0 78.3 14.3 64 32 64H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H32c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32s14.3-32 32-32H416c17.7 0 32 14.3 32 32z"/></svg></span>
- </label>
- <button id="mdbook-theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="mdbook-theme-list">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M371.3 367.1c27.3-3.9 51.9-19.4 67.2-42.9L600.2 74.1c12.6-19.5 9.4-45.3-7.6-61.2S549.7-4.4 531.1 9.6L294.4 187.2c-24 18-38.2 46.1-38.4 76.1L371.3 367.1zm-19.6 25.4l-116-104.4C175.9 290.3 128 339.6 128 400c0 3.9 .2 7.8 .6 11.6c1.8 17.5-10.2 36.4-27.8 36.4H96c-17.7 0-32 14.3-32 32s14.3 32 32 32H240c61.9 0 112-50.1 112-112c0-2.5-.1-5-.2-7.5z"/></svg></span>
- </button>
- <ul id="mdbook-theme-list" class="theme-popup" aria-label="Themes" role="menu">
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-default_theme">Auto</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-light">Light</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-rust">Rust</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-coal">Coal</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-navy">Navy</button></li>
- <li role="none"><button role="menuitem" class="theme" id="mdbook-theme-ayu">Ayu</button></li>
- </ul>
- <button id="mdbook-search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="mdbook-searchbar">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352c79.5 0 144-64.5 144-144s-64.5-144-144-144S64 128.5 64 208s64.5 144 144 144z"/></svg></span>
- </button>
- </div>
-
- <h1 class="menu-title">Guia do Usuário Tesseras</h1>
-
- <div class="right-buttons">
- <a href="print.html" title="Print this book" aria-label="Print this book">
- <span class=fa-svg id="print-button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M128 0C92.7 0 64 28.7 64 64v96h64V64H354.7L384 93.3V160h64V93.3c0-17-6.7-33.3-18.7-45.3L400 18.7C388 6.7 371.7 0 354.7 0H128zM384 352v32 64H128V384 368 352H384zm64 32h32c17.7 0 32-14.3 32-32V256c0-35.3-28.7-64-64-64H64c-35.3 0-64 28.7-64 64v96c0 17.7 14.3 32 32 32H64v64c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V384zm-16-88c-13.3 0-24-10.7-24-24s10.7-24 24-24s24 10.7 24 24s-10.7 24-24 24z"/></svg></span>
- </a>
- <a href="https://git.sr.ht/~ijanc/tesseras" title="Git repository" aria-label="Git repository">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg></span>
- </a>
-
- </div>
- </div>
-
- <div id="mdbook-search-wrapper" class="hidden">
- <form id="mdbook-searchbar-outer" class="searchbar-outer">
- <div class="search-wrapper">
- <input type="search" id="mdbook-searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="mdbook-searchresults-outer" aria-describedby="searchresults-header">
- <div class="spinner-wrapper">
- <span class=fa-svg id="fa-spin"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M304 48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 416c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM48 304c26.5 0 48-21.5 48-48s-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48zm464-48c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zM142.9 437c18.7-18.7 18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zm0-294.2c18.7-18.7 18.7-49.1 0-67.9S93.7 56.2 75 75s-18.7 49.1 0 67.9s49.1 18.7 67.9 0zM369.1 437c18.7 18.7 49.1 18.7 67.9 0s18.7-49.1 0-67.9s-49.1-18.7-67.9 0s-18.7 49.1 0 67.9z"/></svg></span>
- </div>
- </div>
- </form>
- <div id="mdbook-searchresults-outer" class="searchresults-outer hidden">
- <div id="mdbook-searchresults-header" class="searchresults-header"></div>
- <ul id="mdbook-searchresults">
- </ul>
- </div>
- </div>
-
- <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
- <script>
- document.getElementById('mdbook-sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
- document.getElementById('mdbook-sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
- Array.from(document.querySelectorAll('#mdbook-sidebar a')).forEach(function(link) {
- link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
- });
- </script>
-
- <div id="mdbook-content" class="content">
- <main>
- <h1 id="executando-um-no"><a class="header" href="#executando-um-no">Executando um No</a></h1>
-<p>O binario <code>tesseras-daemon</code> executa um no completo do Tesseras que participa da rede peer-to-peer. Ele escuta conexoes sobre QUIC, entra na tabela hash distribuida (DHT) e permite que outros nos descubram e encontrem ponteiros de tesseras.</p>
-<h2 id="iniciando-o-daemon"><a class="header" href="#iniciando-o-daemon">Iniciando o daemon</a></h2>
-<pre><code class="language-bash">tesseras-daemon
-</code></pre>
-<p>Na primeira execucao, o daemon:</p>
-<ol>
-<li>Cria o diretorio de dados (<code>~/.local/share/tesseras</code> no Linux, <code>~/Library/Application Support/tesseras</code> no macOS)</li>
-<li>Gera uma identidade de no com prova de trabalho (leva cerca de 1 segundo)</li>
-<li>Abre um listener QUIC em <code>0.0.0.0:4433</code></li>
-<li>Faz bootstrap na rede contactando nos semente</li>
-<li>Imprime <code>daemon ready</code> quando totalmente operacional</li>
-</ol>
-<h2 id="opcoes-de-linha-de-comando"><a class="header" href="#opcoes-de-linha-de-comando">Opcoes de linha de comando</a></h2>
-<pre><code>tesseras-daemon [OPTIONS]
-</code></pre>
-<div class="table-wrapper">
-<table>
-<thead>
-<tr><th>Opcao</th><th>Descricao</th><th>Padrao</th></tr>
-</thead>
-<tbody>
-<tr><td><code>-c, --config &lt;PATH&gt;</code></td><td>Caminho para um arquivo de configuracao TOML</td><td>Nenhum (usa padroes internos)</td></tr>
-<tr><td><code>-l, --listen &lt;ADDR&gt;</code></td><td>Endereco e porta para escutar</td><td><code>0.0.0.0:4433</code></td></tr>
-<tr><td><code>-b, --bootstrap &lt;ADDRS&gt;</code></td><td>Enderecos de bootstrap separados por virgula</td><td><code>boot1.tesseras.net:4433,boot2.tesseras.net:4433</code></td></tr>
-<tr><td><code>-d, --data-dir &lt;PATH&gt;</code></td><td>Diretorio de dados</td><td>Especifico da plataforma (veja acima)</td></tr>
-</tbody>
-</table>
-</div>
-<p>Opcoes CLI sobrescrevem valores do arquivo de configuracao.</p>
-<h2 id="exemplos"><a class="header" href="#exemplos">Exemplos</a></h2>
-<p>Executar com padroes (entrar na rede publica):</p>
-<pre><code class="language-bash">tesseras-daemon
-</code></pre>
-<p>Executar como no semente (sem bootstrap, outros nos conectam a voce):</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap ""
-</code></pre>
-<p>Executar em uma porta personalizada com um diretorio de dados especifico:</p>
-<pre><code class="language-bash">tesseras-daemon --listen 0.0.0.0:5000 --data-dir /var/lib/tesseras
-</code></pre>
-<p>Fazer bootstrap a partir de um no especifico:</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap "192.168.1.50:4433"
-</code></pre>
-<p>Entrar em uma rede local com multiplos nos:</p>
-<pre><code class="language-bash">tesseras-daemon --bootstrap "192.168.1.10:4433,192.168.1.11:4433"
-</code></pre>
-<h2 id="identidade-do-no"><a class="header" href="#identidade-do-no">Identidade do no</a></h2>
-<p>Cada no tem uma identidade unica armazenada em <code>&lt;data-dir&gt;/identity.key</code>. Este arquivo contem uma chave publica de 32 bytes e um nonce de prova de trabalho de 8 bytes.</p>
-<p>O ID do no e derivado da chave publica: <code>BLAKE3(pubkey || nonce)</code> truncado para 20 bytes. O nonce deve produzir um hash com 8 bits zero iniciais, o que leva cerca de 256 tentativas de hash. Esta prova de trabalho leve torna caro criar milhares de identidades falsas enquanto custa menos de um segundo para usuarios legitimos.</p>
-<p>A identidade e gerada automaticamente na primeira execucao e reutilizada nas execucoes seguintes. Se voce apagar <code>identity.key</code>, uma nova identidade sera gerada.</p>
-<h2 id="logging"><a class="header" href="#logging">Logging</a></h2>
-<p>O daemon usa logging estruturado via <code>tracing</code>. Controle o nivel de log com a variavel de ambiente <code>RUST_LOG</code>:</p>
-<pre><code class="language-bash"># Padrao (nivel info)
-tesseras-daemon
-
-# Logging de debug
-RUST_LOG=debug tesseras-daemon
-
-# Mostrar apenas avisos e erros
-RUST_LOG=warn tesseras-daemon
-
-# Debug para DHT, info para o resto
-RUST_LOG=info,tesseras_dht=debug tesseras-daemon
-</code></pre>
-<h2 id="desligamento"><a class="header" href="#desligamento">Desligamento</a></h2>
-<p>Pressione <strong>Ctrl+C</strong> para iniciar o desligamento gracioso. O daemon ira:</p>
-<ol>
-<li>Parar de aceitar novas conexoes</li>
-<li>Finalizar operacoes em andamento (ate 5 segundos)</li>
-<li>Fechar todas as conexoes QUIC</li>
-<li>Sair de forma limpa</li>
-</ol>
-<h2 id="firewall"><a class="header" href="#firewall">Firewall</a></h2>
-<p>O daemon se comunica pela porta UDP 4433 (QUIC). Se voce esta atras de um firewall, certifique-se de que esta porta esta aberta para trafego UDP de entrada e saida.</p>
-<pre><code class="language-bash"># Exemplo: Linux com ufw
-sudo ufw allow 4433/udp
-</code></pre>
-
- </main>
-
- <nav class="nav-wrapper" aria-label="Page navigation">
- <!-- Mobile navigation buttons -->
- <a rel="prev" href="commands/list.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="configuration.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
-
- <div style="clear: both"></div>
- </nav>
- </div>
- </div>
-
- <nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="commands/list.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l160 160c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 246.6 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-160 160z"/></svg></span>
- </a>
-
- <a rel="next prefetch" href="configuration.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
- <span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"/></svg></span>
- </a>
- </nav>
-
- </div>
-
- <template id=fa-eye><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></template>
- <template id=fa-eye-slash><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zM223.1 149.5C248.6 126.2 282.7 112 320 112c79.5 0 144 64.5 144 144c0 24.9-6.3 48.3-17.4 68.7L408 294.5c5.2-11.8 8-24.8 8-38.5c0-53-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6c0 10.2-2.4 19.8-6.6 28.3l-90.3-70.8zm223.1 298L373 389.9c-16.4 6.5-34.3 10.1-53 10.1c-79.5 0-144-64.5-144-144c0-6.9 .5-13.6 1.4-20.2L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5z"/></svg></span></template>
- <template id=fa-copy><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 70.63l-61.25-61.25C435.4 3.371 427.2 0 418.7 0H255.1c-35.35 0-64 28.66-64 64l.0195 256C192 355.4 220.7 384 256 384h192c35.2 0 64-28.8 64-64V93.25C512 84.77 508.6 76.63 502.6 70.63zM464 320c0 8.836-7.164 16-16 16H255.1c-8.838 0-16-7.164-16-16L239.1 64.13c0-8.836 7.164-16 16-16h128L384 96c0 17.67 14.33 32 32 32h47.1V320zM272 448c0 8.836-7.164 16-16 16H63.1c-8.838 0-16-7.164-16-16L47.98 192.1c0-8.836 7.164-16 16-16H160V128H63.99c-35.35 0-64 28.65-64 64l.0098 256C.002 483.3 28.66 512 64 512h192c35.2 0 64-28.8 64-64v-32h-47.1L272 448z"/></svg></span></template>
- <template id=fa-play><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80V432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></span></template>
- <template id=fa-clock-rotate-left><span class=fa-svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc. --><path d="M75 75L41 41C25.9 25.9 0 36.6 0 57.9V168c0 13.3 10.7 24 24 24H134.1c21.4 0 32.1-25.9 17-41l-30.8-30.8C155 85.5 203 64 256 64c106 0 192 86 192 192s-86 192-192 192c-40.8 0-78.6-12.7-109.7-34.4c-14.5-10.1-34.4-6.6-44.6 7.9s-6.6 34.4 7.9 44.6C151.2 495 201.7 512 256 512c141.4 0 256-114.6 256-256S397.4 0 256 0C185.3 0 121.3 28.7 75 75zm181 53c-13.3 0-24 10.7-24 24V256c0 6.4 2.5 12.5 7 17l72 72c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-65-65V152c0-13.3-10.7-24-24-24z"/></svg></span></template>
-
-
-
- <script>
- window.playground_copyable = true;
- </script>
-
-
- <script src="elasticlunr-ef4e11c1.min.js"></script>
- <script src="mark-09e88c2c.min.js"></script>
- <script src="searcher-c2a407aa.js"></script>
-
- <script src="clipboard-1626706a.min.js"></script>
- <script src="highlight-abc7f01d.js"></script>
- <script src="book-a0b12cfe.js"></script>
-
- <!-- Custom JS scripts -->
-
-
-
- </div>
- </body>
-</html>
diff --git a/book/pt-br/running-a-node.html.gz b/book/pt-br/running-a-node.html.gz
deleted file mode 100644
index b14271d..0000000
--- a/book/pt-br/running-a-node.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/searcher-c2a407aa.js b/book/pt-br/searcher-c2a407aa.js
deleted file mode 100644
index 2a82935..0000000
--- a/book/pt-br/searcher-c2a407aa.js
+++ /dev/null
@@ -1,555 +0,0 @@
-'use strict';
-
-/* global Mark, elasticlunr, path_to_root */
-
-window.search = window.search || {};
-(function search() {
- // Search functionality
- //
- // You can use !hasFocus() to prevent keyhandling in your key
- // event handlers while the user is typing their search.
-
- if (!Mark || !elasticlunr) {
- return;
- }
-
- // eslint-disable-next-line max-len
- // IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
- if (!String.prototype.startsWith) {
- String.prototype.startsWith = function(search, pos) {
- return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
- };
- }
-
- const search_wrap = document.getElementById('mdbook-search-wrapper'),
- searchbar_outer = document.getElementById('mdbook-searchbar-outer'),
- searchbar = document.getElementById('mdbook-searchbar'),
- searchresults = document.getElementById('mdbook-searchresults'),
- searchresults_outer = document.getElementById('mdbook-searchresults-outer'),
- searchresults_header = document.getElementById('mdbook-searchresults-header'),
- searchicon = document.getElementById('mdbook-search-toggle'),
- content = document.getElementById('mdbook-content'),
-
- // SVG text elements don't render if inside a <mark> tag.
- mark_exclude = ['text'],
- marker = new Mark(content),
- URL_SEARCH_PARAM = 'search',
- URL_MARK_PARAM = 'highlight';
-
- let current_searchterm = '',
- doc_urls = [],
- search_options = {
- bool: 'AND',
- expand: true,
- fields: {
- title: {boost: 1},
- body: {boost: 1},
- breadcrumbs: {boost: 0},
- },
- },
- searchindex = null,
- results_options = {
- teaser_word_count: 30,
- limit_results: 30,
- },
- teaser_count = 0;
-
- function hasFocus() {
- return searchbar === document.activeElement;
- }
-
- function removeChildren(elem) {
- while (elem.firstChild) {
- elem.removeChild(elem.firstChild);
- }
- }
-
- // Helper to parse a url into its building blocks.
- function parseURL(url) {
- const a = document.createElement('a');
- a.href = url;
- return {
- source: url,
- protocol: a.protocol.replace(':', ''),
- host: a.hostname,
- port: a.port,
- params: (function() {
- const ret = {};
- const seg = a.search.replace(/^\?/, '').split('&');
- for (const part of seg) {
- if (!part) {
- continue;
- }
- const s = part.split('=');
- ret[s[0]] = s[1];
- }
- return ret;
- })(),
- file: (a.pathname.match(/\/([^/?#]+)$/i) || ['', ''])[1],
- hash: a.hash.replace('#', ''),
- path: a.pathname.replace(/^([^/])/, '/$1'),
- };
- }
-
- // Helper to recreate a url string from its building blocks.
- function renderURL(urlobject) {
- let url = urlobject.protocol + '://' + urlobject.host;
- if (urlobject.port !== '') {
- url += ':' + urlobject.port;
- }
- url += urlobject.path;
- let joiner = '?';
- for (const prop in urlobject.params) {
- if (Object.prototype.hasOwnProperty.call(urlobject.params, prop)) {
- url += joiner + prop + '=' + urlobject.params[prop];
- joiner = '&';
- }
- }
- if (urlobject.hash !== '') {
- url += '#' + urlobject.hash;
- }
- return url;
- }
-
- // Helper to escape html special chars for displaying the teasers
- const escapeHTML = (function() {
- const MAP = {
- '&': '&amp;',
- '<': '&lt;',
- '>': '&gt;',
- '"': '&#34;',
- '\'': '&#39;',
- };
- const repl = function(c) {
- return MAP[c];
- };
- return function(s) {
- return s.replace(/[&<>'"]/g, repl);
- };
- })();
-
- function formatSearchMetric(count, searchterm) {
- if (count === 1) {
- return count + ' search result for \'' + searchterm + '\':';
- } else if (count === 0) {
- return 'No search results for \'' + searchterm + '\'.';
- } else {
- return count + ' search results for \'' + searchterm + '\':';
- }
- }
-
- function formatSearchResult(result, searchterms) {
- const teaser = makeTeaser(escapeHTML(result.doc.body), searchterms);
- teaser_count++;
-
- // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor
- const url = doc_urls[result.ref].split('#');
- if (url.length === 1) { // no anchor found
- url.push('');
- }
-
- // encodeURIComponent escapes all chars that could allow an XSS except
- // for '. Due to that we also manually replace ' with its url-encoded
- // representation (%27).
- const encoded_search = encodeURIComponent(searchterms.join(' ')).replace(/'/g, '%27');
-
- return '<a href="' + path_to_root + url[0] + '?' + URL_MARK_PARAM + '=' + encoded_search
- + '#' + url[1] + '" aria-details="mdbook-teaser_' + teaser_count + '">'
- + result.doc.breadcrumbs + '</a>'
- + '<span class="teaser" id="mdbook-teaser_' + teaser_count
- + '" aria-label="Search Result Teaser">' + teaser + '</span>';
- }
-
- function makeTeaser(body, searchterms) {
- // The strategy is as follows:
- // First, assign a value to each word in the document:
- // Words that correspond to search terms (stemmer aware): 40
- // Normal words: 2
- // First word in a sentence: 8
- // Then use a sliding window with a constant number of words and count the
- // sum of the values of the words within the window. Then use the window that got the
- // maximum sum. If there are multiple maximas, then get the last one.
- // Enclose the terms in <em>.
- const stemmed_searchterms = searchterms.map(function(w) {
- return elasticlunr.stemmer(w.toLowerCase());
- });
- const searchterm_weight = 40;
- const weighted = []; // contains elements of ["word", weight, index_in_document]
- // split in sentences, then words
- const sentences = body.toLowerCase().split('. ');
- let index = 0;
- let value = 0;
- let searchterm_found = false;
- for (const sentenceindex in sentences) {
- const words = sentences[sentenceindex].split(' ');
- value = 8;
- for (const wordindex in words) {
- const word = words[wordindex];
- if (word.length > 0) {
- for (const searchtermindex in stemmed_searchterms) {
- if (elasticlunr.stemmer(word).startsWith(
- stemmed_searchterms[searchtermindex])
- ) {
- value = searchterm_weight;
- searchterm_found = true;
- }
- }
- weighted.push([word, value, index]);
- value = 2;
- }
- index += word.length;
- index += 1; // ' ' or '.' if last word in sentence
- }
- index += 1; // because we split at a two-char boundary '. '
- }
-
- if (weighted.length === 0) {
- return body;
- }
-
- const window_weight = [];
- const window_size = Math.min(weighted.length, results_options.teaser_word_count);
-
- let cur_sum = 0;
- for (let wordindex = 0; wordindex < window_size; wordindex++) {
- cur_sum += weighted[wordindex][1];
- }
- window_weight.push(cur_sum);
- for (let wordindex = 0; wordindex < weighted.length - window_size; wordindex++) {
- cur_sum -= weighted[wordindex][1];
- cur_sum += weighted[wordindex + window_size][1];
- window_weight.push(cur_sum);
- }
-
- let max_sum_window_index = 0;
- if (searchterm_found) {
- let max_sum = 0;
- // backwards
- for (let i = window_weight.length - 1; i >= 0; i--) {
- if (window_weight[i] > max_sum) {
- max_sum = window_weight[i];
- max_sum_window_index = i;
- }
- }
- } else {
- max_sum_window_index = 0;
- }
-
- // add <em/> around searchterms
- const teaser_split = [];
- index = weighted[max_sum_window_index][2];
- for (let i = max_sum_window_index; i < max_sum_window_index + window_size; i++) {
- const word = weighted[i];
- if (index < word[2]) {
- // missing text from index to start of `word`
- teaser_split.push(body.substring(index, word[2]));
- index = word[2];
- }
- if (word[1] === searchterm_weight) {
- teaser_split.push('<em>');
- }
- index = word[2] + word[0].length;
- teaser_split.push(body.substring(word[2], index));
- if (word[1] === searchterm_weight) {
- teaser_split.push('</em>');
- }
- }
-
- return teaser_split.join('');
- }
-
- function init(config) {
- results_options = config.results_options;
- search_options = config.search_options;
- doc_urls = config.doc_urls;
- searchindex = elasticlunr.Index.load(config.index);
-
- searchbar_outer.classList.remove('searching');
-
- searchbar.focus();
-
- const searchterm = searchbar.value.trim();
- if (searchterm !== '') {
- searchbar.classList.add('active');
- doSearch(searchterm);
- }
- }
-
- function initSearchInteractions(config) {
- // Set up events
- searchicon.addEventListener('click', () => {
- searchIconClickHandler();
- }, false);
- searchbar.addEventListener('keyup', () => {
- searchbarKeyUpHandler();
- }, false);
- document.addEventListener('keydown', e => {
- globalKeyHandler(e);
- }, false);
- // If the user uses the browser buttons, do the same as if a reload happened
- window.onpopstate = () => {
- doSearchOrMarkFromUrl();
- };
- // Suppress "submit" events so the page doesn't reload when the user presses Enter
- document.addEventListener('submit', e => {
- e.preventDefault();
- }, false);
-
- // If reloaded, do the search or mark again, depending on the current url parameters
- doSearchOrMarkFromUrl();
-
- // Exported functions
- config.hasFocus = hasFocus;
- }
-
- initSearchInteractions(window.search);
-
- function unfocusSearchbar() {
- // hacky, but just focusing a div only works once
- const tmp = document.createElement('input');
- tmp.setAttribute('style', 'position: absolute; opacity: 0;');
- searchicon.appendChild(tmp);
- tmp.focus();
- tmp.remove();
- }
-
- // On reload or browser history backwards/forwards events, parse the url and do search or mark
- function doSearchOrMarkFromUrl() {
- // Check current URL for search request
- const url = parseURL(window.location.href);
- if (Object.prototype.hasOwnProperty.call(url.params, URL_SEARCH_PARAM)
- && url.params[URL_SEARCH_PARAM] !== '') {
- showSearch(true);
- searchbar.value = decodeURIComponent(
- (url.params[URL_SEARCH_PARAM] + '').replace(/\+/g, '%20'));
- searchbarKeyUpHandler(); // -> doSearch()
- } else {
- showSearch(false);
- }
-
- if (Object.prototype.hasOwnProperty.call(url.params, URL_MARK_PARAM)) {
- const words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' ');
- marker.mark(words, {
- exclude: mark_exclude,
- });
-
- const markers = document.querySelectorAll('mark');
- const hide = () => {
- for (let i = 0; i < markers.length; i++) {
- markers[i].classList.add('fade-out');
- window.setTimeout(() => {
- marker.unmark();
- }, 300);
- }
- };
-
- for (let i = 0; i < markers.length; i++) {
- markers[i].addEventListener('click', hide);
- }
- }
- }
-
- // Eventhandler for keyevents on `document`
- function globalKeyHandler(e) {
- if (e.altKey ||
- e.ctrlKey ||
- e.metaKey ||
- e.shiftKey ||
- e.target.type === 'textarea' ||
- e.target.type === 'text' ||
- !hasFocus() && /^(?:input|select|textarea)$/i.test(e.target.nodeName)
- ) {
- return;
- }
-
- if (e.key === 'Escape') {
- e.preventDefault();
- searchbar.classList.remove('active');
- setSearchUrlParameters('',
- searchbar.value.trim() !== '' ? 'push' : 'replace');
- if (hasFocus()) {
- unfocusSearchbar();
- }
- showSearch(false);
- marker.unmark();
- } else if (!hasFocus() && (e.key === 's' || e.key === '/')) {
- e.preventDefault();
- showSearch(true);
- window.scrollTo(0, 0);
- searchbar.select();
- } else if (hasFocus() && (e.key === 'ArrowDown'
- || e.key === 'Enter')) {
- e.preventDefault();
- const first = searchresults.firstElementChild;
- if (first !== null) {
- unfocusSearchbar();
- first.classList.add('focus');
- if (e.key === 'Enter') {
- window.location.assign(first.querySelector('a'));
- }
- }
- } else if (!hasFocus() && (e.key === 'ArrowDown'
- || e.key === 'ArrowUp'
- || e.key === 'Enter')) {
- // not `:focus` because browser does annoying scrolling
- const focused = searchresults.querySelector('li.focus');
- if (!focused) {
- return;
- }
- e.preventDefault();
- if (e.key === 'ArrowDown') {
- const next = focused.nextElementSibling;
- if (next) {
- focused.classList.remove('focus');
- next.classList.add('focus');
- }
- } else if (e.key === 'ArrowUp') {
- focused.classList.remove('focus');
- const prev = focused.previousElementSibling;
- if (prev) {
- prev.classList.add('focus');
- } else {
- searchbar.select();
- }
- } else { // Enter
- window.location.assign(focused.querySelector('a'));
- }
- }
- }
-
- function loadSearchScript(url, id) {
- if (document.getElementById(id)) {
- return;
- }
- searchbar_outer.classList.add('searching');
-
- const script = document.createElement('script');
- script.src = url;
- script.id = id;
- script.onload = () => init(window.search);
- script.onerror = error => {
- console.error(`Failed to load \`${url}\`: ${error}`);
- };
- document.head.append(script);
- }
-
- function showSearch(yes) {
- if (yes) {
- loadSearchScript(
- window.path_to_searchindex_js ||
- path_to_root + 'searchindex-3eaa3696.js',
- 'mdbook-search-index');
- search_wrap.classList.remove('hidden');
- searchicon.setAttribute('aria-expanded', 'true');
- } else {
- search_wrap.classList.add('hidden');
- searchicon.setAttribute('aria-expanded', 'false');
- const results = searchresults.children;
- for (let i = 0; i < results.length; i++) {
- results[i].classList.remove('focus');
- }
- }
- }
-
- function showResults(yes) {
- if (yes) {
- searchresults_outer.classList.remove('hidden');
- } else {
- searchresults_outer.classList.add('hidden');
- }
- }
-
- // Eventhandler for search icon
- function searchIconClickHandler() {
- if (search_wrap.classList.contains('hidden')) {
- showSearch(true);
- window.scrollTo(0, 0);
- searchbar.select();
- } else {
- showSearch(false);
- }
- }
-
- // Eventhandler for keyevents while the searchbar is focused
- function searchbarKeyUpHandler() {
- const searchterm = searchbar.value.trim();
- if (searchterm !== '') {
- searchbar.classList.add('active');
- doSearch(searchterm);
- } else {
- searchbar.classList.remove('active');
- showResults(false);
- removeChildren(searchresults);
- }
-
- setSearchUrlParameters(searchterm, 'push_if_new_search_else_replace');
-
- // Remove marks
- marker.unmark();
- }
-
- // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and
- // `#heading-anchor`. `action` can be one of "push", "replace",
- // "push_if_new_search_else_replace" and replaces or pushes a new browser history item.
- // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet.
- function setSearchUrlParameters(searchterm, action) {
- const url = parseURL(window.location.href);
- const first_search = !Object.prototype.hasOwnProperty.call(url.params, URL_SEARCH_PARAM);
-
- if (searchterm !== '' || action === 'push_if_new_search_else_replace') {
- url.params[URL_SEARCH_PARAM] = searchterm;
- delete url.params[URL_MARK_PARAM];
- url.hash = '';
- } else {
- delete url.params[URL_MARK_PARAM];
- delete url.params[URL_SEARCH_PARAM];
- }
- // A new search will also add a new history item, so the user can go back
- // to the page prior to searching. A updated search term will only replace
- // the url.
- if (action === 'push' || action === 'push_if_new_search_else_replace' && first_search ) {
- history.pushState({}, document.title, renderURL(url));
- } else if (action === 'replace' ||
- action === 'push_if_new_search_else_replace' &&
- !first_search
- ) {
- history.replaceState({}, document.title, renderURL(url));
- }
- }
-
- function doSearch(searchterm) {
- // Don't search the same twice
- if (current_searchterm === searchterm) {
- return;
- }
- searchbar_outer.classList.add('searching');
- if (searchindex === null) {
- return;
- }
-
- current_searchterm = searchterm;
-
- // Do the actual search
- const results = searchindex.search(searchterm, search_options);
- const resultcount = Math.min(results.length, results_options.limit_results);
-
- // Display search metrics
- searchresults_header.innerText = formatSearchMetric(resultcount, searchterm);
-
- // Clear and insert results
- const searchterms = searchterm.split(' ');
- removeChildren(searchresults);
- for (let i = 0; i < resultcount ; i++) {
- const resultElem = document.createElement('li');
- resultElem.innerHTML = formatSearchResult(results[i], searchterms);
- searchresults.appendChild(resultElem);
- }
-
- // Display results
- showResults(true);
- searchbar_outer.classList.remove('searching');
- }
-
- // Exported functions
- search.hasFocus = hasFocus;
-})(window.search);
diff --git a/book/pt-br/searcher-c2a407aa.js.gz b/book/pt-br/searcher-c2a407aa.js.gz
deleted file mode 100644
index 9b20589..0000000
--- a/book/pt-br/searcher-c2a407aa.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/searchindex-3eaa3696.js b/book/pt-br/searchindex-3eaa3696.js
deleted file mode 100644
index 303ce85..0000000
--- a/book/pt-br/searchindex-3eaa3696.js
+++ /dev/null
@@ -1 +0,0 @@
-window.search = Object.assign(window.search, JSON.parse('{"doc_urls":["introduction.html#introdução","introduction.html#o-que-é-uma-tessera","introduction.html#filosofia-central","introduction.html#status-atual-fase-4","introduction.html#conceitos-chave","installation.html#instalação","installation.html#pré-requisitos","installation.html#rust","installation.html#sqlite","installation.html#ferramentas-opcionais","installation.html#compilar-a-partir-do-código-fonte","installation.html#verificar-a-instalação","installation.html#auto-completions-do-shell","installation.html#app-flutter","installation.html#pré-requisitos-do-flutter","installation.html#compilar-o-app","installation.html#portas-de-rede","installation.html#próximos-passos","quick-start.html#início-rápido","quick-start.html#1-inicializar-sua-identidade","quick-start.html#2-preparar-seus-arquivos","quick-start.html#3-pré-visualizar-com-dry-run","quick-start.html#4-criar-uma-tessera","quick-start.html#5-listar-suas-tesseras","quick-start.html#6-verificar-integridade","quick-start.html#7-exportar-uma-cópia-autocontida","quick-start.html#8-inspecionar-a-exportação","commands/init.html#tes-init","commands/init.html#uso","commands/init.html#descrição","commands/init.html#opções","commands/init.html#idempotente","commands/init.html#diretório-de-dados-personalizado","commands/init.html#o-que-acontece-internamente","commands/create.html#tes-create","commands/create.html#uso","commands/create.html#argumentos","commands/create.html#opções","commands/create.html#formatos-de-arquivo-suportados","commands/create.html#inferência-de-tipo-de-memória","commands/create.html#exemplos","commands/create.html#pré-visualizar-antes-de-criar","commands/create.html#criar-com-metadados","commands/create.html#modo-não-interativo","commands/create.html#níveis-de-visibilidade","commands/create.html#o-que-acontece-internamente","commands/verify.html#tes-verify","commands/verify.html#uso","commands/verify.html#argumentos","commands/verify.html#opções","commands/verify.html#o-que-é-verificado","commands/verify.html#códigos-de-saída","commands/verify.html#exemplos","commands/verify.html#verificação-bem-sucedida","commands/verify.html#verificação-com-falha","commands/verify.html#casos-de-uso","commands/export.html#tes-export","commands/export.html#uso","commands/export.html#argumentos","commands/export.html#opções","commands/export.html#estrutura-de-saída","commands/export.html#exemplo","commands/export.html#característica-principal-autocontido","commands/export.html#casos-de-uso","commands/list.html#tes-list","commands/list.html#uso","commands/list.html#opções","commands/list.html#saída","commands/list.html#exemplo","commands/list.html#banco-de-dados-vazio","running-a-node.html#executando-um-no","running-a-node.html#iniciando-o-daemon","running-a-node.html#opcoes-de-linha-de-comando","running-a-node.html#exemplos","running-a-node.html#identidade-do-no","running-a-node.html#logging","running-a-node.html#desligamento","running-a-node.html#firewall","configuration.html#configuracao","configuration.html#exemplo-completo","configuration.html#secoes","configuration.html#node","configuration.html#dht","configuration.html#bootstrap","configuration.html#network","configuration.html#observability","configuration.html#suporte-a-ipv6","configuration.html#escutando-em-ipv6","configuration.html#bootstrap-com-ipv6","configuration.html#comportamento-de-ipv6_v6only-por-so","configuration.html#configuracao-minima","network-concepts.html#conceitos-de-rede","network-concepts.html#como-os-nos-se-encontram","network-concepts.html#o-que-a-dht-armazena","network-concepts.html#identidade-do-no-e-prova-de-trabalho","network-concepts.html#distancia-xor","network-concepts.html#transporte-quic","network-concepts.html#processo-de-bootstrap","network-concepts.html#tipos-de-no","replication.html#replicação-e-reparo","replication.html#por-que-a-replicação-importa","replication.html#codificação-de-apagamento","replication.html#camadas-de-fragmentação","replication.html#como-a-distribuição-funciona","replication.html#verificação-de-fragmentos","replication.html#loop-de-reparo","replication.html#reciprocidade","replication.html#tamanho-máximo-de-tessera","replication.html#configuração","encryption.html#criptografia-e-tesseras-seladas","encryption.html#como-a-criptografia-funciona","encryption.html#encapsulamento-de-chave-híbrido-pós-quântico","encryption.html#dados-autenticados-associados-aad","encryption.html#tesseras-seladas-cápsulas-do-tempo","encryption.html#e-as-chaves","encryption.html#princípios-de-design","heir-recovery.html#recuperação-de-chaves-por-herdeiros","heir-recovery.html#como-funciona","heir-recovery.html#criando-fragmentos-de-herdeiros","heir-recovery.html#reconstruindo-a-partir-de-fragmentos","heir-recovery.html#inspecionando-um-fragmento","heir-recovery.html#considerações-de-segurança","heir-recovery.html#princípios-de-design","nat-traversal.html#travessia-de-nat","nat-traversal.html#descoberta-do-tipo-de-nat","nat-traversal.html#hole-punching","nat-traversal.html#fallback-por-relay","nat-traversal.html#migracao-de-endereco","nat-traversal.html#configuracao","nat-traversal.html#reconexao-mobile","nat-traversal.html#monitoramento","docker.html#docker","docker.html#construindo-a-imagem","docker.html#executando-um-unico-no","docker.html#executando-como-no-semente","docker.html#rede-multi-no-com-docker-compose","docker.html#configuracao-personalizada"],"index":{"documentStore":{"docInfo":{"0":{"body":36,"breadcrumbs":2,"title":1},"1":{"body":93,"breadcrumbs":5,"title":4},"10":{"body":63,"breadcrumbs":5,"title":4},"100":{"body":41,"breadcrumbs":7,"title":4},"101":{"body":83,"breadcrumbs":6,"title":3},"102":{"body":80,"breadcrumbs":6,"title":3},"103":{"body":112,"breadcrumbs":6,"title":3},"104":{"body":107,"breadcrumbs":6,"title":3},"105":{"body":116,"breadcrumbs":6,"title":3},"106":{"body":136,"breadcrumbs":4,"title":1},"107":{"body":30,"breadcrumbs":7,"title":4},"108":{"body":89,"breadcrumbs":4,"title":1},"109":{"body":63,"breadcrumbs":8,"title":4},"11":{"body":59,"breadcrumbs":3,"title":2},"110":{"body":72,"breadcrumbs":7,"title":3},"111":{"body":97,"breadcrumbs":10,"title":6},"112":{"body":87,"breadcrumbs":8,"title":4},"113":{"body":92,"breadcrumbs":8,"title":4},"114":{"body":76,"breadcrumbs":6,"title":2},"115":{"body":66,"breadcrumbs":7,"title":3},"116":{"body":43,"breadcrumbs":10,"title":5},"117":{"body":80,"breadcrumbs":7,"title":2},"118":{"body":102,"breadcrumbs":9,"title":4},"119":{"body":72,"breadcrumbs":9,"title":4},"12":{"body":35,"breadcrumbs":4,"title":3},"120":{"body":38,"breadcrumbs":8,"title":3},"121":{"body":150,"breadcrumbs":8,"title":3},"122":{"body":79,"breadcrumbs":8,"title":3},"123":{"body":116,"breadcrumbs":6,"title":3},"124":{"body":101,"breadcrumbs":7,"title":4},"125":{"body":159,"breadcrumbs":5,"title":2},"126":{"body":123,"breadcrumbs":6,"title":3},"127":{"body":42,"breadcrumbs":6,"title":3},"128":{"body":94,"breadcrumbs":4,"title":1},"129":{"body":97,"breadcrumbs":5,"title":2},"13":{"body":12,"breadcrumbs":3,"title":2},"130":{"body":48,"breadcrumbs":4,"title":1},"131":{"body":25,"breadcrumbs":2,"title":1},"132":{"body":37,"breadcrumbs":3,"title":2},"133":{"body":51,"breadcrumbs":4,"title":3},"134":{"body":23,"breadcrumbs":4,"title":3},"135":{"body":82,"breadcrumbs":6,"title":5},"136":{"body":35,"breadcrumbs":3,"title":2},"14":{"body":48,"breadcrumbs":4,"title":3},"15":{"body":40,"breadcrumbs":4,"title":3},"16":{"body":27,"breadcrumbs":4,"title":3},"17":{"body":22,"breadcrumbs":3,"title":2},"18":{"body":22,"breadcrumbs":4,"title":2},"19":{"body":47,"breadcrumbs":6,"title":4},"2":{"body":74,"breadcrumbs":3,"title":2},"20":{"body":42,"breadcrumbs":6,"title":4},"21":{"body":14,"breadcrumbs":8,"title":6},"22":{"body":31,"breadcrumbs":6,"title":4},"23":{"body":15,"breadcrumbs":6,"title":4},"24":{"body":31,"breadcrumbs":5,"title":3},"25":{"body":19,"breadcrumbs":7,"title":5},"26":{"body":75,"breadcrumbs":5,"title":3},"27":{"body":7,"breadcrumbs":4,"title":2},"28":{"body":2,"breadcrumbs":3,"title":1},"29":{"body":49,"breadcrumbs":3,"title":1},"3":{"body":141,"breadcrumbs":5,"title":4},"30":{"body":13,"breadcrumbs":3,"title":1},"31":{"body":22,"breadcrumbs":3,"title":1},"32":{"body":17,"breadcrumbs":6,"title":4},"33":{"body":35,"breadcrumbs":6,"title":4},"34":{"body":9,"breadcrumbs":4,"title":2},"35":{"body":4,"breadcrumbs":3,"title":1},"36":{"body":8,"breadcrumbs":3,"title":1},"37":{"body":59,"breadcrumbs":3,"title":1},"38":{"body":35,"breadcrumbs":6,"title":4},"39":{"body":39,"breadcrumbs":7,"title":5},"4":{"body":125,"breadcrumbs":3,"title":2},"40":{"body":0,"breadcrumbs":3,"title":1},"41":{"body":6,"breadcrumbs":7,"title":5},"42":{"body":14,"breadcrumbs":5,"title":3},"43":{"body":7,"breadcrumbs":5,"title":3},"44":{"body":18,"breadcrumbs":5,"title":3},"45":{"body":61,"breadcrumbs":6,"title":4},"46":{"body":6,"breadcrumbs":4,"title":2},"47":{"body":3,"breadcrumbs":3,"title":1},"48":{"body":11,"breadcrumbs":3,"title":1},"49":{"body":13,"breadcrumbs":3,"title":1},"5":{"body":10,"breadcrumbs":2,"title":1},"50":{"body":24,"breadcrumbs":5,"title":3},"51":{"body":19,"breadcrumbs":5,"title":3},"52":{"body":0,"breadcrumbs":3,"title":1},"53":{"body":15,"breadcrumbs":5,"title":3},"54":{"body":19,"breadcrumbs":5,"title":3},"55":{"body":41,"breadcrumbs":5,"title":3},"56":{"body":7,"breadcrumbs":4,"title":2},"57":{"body":4,"breadcrumbs":3,"title":1},"58":{"body":15,"breadcrumbs":3,"title":1},"59":{"body":13,"breadcrumbs":3,"title":1},"6":{"body":0,"breadcrumbs":3,"title":2},"60":{"body":79,"breadcrumbs":5,"title":3},"61":{"body":7,"breadcrumbs":3,"title":1},"62":{"body":75,"breadcrumbs":5,"title":3},"63":{"body":41,"breadcrumbs":5,"title":3},"64":{"body":4,"breadcrumbs":4,"title":2},"65":{"body":2,"breadcrumbs":3,"title":1},"66":{"body":13,"breadcrumbs":3,"title":1},"67":{"body":44,"breadcrumbs":3,"title":1},"68":{"body":31,"breadcrumbs":3,"title":1},"69":{"body":10,"breadcrumbs":6,"title":4},"7":{"body":58,"breadcrumbs":2,"title":1},"70":{"body":36,"breadcrumbs":4,"title":2},"71":{"body":49,"breadcrumbs":5,"title":3},"72":{"body":58,"breadcrumbs":7,"title":5},"73":{"body":61,"breadcrumbs":3,"title":1},"74":{"body":103,"breadcrumbs":3,"title":1},"75":{"body":46,"breadcrumbs":3,"title":1},"76":{"body":30,"breadcrumbs":3,"title":1},"77":{"body":39,"breadcrumbs":3,"title":1},"78":{"body":41,"breadcrumbs":2,"title":1},"79":{"body":34,"breadcrumbs":3,"title":2},"8":{"body":108,"breadcrumbs":2,"title":1},"80":{"body":0,"breadcrumbs":2,"title":1},"81":{"body":35,"breadcrumbs":2,"title":1},"82":{"body":94,"breadcrumbs":2,"title":1},"83":{"body":37,"breadcrumbs":2,"title":1},"84":{"body":19,"breadcrumbs":2,"title":1},"85":{"body":28,"breadcrumbs":2,"title":1},"86":{"body":15,"breadcrumbs":3,"title":2},"87":{"body":64,"breadcrumbs":4,"title":3},"88":{"body":32,"breadcrumbs":4,"title":3},"89":{"body":52,"breadcrumbs":5,"title":4},"9":{"body":32,"breadcrumbs":3,"title":2},"90":{"body":34,"breadcrumbs":3,"title":2},"91":{"body":39,"breadcrumbs":6,"title":3},"92":{"body":90,"breadcrumbs":8,"title":5},"93":{"body":69,"breadcrumbs":7,"title":4},"94":{"body":89,"breadcrumbs":8,"title":5},"95":{"body":93,"breadcrumbs":5,"title":2},"96":{"body":76,"breadcrumbs":5,"title":2},"97":{"body":82,"breadcrumbs":6,"title":3},"98":{"body":100,"breadcrumbs":5,"title":2},"99":{"body":37,"breadcrumbs":6,"title":3}},"docs":{"0":{"body":"Tesseras é uma rede peer-to-peer para preservar memórias humanas através dos milênios. Cada pessoa cria uma tessera — uma cápsula do tempo autocontida de memórias (fotos, áudio, vídeo, texto) que sobrevive independentemente de qualquer software, empresa ou infraestrutura.","breadcrumbs":"Introdução » Introdução","id":"0","title":"Introdução"},"1":{"body":"A palavra tessera vem das pequenas peças usadas para fazer mosaicos no mundo antigo. No Tesseras, cada tessera é uma coleção de memórias empacotada em um formato projetado para ser compreendido mesmo daqui a milhares de anos, sem nenhum software especial. Uma tessera contém: Memórias — fotos (JPEG), gravações de áudio (WAV), vídeo (WebM) e texto (UTF-8 puro) Metadados — quando e onde cada memória foi criada, quem está envolvido e o que significa Identidade — assinaturas criptográficas provando quem criou Instruções de decodificação — explicações em texto puro de cada formato utilizado, para que humanos do futuro possam ler o conteúdo","breadcrumbs":"Introdução » O que é uma tessera?","id":"1","title":"O que é uma tessera?"},"10":{"body":"Clone o repositório e instale os binários: git clone https://git.sr.ht/~ijanc/tesseras\\ncd tesseras\\ncargo install --path crates/tesseras-cli\\ncargo install --path crates/tesseras-daemon Ou, se você tiver o just instalado: just install Isso instala dois binários em ~/.cargo/bin/ e configura auto-completions para o seu shell: tes — ferramenta CLI para criar, verificar e exportar tesseras tesseras-daemon — daemon de nó completo que participa da rede P2P","breadcrumbs":"Instalação » Compilar a partir do código-fonte","id":"10","title":"Compilar a partir do código-fonte"},"100":{"body":"Uma tessera armazenada em uma única máquina morre quando essa máquina morre. O Tesseras resolve isso dividindo os dados em fragmentos, espalhando-os entre múltiplos pares e verificando continuamente que cópias suficientes existem. Se alguns fragmentos desaparecem, a rede se repara automaticamente.","breadcrumbs":"Replicação e Reparo » Por que a replicação importa","id":"100","title":"Por que a replicação importa"},"101":{"body":"O Tesseras usa codificação de apagamento Reed-Solomon para criar fragmentos redundantes. A ideia é simples: a partir de N fragmentos de dados, gerar M fragmentos extras de paridade. Quaisquer N dos N+M fragmentos totais podem reconstruir os dados originais. Isso é muito mais eficiente em armazenamento do que replicação simples. Armazenar 3 cópias completas de um arquivo de 100 MB custa 300 MB. Com 16 dados + 8 fragmentos de paridade, você obtém proteção mais forte (pode perder até 8 de 24 fragmentos — 33%) por apenas 150 MB no total.","breadcrumbs":"Replicação e Reparo » Codificação de apagamento","id":"101","title":"Codificação de apagamento"},"102":{"body":"Nem toda tessera é tratada da mesma forma. Arquivos pequenos não se beneficiam do overhead da codificação de apagamento, então o Tesseras usa três camadas: Camada Tamanho Estratégia Fragmentos Small < 4 MB Replicação do arquivo inteiro 7 cópias do arquivo completo Medium 4–256 MB Reed-Solomon 16+8 16 dados + 8 paridade = 24 fragmentos Large ≥ 256 MB Reed-Solomon 48+24 48 dados + 24 paridade = 72 fragmentos Todas as camadas visam um fator de replicação de 7 — significando que os fragmentos são distribuídos para 7 pares diferentes.","breadcrumbs":"Replicação e Reparo » Camadas de fragmentação","id":"102","title":"Camadas de fragmentação"},"103":{"body":"Quando você cria uma tessera e o daemon a replica, isto é o que acontece: Codificar — os dados da tessera são divididos em fragmentos de acordo com sua camada de tamanho Encontrar pares — o daemon consulta a DHT pelos nós mais próximos ao hash da tessera Diversidade de sub-rede — os pares são filtrados para que poucos venham da mesma sub-rede (para evitar falhas correlacionadas se um datacenter cair) Distribuir — os fragmentos são enviados aos pares selecionados em ordem round-robin Confirmar — cada par valida o checksum do fragmento e confirma o recebimento O dono da tessera envia os fragmentos aos pares. Os pares não puxam — isso mantém o protocolo simples e garante distribuição imediata.","breadcrumbs":"Replicação e Reparo » Como a distribuição funciona","id":"103","title":"Como a distribuição funciona"},"104":{"body":"Cada fragmento carrega um checksum BLAKE3. Quando um nó recebe um fragmento, ele recalcula o hash e compara com o checksum esperado. Se não coincidem, o fragmento é rejeitado. Isso detecta tanto erros de transmissão quanto adulteração deliberada. Os fragmentos sao armazenados em um armazenamento enderecavel por conteudo (CAS) onde cada dado unico existe exatamente uma vez em disco, indexado pelo seu hash BLAKE3. Uma tabela de referencias no SQLite mapeia identificadores logicos de fragmentos para hashes CAS, habilitando deduplicacao automatica — se duas tesseras compartilham dados de fragmento identicos, apenas uma copia e armazenada. Contagem de referencias garante que os dados sejam limpos apenas quando nenhuma tessera os referencia.","breadcrumbs":"Replicação e Reparo » Verificação de fragmentos","id":"104","title":"Verificação de fragmentos"},"105":{"body":"O daemon executa um loop de reparo em segundo plano a cada 24 horas (com jitter aleatório para evitar tempestades em toda a rede). Para cada tessera sob sua responsabilidade, o loop de reparo: Solicita atestações dos detentores conhecidos — cada detentor prova que ainda possui os fragmentos reportando seus checksums Recorre ao ping se a atestação falhar — para distinguir entre “nó está offline” e “nó perdeu os dados” Verifica fragmentos locais — verifica a integridade de quaisquer fragmentos armazenados localmente recalculando checksums BLAKE3 Decide a ação: Healthy — todos os detentores responderam, todos os checksums válidos, nada a fazer Needs replication — alguns detentores sumiram, encontrar novos pares e redistribuir fragmentos ausentes Corrupt local — um fragmento local tem dados corrompidos, buscar uma substituição na rede","breadcrumbs":"Replicação e Reparo » Loop de reparo","id":"105","title":"Loop de reparo"},"106":{"body":"O Tesseras usa um livro-razão de reciprocidade bilateral para garantir troca justa de armazenamento. Não há criptomoeda, não há blockchain, não há consenso global — cada nó simplesmente rastreia seu saldo com cada par localmente: par_a: +500 MB (eles armazenam 500 MB meus)\\npar_b: -200 MB (eu armazeno 200 MB a mais deles do que eles armazenam meu)\\npar_c: 0 MB (equilibrado) As regras são simples: Armazene 1 GB na rede → você deveria armazenar aproximadamente 1 GB para outros Nós com saldo positivo (eles armazenam mais para você) recebem prioridade quando você precisa distribuir novos fragmentos Free riders perdem redundância gradualmente — seus fragmentos são despriorizados para reparo, mas nunca deletados Ao receber um fragmento, um nó verifica o déficit do remetente. Se o remetente deve muito armazenamento, o fragmento é rejeitado Nós institucionais (universidades, arquivos) podem operar altruisticamente com proporções desequilibradas","breadcrumbs":"Replicação e Reparo » Reciprocidade","id":"106","title":"Reciprocidade"},"107":{"body":"O tamanho máximo de uma tessera é 1 GB. Este é um limite prático que mantém os tamanhos de fragmentos gerenciáveis e a replicação rápida. Para coleções maiores de memórias, crie múltiplas tesseras.","breadcrumbs":"Replicação e Reparo » Tamanho máximo de tessera","id":"107","title":"Tamanho máximo de tessera"},"108":{"body":"O comportamento de replicação do daemon pode ser ajustado através da configuração: Parâmetro Padrão Descrição Intervalo de reparo 24 horas Com que frequência o loop de reparo roda Jitter de reparo 2 horas Atraso aleatório adicionado para evitar tempestades na rede Transferências simultâneas 4 Máximo de transferências paralelas de fragmentos Espaço livre mínimo 1 GB Parar de aceitar fragmentos abaixo deste limite Tolerância de déficit 256 MB Déficit máximo de armazenamento antes de rejeitar fragmentos de um par Limite por par 1 GB Armazenamento total máximo para qualquer par individual","breadcrumbs":"Replicação e Reparo » Configuração","id":"108","title":"Configuração"},"109":{"body":"A maioria das tesseras são públicas — projetadas para serem acessíveis a qualquer pessoa, para sempre. Mas algumas memórias precisam de privacidade. Tesseras suporta dois modos de visibilidade criptografada: Privada — apenas o criador (e seus herdeiros) podem acessar o conteúdo Selada — o conteúdo é bloqueado por tempo e se torna acessível após uma data específica Tesseras públicas nunca são criptografadas. Disponibilidade é mais importante que sigilo para preservação.","breadcrumbs":"Criptografia e Tesseras Seladas » Criptografia e Tesseras Seladas","id":"109","title":"Criptografia e Tesseras Seladas"},"11":{"body":"tes --help Você deverá ver: Create and preserve human memories Usage: tes [OPTIONS] <COMMAND> Commands: init Initialize identity and local database create Create a tessera from a directory of files verify Verify integrity of a stored tessera export Export tessera to a self-contained directory list List local tesseras help Print this message or the help of the given subcommand(s) Options: --data-dir <DATA_DIR> Base directory for data storage [default: ~/.tesseras] -h, --help Print help","breadcrumbs":"Instalação » Verificar a instalação","id":"11","title":"Verificar a instalação"},"110":{"body":"Quando você cria uma tessera privada ou selada, o seguinte acontece: Uma chave de conteúdo aleatória (256 bits) é gerada Cada arquivo de memória é criptografado com AES-256-GCM usando essa chave de conteúdo A chave de conteúdo é envolvida em um envelope de chave selada usando sua chave pública de criptografia A chave envolvida é armazenada junto ao conteúdo criptografado Apenas o detentor da chave privada correspondente pode desembrulhar a chave de conteúdo e decriptar o conteúdo.","breadcrumbs":"Criptografia e Tesseras Seladas » Como a criptografia funciona","id":"110","title":"Como a criptografia funciona"},"111":{"body":"O envelope de chave selada usa um Mecanismo de Encapsulamento de Chave (KEM) híbrido combinando dois algoritmos: X25519 — uma troca de chaves clássica bem testada baseada em curva elíptica ML-KEM-768 — um KEM pós-quântico baseado em reticulados padronizado pelo NIST (anteriormente Kyber) Ambos os algoritmos produzem segredos compartilhados que são combinados usando derivação de chaves BLAKE3. Um atacante precisa quebrar ambos os algoritmos para recuperar a chave de conteúdo. Isso segue o mesmo princípio das assinaturas duplas do Tesseras (Ed25519 + ML-DSA): não sabemos quais suposições criptográficas se manterão ao longo dos séculos, então apostamos nos dois.","breadcrumbs":"Criptografia e Tesseras Seladas » Encapsulamento de chave híbrido pós-quântico","id":"111","title":"Encapsulamento de chave híbrido pós-quântico"},"112":{"body":"AES-256-GCM suporta dados autenticados associados — informações extras que são verificadas durante a decriptação mas não são criptografadas. Tesseras vincula as seguintes informações no AAD: O hash do conteúdo da tessera (sempre) O timestamp open_after (apenas para tesseras seladas) Isso previne ataques de troca de texto cifrado: um atacante não pode copiar conteúdo criptografado de uma tessera para outra, porque o AAD não vai corresponder e a decriptação vai falhar. Para tesseras seladas, isso também significa que você não pode alterar a data do selo — o timestamp está criptograficamente vinculado ao texto cifrado.","breadcrumbs":"Criptografia e Tesseras Seladas » Dados autenticados associados (AAD)","id":"112","title":"Dados autenticados associados (AAD)"},"113":{"body":"Uma tessera selada é uma verdadeira cápsula do tempo. Quando você cria uma, você especifica uma data open_after. O conteúdo é criptografado e a chave é selada em um envelope que apenas você pode abrir. Quando a data open_after passa, o dono publica a chave de conteúdo como uma Publicação de Chave assinada — um artefato independente contendo a chave, o hash da tessera e a assinatura do dono. Outros nós podem verificar a assinatura e usar a chave publicada para decriptar o conteúdo. O manifesto da tessera nunca é modificado. A Publicação de Chave é um documento separado, preservando a natureza imutável e endereçada por conteúdo das tesseras.","breadcrumbs":"Criptografia e Tesseras Seladas » Tesseras seladas: cápsulas do tempo","id":"113","title":"Tesseras seladas: cápsulas do tempo"},"114":{"body":"Cada identidade agora inclui um par de chaves de criptografia junto ao par de chaves de assinatura: Tipo de chave Algoritmo Finalidade Ed25519 Clássico Assinatura de manifestos e publicações de chave ML-DSA Pós-quântico Assinatura (quando habilitado) X25519 Clássico Encapsulamento de chave (criptografia) ML-KEM-768 Pós-quântico Encapsulamento de chave (criptografia) O par de chaves de criptografia é gerado quando a identidade é criada. A metade pública é armazenada no diretório de identidade da tessera; a metade privada fica no dispositivo do dono.","breadcrumbs":"Criptografia e Tesseras Seladas » E as chaves?","id":"114","title":"E as chaves?"},"115":{"body":"Criptografar o mínimo possível — apenas conteúdo privado e selado é criptografado. Memórias públicas permanecem abertas para acessibilidade a longo prazo. Algoritmos duplos desde o início — criptografia clássica e pós-quântica, para que o conteúdo esteja protegido mesmo que um algoritmo seja quebrado. Manifestos imutáveis — chaves são publicadas separadamente, nunca modificando dados existentes. Falhar fechado — o sistema rejeita tentativas de criar tesseras privadas ou seladas sem chaves de criptografia.","breadcrumbs":"Criptografia e Tesseras Seladas » Princípios de design","id":"115","title":"Princípios de design"},"116":{"body":"Suas tesseras podem sobreviver a falhas de infraestrutura, computadores quânticos e séculos de tempo. Mas o que acontece quando você não consegue mais acessar suas próprias chaves? Tesseras usa Shamir’s Secret Sharing para permitir que você distribua sua identidade criptográfica para herdeiros de confiança.","breadcrumbs":"Recuperação de Chaves por Herdeiros » Recuperação de Chaves por Herdeiros","id":"116","title":"Recuperação de Chaves por Herdeiros"},"117":{"body":"Shamir’s Secret Sharing divide um segredo em N fragmentos com um limiar T. Qualquer T fragmentos podem reconstruir o segredo original. Menos que T fragmentos não revelam nada — isso é informação-teoricamente seguro, não apenas computacionalmente difícil de quebrar. Por exemplo, com limiar 2 e 3 fragmentos totais: Dê o fragmento 1 ao seu cônjuge Dê o fragmento 2 ao seu irmão Dê o fragmento 3 ao seu advogado Quaisquer dois deles podem recuperar sua identidade. Um único fragmento sozinho é inútil.","breadcrumbs":"Recuperação de Chaves por Herdeiros » Como funciona","id":"117","title":"Como funciona"},"118":{"body":"tes heir create --threshold 2 --shares 3 Isso divide sua chave de identidade Ed25519 em 3 fragmentos (necessitando 2 para reconstruir) e os salva em ./heir-shares/: heir-shares/\\n├── heir_share_1.bin # Binário MessagePack\\n├── heir_share_1.txt # Texto base64 legível por humanos\\n├── heir_share_2.bin\\n├── heir_share_2.txt\\n├── heir_share_3.bin\\n└── heir_share_3.txt Cada fragmento é gerado em dois formatos: Binário ( .bin) — MessagePack compacto, adequado para pendrives ou armazenamento digital Texto ( .txt) — base64 com cabeçalho legível, adequado para impressão em papel O formato texto se parece com isso: --- TESSERAS HEIR SHARE ---\\nFormat: v1\\nOwner: a1b2c3d4e5f6a7b8 (fingerprint)\\nShare: 1 of 3 (threshold: 2)\\nSession: 9f8e7d6c5b4a3210\\nCreated: 2026-02-15 <dados codificados em base64>\\n--- END HEIR SHARE ---","breadcrumbs":"Recuperação de Chaves por Herdeiros » Criando fragmentos de herdeiros","id":"118","title":"Criando fragmentos de herdeiros"},"119":{"body":"Quando os herdeiros precisam recuperar a identidade: tes heir reconstruct heir_share_1.txt heir_share_2.bin --output-dir ./recovered-keys O comando detecta automaticamente se cada arquivo é formato binário ou texto. Ele valida que todos os fragmentos pertencem à mesma sessão e dono, verifica checksums e reconstrói o par de chaves Ed25519. Para instalar as chaves recuperadas como identidade ativa: tes heir reconstruct share1.txt share2.txt --output-dir ./recovered --install Isso faz backup da identidade atual antes de substituí-la.","breadcrumbs":"Recuperação de Chaves por Herdeiros » Reconstruindo a partir de fragmentos","id":"119","title":"Reconstruindo a partir de fragmentos"},"12":{"body":"O comando just install configura completions automaticamente. Se você instalou manualmente, gere as completions para o seu shell: # Fish\\ntes completions fish > ~/.config/fish/completions/tes.fish # Zsh\\ntes completions zsh > \\"${XDG_DATA_HOME:-$HOME/.local/share}/zsh/site-functions/_tes\\" # Bash\\ntes completions bash > \\"${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion/completions/tes\\"","breadcrumbs":"Instalação » Auto-completions do shell","id":"12","title":"Auto-completions do shell"},"120":{"body":"Para ver metadados sobre um fragmento sem expor dados secretos: tes heir info heir_share_1.txt Saída: Heir Share Information: Format version: 1 Share: 1 of 3 (threshold: 2) Session: 9f8e7d6c5b4a3210 Owner fingerprint: a1b2c3d4e5f6a7b8 Share data size: 34 bytes Checksum: valid","breadcrumbs":"Recuperação de Chaves por Herdeiros » Inspecionando um fragmento","id":"120","title":"Inspecionando um fragmento"},"121":{"body":"Escolha do limiar: um limiar de 2-de-3 ou 3-de-5 é recomendado para a maioria das pessoas. Limiares mais altos são mais seguros mas requerem mais herdeiros para cooperar. Armazenamento físico: imprima os arquivos .txt em papel livre de ácido e armazene em locais físicos separados (cofres bancários, casas diferentes). Papel sobrevive décadas sem degradação. Nunca armazene fragmentos juntos: todo o propósito da divisão é a distribuição. Manter todos os fragmentos em um lugar anula o objetivo. Isolamento de sessão: cada chamada heir create gera um novo ID de sessão. Fragmentos de sessões diferentes não podem ser misturados — isso previne confusão após rotações de chave. Verificação de checksum: cada fragmento inclui um checksum BLAKE3. Fragmentos corrompidos (erros de OCR, degradação de bits) são detectados antes de qualquer tentativa de reconstrução. Re-dividir após mudanças de chave: se você regenerar sua identidade, crie novos fragmentos de herdeiros e destrua com segurança os antigos.","breadcrumbs":"Recuperação de Chaves por Herdeiros » Considerações de segurança","id":"121","title":"Considerações de segurança"},"122":{"body":"Segurança informação-teórica — T-1 fragmentos revelam exatamente zero informação sobre o segredo. Isso não é uma suposição computacional; é matematicamente provado. Detecção de corrupção — checksums BLAKE3 detectam degradação de bits, erros de OCR e truncamento antes de qualquer tentativa de reconstrução. Resiliência de formato — saída dupla (binário + texto) garante que fragmentos sobrevivam a diferentes modos de falha de mídia de armazenamento. Compatibilidade retroativa — o blob do segredo é versionado, para que versões futuras possam incluir material de chave adicional sem quebrar fragmentos existentes.","breadcrumbs":"Recuperação de Chaves por Herdeiros » Princípios de design","id":"122","title":"Princípios de design"},"123":{"body":"A maioria dos dispositivos na internet ficam atras de um NAT (Network Address Translator). Seu roteador atribui ao seu dispositivo um endereco privado (como 192.168.1.100) e o traduz para um endereco publico quando voce conecta para fora. Isso funciona bem para navegar na web, mas cria um problema para redes P2P: dois dispositivos atras de NATs diferentes nao conseguem se conectar diretamente sem ajuda. Tesseras resolve isso com uma abordagem em tres camadas, tentando a opcao mais barata primeiro: Conexao direta — se ambos os nos tem IPs publicos, eles conectam diretamente UDP hole punching — um terceiro no apresenta os dois peers para que eles possam furar seus NATs Relay — um no com IP publico encaminha pacotes entre os dois peers","breadcrumbs":"Travessia de NAT » Travessia de NAT","id":"123","title":"Travessia de NAT"},"124":{"body":"Quando um no inicia, ele envia requisicoes STUN (Session Traversal Utilities for NAT) para multiplos servidores publicos. Comparando os enderecos externos que esses servidores reportam, o no classifica seu NAT: Tipo de NAT O que significa Hole punching? Public Sem NAT — seu dispositivo tem IP publico Nao necessario Cone NAT mapeia a mesma porta interna para a mesma porta externa independente do destino Funciona bem (~80%) Symmetric NAT atribui uma porta externa diferente para cada destino Nao confiavel Unknown Nao conseguiu alcancar servidores STUN Relay necessario Seu no divulga seu tipo de NAT em mensagens Pong do DHT, para que outros nos saibam se hole punching vale a pena tentar.","breadcrumbs":"Travessia de NAT » Descoberta do tipo de NAT","id":"124","title":"Descoberta do tipo de NAT"},"125":{"body":"Quando o no A (atras de um NAT Cone) quer conectar ao no B (tambem atras de um NAT Cone), nenhum consegue alcancar o outro diretamente. A solucao: A envia uma mensagem PunchIntro ao no I (um introdutor — qualquer no com IP publico que ambos conhecam). A mensagem inclui o endereco externo de A (do STUN) e uma assinatura Ed25519 provando a identidade de A. I verifica a assinatura e encaminha um PunchRequest a B, incluindo o endereco de A e a assinatura original. B verifica a assinatura (provando que a requisicao realmente veio de A, nao de uma fonte falsificada). B entao envia um pacote UDP para o endereco externo de A — isso abre um pinhole no NAT de B. B tambem envia uma mensagem PunchReady de volta a A com o endereco externo de B. A envia um pacote UDP para o endereco externo de B. Ambos os NATs agora tem pinholes, e os dois nos podem se comunicar diretamente. O processo inteiro leva 2-5 segundos. As assinaturas Ed25519 previnem ataques de reflexao, onde um atacante reproduz uma introducao antiga para redirecionar trafego.","breadcrumbs":"Travessia de NAT » Hole punching","id":"125","title":"Hole punching"},"126":{"body":"Quando hole punching falha (NAT Symmetric, firewalls estritos ou redes corporativas), nos usam relay atraves de um no com IP publico: A envia um RelayRequest ao no R (um no com IP publico com relay habilitado). R cria uma sessao e envia um RelayOffer a ambos A e B, contendo o endereco do relay e um token de sessao. A e B enviam seus pacotes a R, prefixados com o token de sessao. R remove o token e encaminha o payload ao outro peer. Sessoes de relay tem limites de largura de banda: 256 KB/s para peers com boa reciprocidade (eles armazenam fragmentos para outros) 64 KB/s para peers sem reciprocidade Sessoes nao reciprocas sao limitadas a 10 minutos Isso incentiva nos a contribuir armazenamento — bons cidadaos da rede recebem melhor servico de relay.","breadcrumbs":"Travessia de NAT » Fallback por relay","id":"126","title":"Fallback por relay"},"127":{"body":"Quando um dispositivo movel troca de rede (Wi-Fi para celular), seu endereco IP muda. Ao inves de encerrar e reconstruir sessoes de relay, o no envia uma mensagem RelayMigrate assinada para atualizar seu endereco na sessao existente. Isso evita reestabelecer conexoes do zero.","breadcrumbs":"Travessia de NAT » Migracao de endereco","id":"127","title":"Migracao de endereco"},"128":{"body":"A secao [nat] na configuracao do daemon controla a travessia de NAT: [nat]\\n# Servidores STUN para deteccao de tipo de NAT\\nstun_servers = [\\"stun.l.google.com:19302\\", \\"stun.cloudflare.com:3478\\"] # Habilitar relay (encaminhar trafego para outros nos com NAT)\\nrelay_enabled = false # Maximo de sessoes de relay simultaneas\\nrelay_max_sessions = 50 # Limite de largura de banda para peers reciprocos (KB/s)\\nrelay_reciprocal_kbps = 256 # Limite de largura de banda para peers nao reciprocos (KB/s)\\nrelay_bootstrap_kbps = 64 # Timeout de inatividade de sessao relay (segundos)\\nrelay_idle_timeout_secs = 60 Para executar um no relay, defina relay_enabled = true. Seu no deve ter um IP publico (ou roteador com port forwarding) para servir como relay.","breadcrumbs":"Travessia de NAT » Configuracao","id":"128","title":"Configuracao"},"129":{"body":"Quando o app Tesseras detecta uma mudanca de rede em um dispositivo movel, ele executa uma sequencia de reconexao em tres fases: Migracao QUIC (0-2s) — QUIC suporta migracao de conexao nativamente. O app tenta migrar todas as conexoes ativas para o novo endereco. Re-STUN (2-5s) — descobre o novo endereco externo e re-anuncia ao DHT. Reestabelecimento (5-10s) — reconecta peers que a migracao nao conseguiu salvar, em ordem de prioridade: nos bootstrap primeiro, depois nos que guardam seus fragmentos, depois nos cujos fragmentos voce guarda. O app mostra progresso de reconexao atraves do stream de eventos NetworkChanged.","breadcrumbs":"Travessia de NAT » Reconexao mobile","id":"129","title":"Reconexao mobile"},"13":{"body":"Para compilar o app mobile ou desktop, você precisa de dependências adicionais:","breadcrumbs":"Instalação » App Flutter","id":"13","title":"App Flutter"},"130":{"body":"A travessia de NAT expoe metricas Prometheus em /metrics: tesseras_nat_type — tipo de NAT detectado atualmente tesseras_stun_requests_total / tesseras_stun_failures_total — confiabilidade STUN tesseras_punch_attempts_total{initiator_nat, target_nat} — taxa de sucesso de punch por par de NAT tesseras_relay_sessions_active — carga atual de relay tesseras_relay_bytes_forwarded — largura de banda total de relay tesseras_network_change_total — frequencia de mudanca de rede no mobile","breadcrumbs":"Travessia de NAT » Monitoramento","id":"130","title":"Monitoramento"},"131":{"body":"Tesseras fornece uma imagem Docker para executar o daemon em conteineres. Isso e util para servidores, testar redes com multiplos nos e ambientes de CI.","breadcrumbs":"Docker » Docker","id":"131","title":"Docker"},"132":{"body":"A partir da raiz do repositorio: docker build -t tesseras-daemon . O Dockerfile multi-estagio usa rust:1.85 para compilar e debian:bookworm-slim como base de execucao. A imagem resultante e pequena e contem apenas o binario do daemon e certificados CA.","breadcrumbs":"Docker » Construindo a imagem","id":"132","title":"Construindo a imagem"},"133":{"body":"docker run -d \\\\ --name tesseras \\\\ -p 4433:4433/udp \\\\ tesseras-daemon Isso inicia um no que: Escuta na porta UDP 4433 Faz bootstrap a partir dos nos semente padrao Armazena dados dentro do conteiner (efemero) Para persistir dados entre reinicializacoes do conteiner, monte um volume: docker run -d \\\\ --name tesseras \\\\ -p 4433:4433/udp \\\\ -v tesseras-data:/root/.local/share/tesseras \\\\ tesseras-daemon","breadcrumbs":"Docker » Executando um unico no","id":"133","title":"Executando um unico no"},"134":{"body":"Para executar um no semente que nao faz bootstrap de ninguem: docker run -d \\\\ --name tesseras-seed \\\\ -p 4433:4433/udp \\\\ tesseras-daemon --listen 0.0.0.0:4433 --bootstrap \\"\\"","breadcrumbs":"Docker » Executando como no semente","id":"134","title":"Executando como no semente"},"135":{"body":"O repositorio inclui um arquivo Docker Compose para testar uma rede de 3 nos: services: boot1: build: ../.. command: [\\"--listen\\", \\"0.0.0.0:4433\\", \\"--bootstrap\\", \\"\\"] ports: [\\"4433:4433/udp\\"] boot2: build: ../.. command: [\\"--listen\\", \\"0.0.0.0:4433\\", \\"--bootstrap\\", \\"boot1:4433\\"] depends_on: [boot1] client: build: ../.. command: [\\"--listen\\", \\"0.0.0.0:4433\\", \\"--bootstrap\\", \\"boot2:4433\\"] depends_on: [boot2] Iniciar a rede: cd tests/smoke\\ndocker compose up --build -d Verificar que todos os nos estao executando: docker compose logs --tail=5 Voce devera ver daemon ready nos logs de cada no, e bootstrap successful para boot2 e client. Parar a rede: docker compose down","breadcrumbs":"Docker » Rede multi-no com Docker Compose","id":"135","title":"Rede multi-no com Docker Compose"},"136":{"body":"Para usar um arquivo de configuracao com Docker, monte-o no conteiner: docker run -d \\\\ --name tesseras \\\\ -p 4433:4433/udp \\\\ -v ./config.toml:/etc/tesseras/config.toml:ro \\\\ -v tesseras-data:/root/.local/share/tesseras \\\\ tesseras-daemon --config /etc/tesseras/config.toml Veja o capitulo Configuracao para todas as opcoes disponiveis.","breadcrumbs":"Docker » Configuracao personalizada","id":"136","title":"Configuracao personalizada"},"14":{"body":"Flutter SDK — instale seguindo o guia oficial Rust — já instalado conforme acima Dependências de plataforma: Plataforma Dependências Android Android SDK, Android NDK, Java 17+ iOS Xcode, CocoaPods Linux desktop GTK 3.0+, pkg-config ( sudo apt install libgtk-3-dev pkg-config no Debian/Ubuntu) macOS desktop Xcode Command Line Tools","breadcrumbs":"Instalação » Pré-requisitos do Flutter","id":"14","title":"Pré-requisitos do Flutter"},"15":{"body":"cd apps/flutter\\nflutter pub get # Linux desktop\\nflutter build linux --debug # Android\\nflutter build apk --debug # iOS\\nflutter build ios --debug # Testes\\nflutter test Ou usando just a partir da raiz do repositório: just build-linux # Linux desktop\\njust build-android # Android APK\\njust test-flutter # Testes","breadcrumbs":"Instalação » Compilar o app","id":"15","title":"Compilar o app"},"16":{"body":"O daemon Tesseras usa QUIC (protocolo sobre UDP). Se você estiver atrás de um firewall, permita tráfego na porta: Protocolo Porta Direção UDP 4433 Entrada e saída","breadcrumbs":"Instalação » Portas de rede","id":"16","title":"Portas de rede"},"17":{"body":"Início Rápido — crie sua primeira tessera Executando um Nó — configure e execute o daemon Configuração — opções de configuração Docker — execute em contêineres","breadcrumbs":"Instalação » Próximos passos","id":"17","title":"Próximos passos"},"18":{"body":"Este tutorial guia você por um fluxo completo: criar uma identidade, construir uma tessera a partir de arquivos, verificá-la e exportá-la.","breadcrumbs":"Início Rápido » Início Rápido","id":"18","title":"Início Rápido"},"19":{"body":"Primeiro, configure sua identidade local e banco de dados: tes init Generated Ed25519 identity\\nDatabase initialized\\nConfig written to /home/user/.tesseras/config.toml\\nTesseras initialized at /home/user/.tesseras Isso cria: ~/.tesseras/identity/ — seu par de chaves Ed25519 ~/.tesseras/db/ — banco de dados SQLite para indexação ~/.tesseras/blobs/ — armazenamento para arquivos de memória ~/.tesseras/config.toml — arquivo de configuração","breadcrumbs":"Início Rápido » 1. Inicializar sua identidade","id":"19","title":"1. Inicializar sua identidade"},"2":{"body":"Sem dependência de empresas — suas memórias são suas, armazenadas localmente e replicadas em uma rede peer-to-peer Sem aprisionamento de formato — cada tessera inclui instruções para decodificar seu conteúdo Disponibilidade acima de sigilo — memórias públicas não são criptografadas, porque acessibilidade a longo prazo importa mais do que esconder coisas Criptografia mínima — apenas conteúdo privado e selado é criptografado; todo o resto é aberto Resistente a computadores quânticos — assinaturas duplas (Ed25519 + ML-DSA) protegem a integridade mesmo contra futuros computadores quânticos","breadcrumbs":"Introdução » Filosofia central","id":"2","title":"Filosofia central"},"20":{"body":"Crie um diretório com as memórias que deseja preservar: mkdir minhas-memorias\\ncp ~/fotos/jantar-familia.jpg minhas-memorias/\\ncp ~/fotos/jardim.jpg minhas-memorias/\\necho \\"Uma tarde quente de domingo com a família.\\" > minhas-memorias/reflexao.txt Formatos suportados: .jpg, .jpeg, .png (imagens), .wav (áudio), .webm (vídeo), .txt (texto).","breadcrumbs":"Início Rápido » 2. Preparar seus arquivos","id":"20","title":"2. Preparar seus arquivos"},"21":{"body":"Veja o que seria incluído sem criar nada: tes create minhas-memorias --dry-run","breadcrumbs":"Início Rápido » 3. Pré-visualizar com dry run","id":"21","title":"3. Pré-visualizar com dry run"},"22":{"body":"tes create minhas-memorias --tags \\"familia,domingo\\" --location \\"Casa\\" A saída inclui o hash de conteúdo — uma string hexadecimal de 64 caracteres que identifica unicamente sua tessera. Copie-o para os próximos passos.","breadcrumbs":"Início Rápido » 4. Criar uma tessera","id":"22","title":"4. Criar uma tessera"},"23":{"body":"tes list Hash Created Memories Size Visibility\\n9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public","breadcrumbs":"Início Rápido » 5. Listar suas tesseras","id":"23","title":"5. Listar suas tesseras"},"24":{"body":"Use o hash de conteúdo para verificar que todos os arquivos estão intactos e a assinatura é válida: tes verify 9f2c4a1b3e7d8f0c... Tessera: 9f2c4a1b3e7d8f0c...\\nSignature: VALID [OK] memories/a1b2c3/media.jpg [OK] memories/d4e5f6/media.jpg [OK] memories/g7h8i9/media.txt\\nVerification: PASSED","breadcrumbs":"Início Rápido » 6. Verificar integridade","id":"24","title":"6. Verificar integridade"},"25":{"body":"Exporte a tessera para um diretório que pode ser lido sem o Tesseras: tes export 9f2c4a1b3e7d8f0c... ./backup Exported to ./backup/tessera-9f2c4a1b3e7d8f0c...","breadcrumbs":"Início Rápido » 7. Exportar uma cópia autocontida","id":"25","title":"7. Exportar uma cópia autocontida"},"26":{"body":"O diretório exportado é totalmente autocontido: tessera-9f2c4a1b3e7d8f0c.../\\n├── MANIFEST # Índice em texto puro com checksums\\n├── README.decode # Como ler esta tessera sem software\\n├── identity/\\n│ ├── creator.pub.ed25519 # Sua chave pública\\n│ └── signature.ed25519.sig # Assinatura do MANIFEST\\n├── memories/\\n│ ├── <hash>/\\n│ │ ├── media.jpg # A foto\\n│ │ ├── context.txt # Descrição em texto puro\\n│ │ └── meta.json # Metadados estruturados\\n│ └── .../\\n└── decode/ ├── formats.txt # Explicação de todos os formatos usados ├── jpeg.txt # Como decodificar JPEG └── json.txt # Como decodificar JSON Tudo que um leitor futuro precisa para entender o conteúdo está incluído no próprio diretório — nenhum software Tesseras é necessário.","breadcrumbs":"Início Rápido » 8. Inspecionar a exportação","id":"26","title":"8. Inspecionar a exportação"},"27":{"body":"Inicializar identidade e banco de dados local.","breadcrumbs":"Comandos » init » tes init","id":"27","title":"tes init"},"28":{"body":"tes init","breadcrumbs":"Comandos » init » Uso","id":"28","title":"Uso"},"29":{"body":"Configura seu ambiente Tesseras local. Este é o primeiro comando que você deve executar após instalar o Tesseras. O comando cria: Caminho Conteúdo ~/.tesseras/identity/ Par de chaves Ed25519 para assinar tesseras ~/.tesseras/db/ Banco de dados SQLite para indexação ~/.tesseras/blobs/ Armazenamento de blobs para arquivos de memória ~/.tesseras/config.toml Arquivo de configuração","breadcrumbs":"Comandos » init » Descrição","id":"29","title":"Descrição"},"3":{"body":"Tesseras completou até a Fase 4 — criptografia e tesseras seladas. O projeto agora cobre gerenciamento local de tesseras, rede, replicação, app mobile e privacidade criptográfica. O que está disponível hoje: Geração de identidade (par de chaves Ed25519 com prova de trabalho) Criação de tesseras a partir de arquivos locais Armazenamento endereçado por conteúdo (hashing BLAKE3) Verificação de integridade e exportação autocontida Daemon de nó completo com transporte QUIC Descoberta de pares via DHT Kademlia Publicação e busca de ponteiros de tesseras pela rede Codificação de apagamento Reed-Solomon com reparo automático de fragmentos App mobile Flutter com nó Rust P2P embarcado Tesseras privadas — conteúdo criptografado que apenas o dono pode acessar Tesseras seladas — conteúdo com bloqueio temporal que abre após uma data específica Criptografia híbrida pós-quântica — encapsulamento de chaves X25519 + ML-KEM-768 AES-256-GCM para criptografia de conteúdo com vinculação AAD","breadcrumbs":"Introdução » Status atual: Fase 4","id":"3","title":"Status atual: Fase 4"},"30":{"body":"Opção Descrição --data-dir <CAMINHO> Diretório base para armazenamento de dados (padrão: ~/.tesseras)","breadcrumbs":"Comandos » init » Opções","id":"30","title":"Opções"},"31":{"body":"Executar init novamente é seguro. Se uma identidade já existe, ela é preservada: tes init Ed25519 identity already exists\\nDatabase initialized\\nTesseras initialized at /home/user/.tesseras","breadcrumbs":"Comandos » init » Idempotente","id":"31","title":"Idempotente"},"32":{"body":"tes --data-dir /mnt/usb/tesseras init Isso cria toda a estrutura de diretórios em /mnt/usb/tesseras/ ao invés do local padrão.","breadcrumbs":"Comandos » init » Diretório de dados personalizado","id":"32","title":"Diretório de dados personalizado"},"33":{"body":"Cria a estrutura de diretórios ( identity/, db/, blobs/) Gera um par de chaves Ed25519 (a chave privada permanece local, a chave pública identifica você) Executa as migrações SQLite para configurar o esquema do banco de dados Escreve um config.toml padrão","breadcrumbs":"Comandos » init » O que acontece internamente","id":"33","title":"O que acontece internamente"},"34":{"body":"Criar uma tessera a partir de um diretório de arquivos.","breadcrumbs":"Comandos » create » tes create","id":"34","title":"tes create"},"35":{"body":"tes create <CAMINHO> [OPÇÕES]","breadcrumbs":"Comandos » create » Uso","id":"35","title":"Uso"},"36":{"body":"Argumento Descrição <CAMINHO> Diretório contendo os arquivos a incluir","breadcrumbs":"Comandos » create » Argumentos","id":"36","title":"Argumentos"},"37":{"body":"Opção Descrição Padrão -n, --non-interactive Pular prompts desativado --dry-run Pré-visualizar o que seria incluído desativado --visibility <VALOR> Nível de visibilidade: public, private, circle public --language <CÓDIGO> Código de idioma (ex.: en, pt-BR) en --tags <LISTA> Tags separadas por vírgula nenhuma --location <DESC> Descrição do local nenhuma --data-dir <CAMINHO> Diretório base para armazenamento de dados ~/.tesseras","breadcrumbs":"Comandos » create » Opções","id":"37","title":"Opções"},"38":{"body":"Extensão Tipo Tipo de memória .jpg, .jpeg Imagem (JPEG) Momento .png Imagem (PNG) Momento .wav Áudio (WAV PCM) Momento .webm Vídeo (WebM) Momento .txt Texto puro (UTF-8) Reflexão Arquivos com outras extensões são ignorados.","breadcrumbs":"Comandos » create » Formatos de arquivo suportados","id":"38","title":"Formatos de arquivo suportados"},"39":{"body":"O comando atribui automaticamente um tipo de memória baseado no formato do arquivo: Arquivos de texto ( .txt) são classificados como Reflexão — pensamentos, crenças ou opiniões Todos os outros formatos são classificados como Momento — uma foto, gravação ou vídeo de algo acontecendo","breadcrumbs":"Comandos » create » Inferência de tipo de memória","id":"39","title":"Inferência de tipo de memória"},"4":{"body":"Conceito Descrição Tessera Uma cápsula do tempo autocontida de memórias Memória Um item individual (foto, gravação, vídeo ou texto) dentro de uma tessera Hash de conteúdo Um hash BLAKE3 que identifica unicamente uma tessera pelo seu conteúdo Visibilidade Controla quem pode acessar uma tessera: pública, privada, selada ou círculo Tessera selada Uma cápsula do tempo que só pode ser aberta após uma data específica MANIFEST Um índice em texto puro listando cada arquivo na tessera com seu checksum Tipo de memória Categoriza uma memória: momento, reflexão, cotidiano, relação ou objeto Nó Um dispositivo executando o daemon Tesseras, participando da rede P2P DHT Tabela hash distribuída — como os nós encontram ponteiros de tesseras sem um servidor central Bootstrap O processo de entrar na rede contactando nós semente conhecidos","breadcrumbs":"Introdução » Conceitos-chave","id":"4","title":"Conceitos-chave"},"40":{"body":"","breadcrumbs":"Comandos » create » Exemplos","id":"40","title":"Exemplos"},"41":{"body":"tes create ./minhas-fotos --dry-run","breadcrumbs":"Comandos » create » Pré-visualizar antes de criar","id":"41","title":"Pré-visualizar antes de criar"},"42":{"body":"tes create ./ferias-2026 \\\\ --tags \\"ferias,verao,praia\\" \\\\ --location \\"Florianópolis, Brasil\\" \\\\ --language pt-BR \\\\ --visibility public","breadcrumbs":"Comandos » create » Criar com metadados","id":"42","title":"Criar com metadados"},"43":{"body":"tes create ./diario --non-interactive --tags \\"cotidiano\\"","breadcrumbs":"Comandos » create » Modo não-interativo","id":"43","title":"Modo não-interativo"},"44":{"body":"Nível Quem pode acessar public Qualquer pessoa (padrão) private Apenas você (e herdeiros designados) circle Pessoas explicitamente escolhidas","breadcrumbs":"Comandos » create » Níveis de visibilidade","id":"44","title":"Níveis de visibilidade"},"45":{"body":"Varre o diretório em busca de arquivos suportados Calcula um hash BLAKE3 para cada arquivo Atribui um tipo de memória baseado na extensão do arquivo Gera um MANIFEST listando todos os arquivos com seus checksums Assina o MANIFEST com sua chave privada Ed25519 Armazena os arquivos e metadados no banco de dados local Exibe o hash de conteúdo que identifica unicamente esta tessera","breadcrumbs":"Comandos » create » O que acontece internamente","id":"45","title":"O que acontece internamente"},"46":{"body":"Verificar integridade de uma tessera armazenada.","breadcrumbs":"Comandos » verify » tes verify","id":"46","title":"tes verify"},"47":{"body":"tes verify <HASH>","breadcrumbs":"Comandos » verify » Uso","id":"47","title":"Uso"},"48":{"body":"Argumento Descrição <HASH> Hash de conteúdo da tessera (64 caracteres hexadecimais)","breadcrumbs":"Comandos » verify » Argumentos","id":"48","title":"Argumentos"},"49":{"body":"Opção Descrição --data-dir <CAMINHO> Diretório base para armazenamento de dados (padrão: ~/.tesseras)","breadcrumbs":"Comandos » verify » Opções","id":"49","title":"Opções"},"5":{"body":"Tesseras está disponível atualmente através de compilação a partir do código-fonte.","breadcrumbs":"Instalação » Instalação","id":"5","title":"Instalação"},"50":{"body":"Validade da assinatura — verifica a assinatura Ed25519 sobre o MANIFEST Integridade dos arquivos — recalcula o hash BLAKE3 de cada arquivo e compara com o MANIFEST","breadcrumbs":"Comandos » verify » O que é verificado","id":"50","title":"O que é verificado"},"51":{"body":"Código Significado 0 Verificação passou — todos os arquivos intactos, assinatura válida 1 Verificação falhou — arquivos corrompidos ou assinatura inválida","breadcrumbs":"Comandos » verify » Códigos de saída","id":"51","title":"Códigos de saída"},"52":{"body":"","breadcrumbs":"Comandos » verify » Exemplos","id":"52","title":"Exemplos"},"53":{"body":"tes verify 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01 Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01\\nSignature: VALID [OK] memories/a1b2c3d4/media.jpg [OK] memories/e5f6a7b8/media.txt [OK] memories/c9d0e1f2/media.wav\\nVerification: PASSED","breadcrumbs":"Comandos » verify » Verificação bem-sucedida","id":"53","title":"Verificação bem-sucedida"},"54":{"body":"Se um arquivo foi modificado ou corrompido: Tessera: 9f2c4a1b3e7d8f0cabc123def456789012345678abcdef0123456789abcdef01\\nSignature: VALID [OK] memories/a1b2c3d4/media.jpg [FAILED] memories/e5f6a7b8/media.txt [OK] memories/c9d0e1f2/media.wav\\nVerification: FAILED","breadcrumbs":"Comandos » verify » Verificação com falha","id":"54","title":"Verificação com falha"},"55":{"body":"Verificações rotineiras de integridade — verifique periodicamente que suas tesseras armazenadas não foram corrompidas Após transferência — verifique após copiar tesseras para um novo dispositivo ou meio de armazenamento Verificação de confiança — confirme que uma tessera recebida de outra pessoa não foi adulterada","breadcrumbs":"Comandos » verify » Casos de uso","id":"55","title":"Casos de uso"},"56":{"body":"Exportar uma tessera como um diretório autocontido.","breadcrumbs":"Comandos » export » tes export","id":"56","title":"tes export"},"57":{"body":"tes export <HASH> <DESTINO>","breadcrumbs":"Comandos » export » Uso","id":"57","title":"Uso"},"58":{"body":"Argumento Descrição <HASH> Hash de conteúdo da tessera (64 caracteres hexadecimais) <DESTINO> Diretório de destino","breadcrumbs":"Comandos » export » Argumentos","id":"58","title":"Argumentos"},"59":{"body":"Opção Descrição --data-dir <CAMINHO> Diretório base para armazenamento de dados (padrão: ~/.tesseras)","breadcrumbs":"Comandos » export » Opções","id":"59","title":"Opções"},"6":{"body":"","breadcrumbs":"Instalação » Pré-requisitos","id":"6","title":"Pré-requisitos"},"60":{"body":"A exportação cria um diretório chamado tessera-<hash> dentro do destino: tessera-9f2c4a1b.../\\n├── MANIFEST # Índice em texto puro com checksums\\n├── README.decode # Instruções de decodificação legíveis por humanos\\n├── identity/\\n│ ├── creator.pub.ed25519 # Chave pública do criador\\n│ └── signature.ed25519.sig # Assinatura do MANIFEST\\n├── memories/\\n│ ├── <hash-conteudo>/\\n│ │ ├── media.jpg # Arquivo de mídia principal\\n│ │ ├── context.txt # Contexto humano em UTF-8 puro\\n│ │ └── meta.json # Metadados estruturados\\n│ └── .../\\n├── schema/\\n│ └── v1.json # Esquema JSON para validação de metadados\\n└── decode/ ├── formats.txt # Explicação de todos os formatos usados ├── jpeg.txt # Como decodificar JPEG ├── wav.txt # Como decodificar WAV └── json.txt # Como decodificar JSON","breadcrumbs":"Comandos » export » Estrutura de saída","id":"60","title":"Estrutura de saída"},"61":{"body":"tes export 9f2c4a1b3e7d8f0cabc123def4567890... ./backup Exported to ./backup/tessera-9f2c4a1b3e7d8f0cabc123def4567890...","breadcrumbs":"Comandos » export » Exemplo","id":"61","title":"Exemplo"},"62":{"body":"O diretório exportado é projetado para ser legível sem o software Tesseras. Ele inclui: MANIFEST — um arquivo em texto puro listando cada arquivo com seu checksum BLAKE3, legível por qualquer editor de texto README.decode — instruções legíveis por humanos para compreender o conteúdo decode/ — explicações detalhadas de cada formato de arquivo usado (JPEG, WAV, JSON, UTF-8) Isso significa que alguém daqui a milhares de anos, sem conhecimento algum sobre o Tesseras, ainda pode entender e acessar as memórias.","breadcrumbs":"Comandos » export » Característica principal: autocontido","id":"62","title":"Característica principal: autocontido"},"63":{"body":"Backup — exporte para um disco externo, pendrive ou armazenamento em nuvem Compartilhamento — entregue a alguém uma cópia completa de uma tessera Arquivamento — armazene em mídia de escrita única (DVD, Blu-ray, fita) Migração — mova tesseras entre máquinas sem precisar do banco de dados","breadcrumbs":"Comandos » export » Casos de uso","id":"63","title":"Casos de uso"},"64":{"body":"Listar todas as tesseras locais.","breadcrumbs":"Comandos » list » tes list","id":"64","title":"tes list"},"65":{"body":"tes list","breadcrumbs":"Comandos » list » Uso","id":"65","title":"Uso"},"66":{"body":"Opção Descrição --data-dir <CAMINHO> Diretório base para armazenamento de dados (padrão: ~/.tesseras)","breadcrumbs":"Comandos » list » Opções","id":"66","title":"Opções"},"67":{"body":"Exibe uma tabela com as seguintes colunas: Coluna Descrição Hash Primeiros 16 caracteres do hash de conteúdo Created Data de criação (AAAA-MM-DD) Memories Número de memórias na tessera Size Tamanho total (B, KB, MB ou GB) Visibility Nível de visibilidade (public, private ou circle)","breadcrumbs":"Comandos » list » Saída","id":"67","title":"Saída"},"68":{"body":"tes list Hash Created Memories Size Visibility\\n9f2c4a1b3e7d8f0c 2026-02-14 3 284 KB public\\na3b7c2d9e4f01823 2026-02-10 1 12 KB private\\nf8e7d6c5b4a39201 2026-01-28 12 4 MB public","breadcrumbs":"Comandos » list » Exemplo","id":"68","title":"Exemplo"},"69":{"body":"Se nenhuma tessera foi criada ainda: tes list No tesseras found.","breadcrumbs":"Comandos » list » Banco de dados vazio","id":"69","title":"Banco de dados vazio"},"7":{"body":"Tesseras requer Rust 1.85 ou superior. A maneira recomendada de instalar o Rust é via rustup: curl --proto \'=https\' --tlsv1.2 -sSf https://sh.rustup.rs | sh Após a instalação, certifique-se de que ~/.cargo/bin está no seu PATH. O instalador normalmente adiciona isso automaticamente. Verifique com: rustc --version\\ncargo --version Se você já tem o Rust instalado, atualize para a versão mais recente: rustup update stable","breadcrumbs":"Instalação » Rust","id":"7","title":"Rust"},"70":{"body":"O binario tesseras-daemon executa um no completo do Tesseras que participa da rede peer-to-peer. Ele escuta conexoes sobre QUIC, entra na tabela hash distribuida (DHT) e permite que outros nos descubram e encontrem ponteiros de tesseras.","breadcrumbs":"Executando um No » Executando um No","id":"70","title":"Executando um No"},"71":{"body":"tesseras-daemon Na primeira execucao, o daemon: Cria o diretorio de dados ( ~/.local/share/tesseras no Linux, ~/Library/Application Support/tesseras no macOS) Gera uma identidade de no com prova de trabalho (leva cerca de 1 segundo) Abre um listener QUIC em 0.0.0.0:4433 Faz bootstrap na rede contactando nos semente Imprime daemon ready quando totalmente operacional","breadcrumbs":"Executando um No » Iniciando o daemon","id":"71","title":"Iniciando o daemon"},"72":{"body":"tesseras-daemon [OPTIONS] Opcao Descricao Padrao -c, --config <PATH> Caminho para um arquivo de configuracao TOML Nenhum (usa padroes internos) -l, --listen <ADDR> Endereco e porta para escutar 0.0.0.0:4433 -b, --bootstrap <ADDRS> Enderecos de bootstrap separados por virgula boot1.tesseras.net:4433,boot2.tesseras.net:4433 -d, --data-dir <PATH> Diretorio de dados Especifico da plataforma (veja acima) Opcoes CLI sobrescrevem valores do arquivo de configuracao.","breadcrumbs":"Executando um No » Opcoes de linha de comando","id":"72","title":"Opcoes de linha de comando"},"73":{"body":"Executar com padroes (entrar na rede publica): tesseras-daemon Executar como no semente (sem bootstrap, outros nos conectam a voce): tesseras-daemon --bootstrap \\"\\" Executar em uma porta personalizada com um diretorio de dados especifico: tesseras-daemon --listen 0.0.0.0:5000 --data-dir /var/lib/tesseras Fazer bootstrap a partir de um no especifico: tesseras-daemon --bootstrap \\"192.168.1.50:4433\\" Entrar em uma rede local com multiplos nos: tesseras-daemon --bootstrap \\"192.168.1.10:4433,192.168.1.11:4433\\"","breadcrumbs":"Executando um No » Exemplos","id":"73","title":"Exemplos"},"74":{"body":"Cada no tem uma identidade unica armazenada em <data-dir>/identity.key. Este arquivo contem uma chave publica de 32 bytes e um nonce de prova de trabalho de 8 bytes. O ID do no e derivado da chave publica: BLAKE3(pubkey || nonce) truncado para 20 bytes. O nonce deve produzir um hash com 8 bits zero iniciais, o que leva cerca de 256 tentativas de hash. Esta prova de trabalho leve torna caro criar milhares de identidades falsas enquanto custa menos de um segundo para usuarios legitimos. A identidade e gerada automaticamente na primeira execucao e reutilizada nas execucoes seguintes. Se voce apagar identity.key, uma nova identidade sera gerada.","breadcrumbs":"Executando um No » Identidade do no","id":"74","title":"Identidade do no"},"75":{"body":"O daemon usa logging estruturado via tracing. Controle o nivel de log com a variavel de ambiente RUST_LOG: # Padrao (nivel info)\\ntesseras-daemon # Logging de debug\\nRUST_LOG=debug tesseras-daemon # Mostrar apenas avisos e erros\\nRUST_LOG=warn tesseras-daemon # Debug para DHT, info para o resto\\nRUST_LOG=info,tesseras_dht=debug tesseras-daemon","breadcrumbs":"Executando um No » Logging","id":"75","title":"Logging"},"76":{"body":"Pressione Ctrl+C para iniciar o desligamento gracioso. O daemon ira: Parar de aceitar novas conexoes Finalizar operacoes em andamento (ate 5 segundos) Fechar todas as conexoes QUIC Sair de forma limpa","breadcrumbs":"Executando um No » Desligamento","id":"76","title":"Desligamento"},"77":{"body":"O daemon se comunica pela porta UDP 4433 (QUIC). Se voce esta atras de um firewall, certifique-se de que esta porta esta aberta para trafego UDP de entrada e saida. # Exemplo: Linux com ufw\\nsudo ufw allow 4433/udp","breadcrumbs":"Executando um No » Firewall","id":"77","title":"Firewall"},"78":{"body":"O daemon pode ser configurado via um arquivo TOML. Passe o caminho com --config: tesseras-daemon --config /etc/tesseras/config.toml Se nenhum arquivo de configuracao for fornecido, o daemon usa padroes sensiveis. Opcoes CLI ( --listen, --bootstrap, --data-dir) sobrescrevem os valores correspondentes da configuracao.","breadcrumbs":"Configuracao » Configuracao","id":"78","title":"Configuracao"},"79":{"body":"[node]\\ndata_dir = \\"~/.local/share/tesseras\\"\\nlisten_addr = \\"0.0.0.0:4433\\" [dht]\\nk = 20\\nalpha = 3\\nbucket_refresh_interval_secs = 3600\\nrepublish_interval_secs = 3600\\npointer_ttl_secs = 86400\\nmax_stored_pointers = 100000\\nping_failure_threshold = 3 [bootstrap]\\ndns_domain = \\"_tesseras._udp.tesseras.net\\"\\nhardcoded = [ \\"boot1.tesseras.net:4433\\", \\"boot2.tesseras.net:4433\\",\\n] [network]\\nenable_mdns = true [observability]\\nmetrics_addr = \\"127.0.0.1:9190\\"\\nlog_format = \\"json\\"","breadcrumbs":"Configuracao » Exemplo completo","id":"79","title":"Exemplo completo"},"8":{"body":"Tesseras usa SQLite para armazenamento local. Você tem duas opções: Opção 1: SQLite do sistema (recomendada) Instale as bibliotecas de desenvolvimento do SQLite pelo gerenciador de pacotes do seu sistema: Distribuição Comando Arch Linux sudo pacman -S sqlite Debian / Ubuntu sudo apt install libsqlite3-dev Fedora sudo dnf install sqlite-devel Alpine apk add sqlite-dev macOS (Homebrew) brew install sqlite FreeBSD pkg install sqlite3 OpenBSD Já incluído no sistema base Opção 2: SQLite embutido Se preferir não instalar o SQLite no sistema, use a feature flag bundled-sqlite durante a compilação. Isso compila o SQLite junto com o Tesseras: cargo install --path crates/tesseras-cli --features bundled-sqlite\\ncargo install --path crates/tesseras-daemon --features bundled-sqlite","breadcrumbs":"Instalação » SQLite","id":"8","title":"SQLite"},"80":{"body":"","breadcrumbs":"Configuracao » Secoes","id":"80","title":"Secoes"},"81":{"body":"Configuracoes basicas do no. Chave Tipo Padrao Descricao data_dir caminho Especifico da plataforma Onde armazenar identidade, banco de dados e blobs listen_addr endereco 0.0.0.0:4433 Endereco do listener QUIC O data_dir padrao e ~/.local/share/tesseras no Linux e ~/Library/Application Support/tesseras no macOS.","breadcrumbs":"Configuracao » [node]","id":"81","title":"[node]"},"82":{"body":"Parametros de ajuste da DHT Kademlia. Os padroes funcionam bem para a maioria das implantacoes. Chave Tipo Padrao Descricao k inteiro 20 Maximo de entradas por bucket da tabela de roteamento alpha inteiro 3 Paralelismo para buscas iterativas bucket_refresh_interval_secs inteiro 3600 Com que frequencia atualizar buckets da tabela de roteamento (segundos) republish_interval_secs inteiro 3600 Com que frequencia republicar ponteiros armazenados (segundos) pointer_ttl_secs inteiro 86400 Quanto tempo manter um ponteiro antes de expirar (segundos) max_stored_pointers inteiro 100000 Numero maximo de ponteiros armazenados localmente ping_failure_threshold inteiro 3 Quantas falhas consecutivas de ping antes de remover um par","breadcrumbs":"Configuracao » [dht]","id":"82","title":"[dht]"},"83":{"body":"Como o no descobre seus primeiros pares ao entrar na rede. Chave Tipo Padrao Descricao dns_domain string _tesseras._udp.tesseras.net Dominio DNS para descoberta de pares via registros TXT hardcoded lista de strings [\\"boot1.tesseras.net:4433\\", \\"boot2.tesseras.net:4433\\"] Enderecos de bootstrap de fallback","breadcrumbs":"Configuracao » [bootstrap]","id":"83","title":"[bootstrap]"},"84":{"body":"Funcionalidades de nivel de rede. Chave Tipo Padrao Descricao enable_mdns booleano true Habilitar descoberta na rede local via mDNS","breadcrumbs":"Configuracao » [network]","id":"84","title":"[network]"},"85":{"body":"Monitoramento e logging. Chave Tipo Padrao Descricao metrics_addr endereco 127.0.0.1:9190 Endereco para o endpoint de metricas Prometheus log_format string json Formato de saida de log ( json ou text)","breadcrumbs":"Configuracao » [observability]","id":"85","title":"[observability]"},"86":{"body":"Tesseras suporta IPv6 nativamente. Os campos listen_addr e listen_addrs aceitam tanto enderecos IPv4 quanto IPv6.","breadcrumbs":"Configuracao » Suporte a IPv6","id":"86","title":"Suporte a IPv6"},"87":{"body":"Para escutar em todas as interfaces IPv6: [node]\\nlisten_addr = \\"[::]:4433\\" No Linux e na maioria dos BSDs, vincular a [::] tambem aceita conexoes IPv4 (dual-stack) por padrao. Em alguns sistemas (notavelmente OpenBSD), [::] e somente IPv6 porque IPV6_V6ONLY e habilitado por padrao. Para garantir tanto IPv4 quanto IPv6 em todas as plataformas, use listen_addrs com enderecos explicitos: [node]\\nlisten_addrs = [\\"0.0.0.0:4433\\", \\"[::]:4433\\"] Para loopback IPv6 apenas (testes): [node]\\nlisten_addr = \\"[::1]:4433\\"","breadcrumbs":"Configuracao » Escutando em IPv6","id":"87","title":"Escutando em IPv6"},"88":{"body":"Enderecos de bootstrap podem ser IPv6: [bootstrap]\\nhardcoded = [ \\"boot1.tesseras.net:4433\\", \\"[2001:db8::1]:4433\\",\\n] Hostnames DNS com registros A e AAAA sao resolvidos para todos os enderecos, entao o daemon se conectara pelo protocolo que estiver acessivel.","breadcrumbs":"Configuracao » Bootstrap com IPv6","id":"88","title":"Bootstrap com IPv6"},"89":{"body":"SO [::] aceita IPv4? Notas Linux Sim (dual-stack) IPV6_V6ONLY padrao 0 macOS Sim (dual-stack) IPV6_V6ONLY padrao 0 FreeBSD Sim (dual-stack) IPV6_V6ONLY padrao 0 OpenBSD Nao (somente IPv6) IPV6_V6ONLY sempre 1 Windows Sim (dual-stack) IPV6_V6ONLY padrao 0 Se precisar de controle explicito, use listen_addrs com um endereco IPv4 e um IPv6.","breadcrumbs":"Configuracao » Comportamento de IPV6_V6ONLY por SO","id":"89","title":"Comportamento de IPV6_V6ONLY por SO"},"9":{"body":"Ferramenta Para quê Instalação just Executar comandos de build do projeto cargo install just mdBook Compilar a documentação cargo install mdbook Docker Executar nós em contêineres Veja Docker Flutter Compilar o app mobile/desktop Veja App Flutter","breadcrumbs":"Instalação » Ferramentas opcionais","id":"9","title":"Ferramentas opcionais"},"90":{"body":"A maioria dos usuarios nao precisa de um arquivo de configuracao. Se precisar, uma configuracao minima sobrescrevendo apenas o necessario e suficiente: [node]\\nlisten_addr = \\"0.0.0.0:5000\\" [bootstrap]\\nhardcoded = [\\"192.168.1.10:4433\\"] Todos os outros valores usam seus padroes.","breadcrumbs":"Configuracao » Configuracao minima","id":"90","title":"Configuracao minima"},"91":{"body":"Este capitulo explica como os nos do Tesseras se encontram e localizam ponteiros de tesseras na rede. Voce nao precisa entender esses detalhes para usar o Tesseras, mas eles ajudam a explicar o que o daemon esta fazendo em segundo plano.","breadcrumbs":"Conceitos de Rede » Conceitos de Rede","id":"91","title":"Conceitos de Rede"},"92":{"body":"Tesseras usa uma tabela hash distribuida (DHT) Kademlia — um algoritmo comprovado usado pelo BitTorrent e outros sistemas P2P por mais de 20 anos. Nao ha servidor central. Cada no mantem uma tabela de roteamento dos pares que conhece, e os nos cooperam para direcionar consultas ao lugar certo. Quando seu no inicia, ele contacta um ou mais nos de bootstrap (nos semente com enderecos conhecidos). Atraves dessas conexoes iniciais, seu no descobre outros pares e constroi sua tabela de roteamento. Com o tempo, seu no naturalmente aprende sobre mais pares conforme participa da rede.","breadcrumbs":"Conceitos de Rede » Como os nos se encontram","id":"92","title":"Como os nos se encontram"},"93":{"body":"A DHT armazena ponteiros, nao dados. Um ponteiro e um registro leve que diz “a tessera X esta com os nos Y e Z.” Quando alguem quer recuperar uma tessera, primeiro busca seu ponteiro na DHT para descobrir quais nos a possuem, depois conecta diretamente a esses nos para baixar os dados reais. Isso significa que a DHT permanece pequena e rapida — ela rastreia apenas quem tem o que, nao o conteudo em si.","breadcrumbs":"Conceitos de Rede » O que a DHT armazena","id":"93","title":"O que a DHT armazena"},"94":{"body":"Cada no tem um ID de no de 160 bits derivado de sua chave publica. Para evitar que um atacante crie milhares de nos falsos de forma barata (um ataque Sybil), gerar um ID de no requer uma pequena prova de trabalho: o no deve encontrar um nonce tal que BLAKE3(chave_publica || nonce) comece com 8 bits zero. Isso leva cerca de 256 tentativas de hash — menos de um segundo em qualquer dispositivo, incluindo um Raspberry Pi. Mas um atacante tentando criar 10.000 identidades falsas precisaria de milhoes de tentativas, tornando o ataque impraticavel.","breadcrumbs":"Conceitos de Rede » Identidade do no e prova de trabalho","id":"94","title":"Identidade do no e prova de trabalho"},"95":{"body":"Kademlia define “proximidade” entre nos usando a metrica XOR: a distancia entre dois IDs de no e seu XOR bit a bit. Os nos sao responsaveis por armazenar ponteiros cujas chaves estao proximas de seu proprio ID (em distancia XOR). Isso distribui dados uniformemente pela rede sem nenhuma coordenacao. Ao buscar um ponteiro de tessera, seu no pergunta aos pares que conhece que estao mais proximos da chave alvo. Esses pares apontam para outros ainda mais proximos, e assim por diante, ate que o ponteiro seja encontrado. Essa busca iterativa tipicamente alcanca qualquer no na rede em poucos saltos.","breadcrumbs":"Conceitos de Rede » Distancia XOR","id":"95","title":"Distancia XOR"},"96":{"body":"Toda comunicacao entre nos usa QUIC, um protocolo de transporte moderno construido sobre UDP. O QUIC oferece: Criptografia integrada — cada conexao usa TLS 1.3 Amigavel a NAT — funciona atraves da maioria dos tradutores de endereco de rede por ser baseado em UDP Multiplexacao — multiplas operacoes independentes sobre uma conexao sem bloqueio head-of-line Migracao de conexao — sobrevive a mudancas de rede (ex: trocar de Wi-Fi para dados moveis) O daemon escuta na porta UDP 4433 por padrao.","breadcrumbs":"Conceitos de Rede » Transporte: QUIC","id":"96","title":"Transporte: QUIC"},"97":{"body":"Quando um no inicia, ele segue esta sequencia: Contactar nos semente — conectar a um ou mais enderecos de bootstrap conhecidos Trocar pings — verificar que o semente esta vivo e trocar identidades de no Auto-busca — perguntar ao semente por nos proximos ao seu proprio ID, para popular sua tabela de roteamento Descoberta iterativa — contactar os nos recem-descobertos, que apontam para ainda mais pares Apos o bootstrap, o no mantem sua tabela de roteamento automaticamente: ele atualiza buckets periodicamente e substitui pares nao responsivos por novos.","breadcrumbs":"Conceitos de Rede » Processo de bootstrap","id":"97","title":"Processo de bootstrap"},"98":{"body":"Nem todo dispositivo participa da rede da mesma forma: Tipo Descricao Sempre ligado? No completo Desktop, servidor ou Raspberry Pi executando tesseras-daemon. Participa plenamente da DHT e armazena dados de outros nos. Sim No movel Celular ou tablet executando o app Tesseras. Participa da DHT quando o app esta ativo. Nao No navegador Navegador web executando o cliente WASM. Conecta via um no relay. Somente leitura. Nao No IoT ESP32 ou dispositivo similar na rede local. Armazena fragmentos passivamente, nao participa da DHT. Sim O daemon de no completo e a espinha dorsal da rede. Quanto mais nos completos em execucao, mais resiliente a rede se torna.","breadcrumbs":"Conceitos de Rede » Tipos de no","id":"98","title":"Tipos de no"},"99":{"body":"Este capítulo explica como o Tesseras mantém suas memórias seguras mesmo quando nós individuais ficam offline ou sofrem falhas de hardware. Você não precisa entender esses detalhes para usar o Tesseras — o daemon cuida de tudo automaticamente.","breadcrumbs":"Replicação e Reparo » Replicação e Reparo","id":"99","title":"Replicação e Reparo"}},"length":137,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"4":{"4":{"3":{"3":{"df":7,"docs":{"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"0":{"0":{"df":2,"docs":{"73":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"68":{"tf":1.0}}},"2":{"df":3,"docs":{"118":{"tf":1.0},"23":{"tf":1.0},"68":{"tf":1.4142135623730951}}},"df":4,"docs":{"106":{"tf":1.0},"129":{"tf":1.0},"51":{"tf":1.0},"89":{"tf":2.0}}},"1":{".":{"3":{"df":1,"docs":{"96":{"tf":1.0}}},"8":{"5":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{"0":{"0":{"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"101":{"tf":1.0}}},"df":3,"docs":{"126":{"tf":1.0},"129":{"tf":1.0},"68":{"tf":1.0}}},"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"9":{"1":{"9":{"0":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"23":{"tf":1.0},"68":{"tf":1.0}}},"5":{"0":{"df":1,"docs":{"101":{"tf":1.0}}},"df":1,"docs":{"118":{"tf":1.0}}},"6":{"+":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.0},"67":{"tf":1.0}}},"7":{"df":1,"docs":{"14":{"tf":1.0}}},"9":{"2":{".":{"1":{"6":{"8":{".":{"1":{".":{"1":{"0":{"0":{"df":1,"docs":{"123":{"tf":1.0}}},":":{"4":{"4":{"3":{"3":{",":{"1":{"9":{"2":{".":{"1":{"6":{"8":{".":{"1":{".":{"1":{"1":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"]":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":1.4142135623730951},"122":{"tf":1.0},"19":{"tf":1.0},"51":{"tf":1.0},"68":{"tf":1.0},"71":{"tf":1.0},"8":{"tf":1.0},"89":{"tf":1.0}}},"2":{"0":{"0":{"1":{":":{"d":{"b":{"8":{":":{":":{"1":{"]":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"2":{"6":{"df":4,"docs":{"118":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"68":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":4,"docs":{"74":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.0},"92":{"tf":1.0}}},"4":{"df":4,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"105":{"tf":1.0},"108":{"tf":1.0}}},"5":{"6":{"df":9,"docs":{"102":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.0},"3":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":2,"docs":{"23":{"tf":1.0},"68":{"tf":1.0}}},"df":1,"docs":{"68":{"tf":1.0}}},"df":9,"docs":{"108":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"120":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"129":{"tf":1.0},"20":{"tf":1.0},"8":{"tf":1.0}},"s":{"df":1,"docs":{"129":{"tf":1.0}}}},"3":{".":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"74":{"tf":1.0}}},"3":{"df":1,"docs":{"101":{"tf":1.0}}},"4":{"df":1,"docs":{"120":{"tf":1.0}}},"6":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"101":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"135":{"tf":1.0},"14":{"tf":1.0},"21":{"tf":1.0},"23":{"tf":1.0},"68":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951}}},"4":{"4":{"3":{"3":{"/":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{"df":1,"docs":{"77":{"tf":1.0}}}},"df":0,"docs":{}}},":":{"4":{"4":{"3":{"3":{"/":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{"df":4,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.0},"87":{"tf":1.4142135623730951},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"+":{"2":{"4":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"102":{"tf":1.0}}},"df":5,"docs":{"102":{"tf":1.0},"108":{"tf":1.0},"22":{"tf":1.0},"3":{"tf":1.4142135623730951},"68":{"tf":1.0}},"–":{"2":{"5":{"6":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"0":{"0":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"df":1,"docs":{"128":{"tf":1.0}}},"df":5,"docs":{"121":{"tf":1.0},"125":{"tf":1.0},"129":{"tf":1.0},"23":{"tf":1.0},"76":{"tf":1.0}},"s":{"df":1,"docs":{"129":{"tf":1.0}}}},"6":{"0":{"df":1,"docs":{"128":{"tf":1.0}}},"4":{"df":5,"docs":{"126":{"tf":1.0},"128":{"tf":1.0},"22":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0}}},"df":1,"docs":{"24":{"tf":1.0}}},"7":{"2":{"df":1,"docs":{"102":{"tf":1.0}}},"6":{"8":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"102":{"tf":1.7320508075688772},"25":{"tf":1.0}}},"8":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"6":{"4":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"1":{"tf":1.0},"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.0}}},"9":{"df":0,"docs":{},"f":{"2":{"c":{"4":{"a":{"1":{"b":{"3":{"df":0,"docs":{},"e":{"7":{"d":{"8":{"df":0,"docs":{},"f":{"0":{"c":{"a":{"b":{"c":{"1":{"2":{"3":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"5":{"6":{"7":{"8":{"9":{"0":{"1":{"2":{"3":{"4":{"5":{"6":{"7":{"8":{"a":{"b":{"c":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"1":{"2":{"3":{"4":{"5":{"6":{"7":{"8":{"9":{"a":{"b":{"c":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"1":{"df":2,"docs":{"53":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"c":{"5":{"b":{"4":{"a":{"3":{"2":{"1":{"0":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"_":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"a":{"1":{"b":{"2":{"c":{"3":{"d":{"4":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"a":{"7":{"b":{"8":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"b":{"7":{"c":{"2":{"d":{"9":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"0":{"1":{"8":{"2":{"3":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"a":{"a":{"df":2,"docs":{"67":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}},"d":{"df":2,"docs":{"112":{"tf":1.7320508075688772},"3":{"tf":1.0}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":3,"docs":{"115":{"tf":1.0},"4":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"d":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"123":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":3,"docs":{"125":{"tf":1.0},"3":{"tf":1.0},"71":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":1.0}},"m":{"df":1,"docs":{"86":{"tf":1.0}}},"r":{"df":2,"docs":{"108":{"tf":1.0},"76":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":6,"docs":{"109":{"tf":1.0},"116":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":2,"docs":{"115":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"88":{"tf":1.0}}}}}},"í":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"109":{"tf":1.0}}},"l":{"df":1,"docs":{"109":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":3,"docs":{"14":{"tf":1.0},"2":{"tf":1.0},"72":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":5,"docs":{"103":{"tf":1.0},"110":{"tf":1.0},"116":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"r":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"d":{"df":1,"docs":{"8":{"tf":1.0}},"r":{"df":1,"docs":{"72":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":1,"docs":{"7":{"tf":1.0}},"i":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":1,"docs":{"122":{"tf":1.0}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"117":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":3,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"3":{"tf":1.0}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":3,"docs":{"114":{"tf":1.0},"125":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"d":{"a":{"df":5,"docs":{"105":{"tf":1.0},"62":{"tf":1.0},"69":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"j":{"df":0,"docs":{},"u":{"d":{"a":{"df":1,"docs":{"123":{"tf":1.0}},"m":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"82":{"tf":1.0}}}}}},"l":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"a":{"df":1,"docs":{"95":{"tf":1.0}},"r":{"df":2,"docs":{"124":{"tf":1.0},"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"110":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":4,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"92":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"93":{"tf":1.0}}}},"m":{"a":{"df":1,"docs":{"109":{"tf":1.0}}},"df":1,"docs":{"62":{"tf":1.0}}},"n":{"df":3,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"87":{"tf":1.0}}},"é":{"df":0,"docs":{},"m":{"df":2,"docs":{"62":{"tf":1.0},"63":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"77":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":1,"docs":{"121":{"tf":1.0}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"95":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"131":{"tf":1.0},"29":{"tf":1.0},"75":{"tf":1.0}}}}}},"o":{"df":4,"docs":{"111":{"tf":1.4142135623730951},"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"126":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"96":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"n":{"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"76":{"tf":1.0}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"o":{"df":3,"docs":{"1":{"tf":1.0},"62":{"tf":1.0},"92":{"tf":1.0}}},"t":{"df":6,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"41":{"tf":1.0},"82":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}}}}}}}}},"i":{"df":0,"docs":{},"g":{"a":{"df":1,"docs":{"125":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"121":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"129":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"df":18,"docs":{"103":{"tf":1.7320508075688772},"105":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"114":{"tf":1.0},"117":{"tf":1.7320508075688772},"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"129":{"tf":1.0},"32":{"tf":1.0},"83":{"tf":1.0},"92":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}},"p":{"a":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"3":{"tf":1.0}}}}}}},"r":{"df":1,"docs":{"74":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":16,"docs":{"101":{"tf":1.0},"104":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.0},"132":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"44":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.0},"90":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}}},"k":{"df":2,"docs":{"15":{"tf":1.4142135623730951},"8":{"tf":1.0}}},"o":{"df":1,"docs":{"97":{"tf":1.0}},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"95":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}}},"p":{"df":6,"docs":{"129":{"tf":1.7320508075688772},"13":{"tf":1.4142135623730951},"15":{"tf":1.0},"3":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"92":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"123":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":2,"docs":{"14":{"tf":1.0},"8":{"tf":1.0}}},"ó":{"df":7,"docs":{"109":{"tf":1.0},"121":{"tf":1.4142135623730951},"29":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"55":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"36":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951},"58":{"tf":1.4142135623730951}}}}}}}}},"m":{"a":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"d":{"a":{"df":8,"docs":{"100":{"tf":1.0},"104":{"tf":1.0},"110":{"tf":1.0},"114":{"tf":1.0},"2":{"tf":1.0},"46":{"tf":1.0},"55":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":3,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"82":{"tf":1.4142135623730951}}}},"df":4,"docs":{"133":{"tf":1.0},"45":{"tf":1.0},"93":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"m":{"df":2,"docs":{"106":{"tf":1.7320508075688772},"126":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":19,"docs":{"101":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"118":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"126":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"63":{"tf":1.0},"66":{"tf":1.0},"8":{"tf":1.0}}}}}}},"r":{"df":4,"docs":{"101":{"tf":1.0},"106":{"tf":1.0},"81":{"tf":1.0},"95":{"tf":1.0}}}},"df":3,"docs":{"106":{"tf":1.0},"121":{"tf":1.4142135623730951},"63":{"tf":1.0}},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"63":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":29,"docs":{"101":{"tf":1.0},"102":{"tf":1.7320508075688772},"106":{"tf":1.0},"110":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"24":{"tf":1.0},"29":{"tf":1.4142135623730951},"3":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":2.23606797749979},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"54":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.7320508075688772},"72":{"tf":1.4142135623730951},"74":{"tf":1.0},"78":{"tf":1.4142135623730951},"90":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"113":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"95":{"tf":1.0}}},"n":{"a":{"d":{"a":{"df":2,"docs":{"113":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"45":{"tf":1.0}},"r":{"df":1,"docs":{"29":{"tf":1.0}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":11,"docs":{"1":{"tf":1.0},"111":{"tf":1.0},"113":{"tf":1.4142135623730951},"114":{"tf":1.7320508075688772},"125":{"tf":2.23606797749979},"2":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"60":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"i":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"111":{"tf":1.0},"112":{"tf":1.0},"125":{"tf":1.0},"94":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":3,"docs":{"112":{"tf":1.0},"125":{"tf":1.0},"94":{"tf":1.4142135623730951}}}}},"df":2,"docs":{"76":{"tf":1.0},"95":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}},"õ":{"df":1,"docs":{"105":{"tf":1.0}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"v":{"a":{"df":2,"docs":{"119":{"tf":1.0},"129":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"98":{"tf":1.0}}}}},"r":{"a":{"df":3,"docs":{"123":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"77":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}},"v":{"df":4,"docs":{"126":{"tf":1.0},"129":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}},"é":{"df":3,"docs":{"0":{"tf":1.0},"108":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":4,"docs":{"123":{"tf":1.0},"124":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"á":{"df":1,"docs":{"16":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"119":{"tf":1.0},"130":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"a":{"df":1,"docs":{"97":{"tf":1.0}},"r":{"df":2,"docs":{"127":{"tf":1.0},"82":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"130":{"tf":1.0},"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"105":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"a":{"df":4,"docs":{"0":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":3,"docs":{"26":{"tf":1.0},"56":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"97":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"104":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"100":{"tf":1.0},"119":{"tf":1.0},"12":{"tf":1.0},"39":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"á":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"75":{"tf":1.0}}}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"25":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":4,"docs":{"119":{"tf":1.0},"25":{"tf":1.0},"61":{"tf":1.0},"63":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"c":{"df":0,"docs":{},"o":{"df":8,"docs":{"19":{"tf":1.4142135623730951},"27":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"69":{"tf":1.0},"81":{"tf":1.0}}},"á":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}}}},"d":{"a":{"df":3,"docs":{"126":{"tf":1.0},"128":{"tf":1.4142135623730951},"130":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"123":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"6":{"4":{"df":1,"docs":{"118":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"a":{"d":{"a":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":4,"docs":{"111":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{}},"df":8,"docs":{"11":{"tf":1.0},"132":{"tf":1.0},"30":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"8":{"tf":1.0}}},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"i":{"c":{"a":{"df":1,"docs":{"81":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"125":{"tf":2.8284271247461903},"126":{"tf":1.4142135623730951},"67":{"tf":1.0},"72":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":5,"docs":{"111":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"53":{"tf":1.0},"82":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"a":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"132":{"tf":1.0},"70":{"tf":1.0}}}}}},"df":1,"docs":{"118":{"tf":1.0}},"á":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"122":{"tf":1.0}}}}}}},"t":{"df":6,"docs":{"110":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"92":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"3":{"(":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":10,"docs":{"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"111":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0},"62":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"b":{"df":4,"docs":{"122":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"81":{"tf":1.0}}},"c":{"df":0,"docs":{},"k":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"106":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"109":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"3":{"tf":1.0},"96":{"tf":1.0}}}}}}}},"u":{"df":1,"docs":{"63":{"tf":1.0}}}},"o":{"a":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"126":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"84":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"1":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{",":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":3,"docs":{"79":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"135":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":15,"docs":{"129":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":2.0},"4":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":2.23606797749979},"78":{"tf":1.0},"79":{"tf":1.0},"83":{"tf":1.4142135623730951},"88":{"tf":1.7320508075688772},"90":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":2,"docs":{"37":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"8":{"tf":1.0}}}}},"s":{"d":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"82":{"tf":1.4142135623730951},"97":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"132":{"tf":1.0},"135":{"tf":2.0},"15":{"tf":2.23606797749979},"9":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"s":{"c":{"a":{"df":6,"docs":{"3":{"tf":1.0},"45":{"tf":1.0},"82":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}},"r":{"df":2,"docs":{"105":{"tf":1.0},"95":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"120":{"tf":1.0},"74":{"tf":1.7320508075688772}}}}}},"c":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"ç":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"d":{"a":{"df":22,"docs":{"0":{"tf":1.0},"1":{"tf":1.7320508075688772},"103":{"tf":1.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.7320508075688772},"106":{"tf":1.4142135623730951},"110":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.4142135623730951},"124":{"tf":1.0},"135":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0},"62":{"tf":1.4142135623730951},"74":{"tf":1.0},"92":{"tf":1.0},"94":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"104":{"tf":1.4142135623730951},"132":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"103":{"tf":1.0}}}},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"m":{"a":{"d":{"a":{"df":3,"docs":{"102":{"tf":2.0},"103":{"tf":1.0},"123":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":11,"docs":{"29":{"tf":1.0},"30":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"o":{"df":1,"docs":{"86":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"136":{"tf":1.0},"91":{"tf":1.0}}}}}}},"í":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"99":{"tf":1.0}}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"22":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0},"67":{"tf":1.0}},"í":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"a":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{},"o":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}},"df":4,"docs":{"10":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"o":{"df":1,"docs":{"74":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"a":{"df":2,"docs":{"121":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":2,"docs":{"55":{"tf":1.0},"63":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"d":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0}}},"df":1,"docs":{"72":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"127":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"2":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"c":{"a":{"df":3,"docs":{"71":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"7":{"tf":1.0},"77":{"tf":1.0}}}}}}},"o":{"df":1,"docs":{"92":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"m":{"a":{"d":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":26,"docs":{"110":{"tf":2.8284271247461903},"111":{"tf":2.449489742783178},"113":{"tf":2.449489742783178},"114":{"tf":2.8284271247461903},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"19":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.4142135623730951},"33":{"tf":1.7320508075688772},"4":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.0},"74":{"tf":1.4142135623730951},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":12,"docs":{"103":{"tf":1.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.7320508075688772},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"26":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"i":{"d":{"a":{"d":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":1,"docs":{"131":{"tf":1.0}},"f":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"c":{"df":0,"docs":{},"l":{"df":3,"docs":{"37":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.4142135623730951}}}},"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"72":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"135":{"tf":1.4142135623730951},"98":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}},"á":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"a":{"df":2,"docs":{"111":{"tf":1.0},"115":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"o":{"b":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"c":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"103":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":1,"docs":{"121":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"õ":{"df":1,"docs":{"107":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"67":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":7,"docs":{"119":{"tf":1.0},"12":{"tf":1.0},"29":{"tf":1.4142135623730951},"39":{"tf":1.0},"72":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":45,"docs":{"101":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.7320508075688772},"108":{"tf":1.0},"110":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"121":{"tf":1.0},"123":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"126":{"tf":2.23606797749979},"128":{"tf":1.4142135623730951},"131":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"20":{"tf":1.4142135623730951},"21":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":2.449489742783178},"38":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"50":{"tf":1.0},"54":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"67":{"tf":1.0},"7":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.7320508075688772},"74":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.0},"82":{"tf":1.4142135623730951},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0},"94":{"tf":1.0}},"e":{"c":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"11":{"tf":1.4142135623730951},"135":{"tf":1.7320508075688772},"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":19,"docs":{"103":{"tf":1.0},"110":{"tf":1.0},"113":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":1.0},"123":{"tf":1.0},"128":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.0},"26":{"tf":1.7320508075688772},"39":{"tf":1.4142135623730951},"4":{"tf":1.0},"56":{"tf":1.0},"60":{"tf":1.7320508075688772},"73":{"tf":1.0},"83":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"99":{"tf":1.0}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"104":{"tf":1.0},"50":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"124":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"63":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"8":{"tf":1.0}},"r":{"df":5,"docs":{"10":{"tf":1.0},"13":{"tf":1.0},"132":{"tf":1.0},"15":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"5":{"tf":1.0},"8":{"tf":1.0}}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"101":{"tf":1.0},"63":{"tf":1.0}}},"df":3,"docs":{"10":{"tf":1.0},"12":{"tf":2.449489742783178},"3":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":7,"docs":{"10":{"tf":1.0},"102":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"70":{"tf":1.0},"79":{"tf":1.0},"98":{"tf":1.7320508075688772}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"108":{"tf":1.0},"89":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"135":{"tf":2.23606797749979}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"62":{"tf":1.0}},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"v":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"117":{"tf":1.0}}}}}}}},"df":1,"docs":{"122":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"2":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"77":{"tf":1.0}},"r":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"91":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":3,"docs":{"123":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}},"m":{"df":2,"docs":{"123":{"tf":1.0},"73":{"tf":1.0}}},"r":{"a":{"df":1,"docs":{"88":{"tf":1.0}}},"df":3,"docs":{"123":{"tf":1.0},"125":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951}},"x":{"a":{"df":0,"docs":{},"o":{"df":3,"docs":{"123":{"tf":1.0},"129":{"tf":1.0},"96":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"o":{"df":6,"docs":{"127":{"tf":1.0},"129":{"tf":1.0},"70":{"tf":1.0},"76":{"tf":1.4142135623730951},"87":{"tf":1.0},"92":{"tf":1.0}}}}},"f":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"ç":{"a":{"df":2,"docs":{"116":{"tf":1.0},"55":{"tf":1.0}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"124":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{":":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"136":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"33":{"tf":1.0}}}}}}},"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":5,"docs":{"136":{"tf":1.0},"14":{"tf":1.4142135623730951},"19":{"tf":1.0},"72":{"tf":1.0},"78":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"r":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":5,"docs":{"128":{"tf":1.4142135623730951},"136":{"tf":1.7320508075688772},"72":{"tf":1.4142135623730951},"78":{"tf":1.7320508075688772},"90":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"81":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"78":{"tf":1.0}}}},"df":3,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"29":{"tf":1.0}},"r":{"df":1,"docs":{"33":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":4,"docs":{"108":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"19":{"tf":1.0},"29":{"tf":1.0}}}}}},"df":2,"docs":{"17":{"tf":1.0},"19":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"103":{"tf":1.0}},"r":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":1,"docs":{"55":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"14":{"tf":1.0},"92":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"e":{"c":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":2,"docs":{"92":{"tf":1.0},"95":{"tf":1.0}},"i":{"d":{"df":0,"docs":{},"o":{"df":4,"docs":{"105":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"62":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"82":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":2,"docs":{"116":{"tf":1.0},"125":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"123":{"tf":1.0}}}},"i":{"df":0,"docs":{},"u":{"df":2,"docs":{"124":{"tf":1.0},"129":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"õ":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":1,"docs":{"92":{"tf":1.0}}}},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"103":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"92":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"4":{"tf":1.0},"71":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"97":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"133":{"tf":1.4142135623730951},"136":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"131":{"tf":1.0}}}}}},"m":{"df":2,"docs":{"132":{"tf":1.0},"74":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"113":{"tf":1.0},"126":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"104":{"tf":1.0},"60":{"tf":1.0},"93":{"tf":1.0}}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"ú":{"d":{"df":0,"docs":{},"o":{"df":19,"docs":{"1":{"tf":1.0},"109":{"tf":1.4142135623730951},"110":{"tf":2.449489742783178},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":2.0},"115":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"22":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":1.4142135623730951},"45":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0},"62":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"100":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"a":{"df":2,"docs":{"128":{"tf":1.0},"4":{"tf":1.0}}},"df":2,"docs":{"75":{"tf":1.0},"89":{"tf":1.0}}}}},"é":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}},"ê":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"92":{"tf":1.0}}},"r":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"95":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"104":{"tf":1.0}},"r":{"df":2,"docs":{"112":{"tf":1.0},"55":{"tf":1.0}}}},"df":1,"docs":{"22":{"tf":1.0}}}},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"d":{"a":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"112":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"110":{"tf":1.0},"78":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":4,"docs":{"105":{"tf":1.0},"121":{"tf":1.0},"51":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"105":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":2,"docs":{"4":{"tf":1.0},"43":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"p":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"10":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"11":{"tf":1.7320508075688772},"118":{"tf":1.4142135623730951},"121":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"e":{"d":{"2":{"5":{"5":{"1":{"9":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"ç":{"a":{"df":1,"docs":{"39":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"d":{"a":{"df":3,"docs":{"1":{"tf":1.0},"114":{"tf":1.0},"69":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"109":{"tf":1.0},"60":{"tf":1.0}}}}},"df":12,"docs":{"0":{"tf":1.0},"103":{"tf":1.0},"110":{"tf":1.0},"113":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"60":{"tf":1.0},"71":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":11,"docs":{"10":{"tf":1.0},"101":{"tf":1.0},"115":{"tf":1.0},"18":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"34":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"3":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"107":{"tf":1.0},"121":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":1.0},"94":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"f":{"a":{"d":{"a":{"df":3,"docs":{"109":{"tf":1.4142135623730951},"112":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":6,"docs":{"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{},"i":{"a":{"df":7,"docs":{"109":{"tf":1.0},"110":{"tf":1.4142135623730951},"114":{"tf":2.0},"115":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.7320508075688772},"96":{"tf":1.0}}},"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"112":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"á":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":4,"docs":{"1":{"tf":1.0},"111":{"tf":1.0},"116":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"d":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"+":{"c":{"df":1,"docs":{"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"j":{"a":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"129":{"tf":1.0}}}},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}},"v":{"a":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"101":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}}}},"á":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":3,"docs":{"0":{"tf":1.0},"113":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"í":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"df":0,"docs":{}}},"ó":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":4,"docs":{"10":{"tf":1.0},"37":{"tf":1.4142135623730951},"5":{"tf":1.0},"51":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"a":{"df":5,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"25":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{}}}},"ô":{"df":0,"docs":{},"n":{"df":0,"docs":{},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"117":{"tf":1.0}}}}}}}}},"d":{"a":{"d":{"df":0,"docs":{},"o":{"df":32,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772},"102":{"tf":1.4142135623730951},"103":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.4142135623730951},"112":{"tf":1.4142135623730951},"115":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":1.0},"133":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"27":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"63":{"tf":1.0},"66":{"tf":1.0},"69":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"81":{"tf":1.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}},"df":30,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"102":{"tf":1.4142135623730951},"103":{"tf":2.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.7320508075688772},"114":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.4142135623730951},"126":{"tf":1.0},"132":{"tf":1.0},"15":{"tf":1.0},"4":{"tf":1.0},"48":{"tf":1.0},"50":{"tf":1.0},"58":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":2.0},"92":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":29,"docs":{"10":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"105":{"tf":1.0},"108":{"tf":1.0},"128":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":2.0},"72":{"tf":1.0},"73":{"tf":2.23606797749979},"75":{"tf":2.23606797749979},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.7320508075688772},"8":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.4142135623730951},"99":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":2,"docs":{"1":{"tf":1.0},"62":{"tf":1.0}}}}},"t":{"a":{":":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"/":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"11":{"tf":1.0},"19":{"tf":1.0},"31":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"103":{"tf":1.0}}}}}},"df":18,"docs":{"109":{"tf":1.0},"11":{"tf":1.4142135623730951},"112":{"tf":1.0},"113":{"tf":1.4142135623730951},"120":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":1,"docs":{"33":{"tf":1.0}}},"d":{"df":1,"docs":{"67":{"tf":1.0}}},"df":6,"docs":{"117":{"tf":1.7320508075688772},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"72":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":0,"docs":{}}},":":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"132":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":2,"docs":{"15":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":3,"docs":{"26":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"60":{"tf":1.7320508075688772}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"110":{"tf":1.0},"113":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":105,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.23606797749979},"10":{"tf":1.0},"101":{"tf":3.0},"102":{"tf":2.0},"103":{"tf":1.7320508075688772},"104":{"tf":2.449489742783178},"105":{"tf":2.0},"106":{"tf":1.4142135623730951},"107":{"tf":2.0},"108":{"tf":3.3166247903554},"109":{"tf":1.4142135623730951},"110":{"tf":2.6457513110645907},"111":{"tf":2.6457513110645907},"112":{"tf":1.7320508075688772},"113":{"tf":1.7320508075688772},"114":{"tf":3.4641016151377544},"115":{"tf":1.7320508075688772},"116":{"tf":2.0},"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"119":{"tf":1.7320508075688772},"121":{"tf":4.0},"122":{"tf":3.3166247903554},"123":{"tf":1.7320508075688772},"124":{"tf":1.7320508075688772},"125":{"tf":3.605551275463989},"126":{"tf":2.6457513110645907},"127":{"tf":2.0},"128":{"tf":3.3166247903554},"129":{"tf":2.449489742783178},"13":{"tf":1.0},"130":{"tf":3.1622776601683795},"131":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":2.23606797749979},"2":{"tf":1.7320508075688772},"20":{"tf":1.0},"22":{"tf":1.4142135623730951},"24":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":2.23606797749979},"3":{"tf":3.872983346207417},"30":{"tf":1.0},"32":{"tf":1.4142135623730951},"33":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"37":{"tf":1.7320508075688772},"38":{"tf":1.4142135623730951},"39":{"tf":2.23606797749979},"4":{"tf":2.449489742783178},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":2.23606797749979},"58":{"tf":1.4142135623730951},"59":{"tf":1.0},"60":{"tf":2.23606797749979},"62":{"tf":2.0},"63":{"tf":2.0},"66":{"tf":1.0},"67":{"tf":2.0},"69":{"tf":1.0},"7":{"tf":1.4142135623730951},"70":{"tf":1.0},"71":{"tf":2.0},"72":{"tf":2.449489742783178},"73":{"tf":1.4142135623730951},"74":{"tf":3.0},"75":{"tf":1.7320508075688772},"76":{"tf":1.4142135623730951},"77":{"tf":1.7320508075688772},"78":{"tf":1.0},"8":{"tf":1.4142135623730951},"81":{"tf":1.0},"82":{"tf":2.8284271247461903},"83":{"tf":2.0},"84":{"tf":1.4142135623730951},"85":{"tf":1.7320508075688772},"88":{"tf":1.0},"89":{"tf":1.4142135623730951},"9":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951},"92":{"tf":2.0},"94":{"tf":3.605551275463989},"95":{"tf":1.7320508075688772},"96":{"tf":2.449489742783178},"97":{"tf":2.23606797749979},"98":{"tf":1.7320508075688772},"99":{"tf":1.4142135623730951}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"128":{"tf":1.0}}},"df":1,"docs":{"95":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"121":{"tf":1.4142135623730951},"122":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"106":{"tf":1.0},"117":{"tf":1.0}},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"133":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"ê":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"2":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":2,"docs":{"129":{"tf":1.4142135623730951},"93":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"74":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"s":{"a":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"100":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":1,"docs":{"37":{"tf":1.0}},"o":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":5,"docs":{"124":{"tf":1.0},"3":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"97":{"tf":1.0}}}}}},"r":{"df":3,"docs":{"129":{"tf":1.0},"83":{"tf":1.0},"92":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"o":{"df":7,"docs":{"72":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":13,"docs":{"108":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.4142135623730951},"4":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0}}}}}}},"u":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"70":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"d":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"j":{"a":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}},"m":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"44":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"115":{"tf":1.0},"122":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"98":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"76":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"s":{"a":{"df":1,"docs":{"92":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"108":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":4,"docs":{"124":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"60":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"u":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"d":{"a":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"91":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"121":{"tf":1.0},"130":{"tf":1.0}}}},"df":3,"docs":{"104":{"tf":1.0},"119":{"tf":1.0},"129":{"tf":1.0}},"m":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":0,"docs":{}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"105":{"tf":2.0},"110":{"tf":1.0}}}}}}}},"v":{"df":2,"docs":{"14":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":5,"docs":{"106":{"tf":1.0},"128":{"tf":1.0},"29":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}},"l":{"df":1,"docs":{"8":{"tf":1.0}}},"r":{"a":{"df":1,"docs":{"135":{"tf":1.0}}},"df":1,"docs":{"11":{"tf":1.0}},"i":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"t":{"df":12,"docs":{"103":{"tf":1.0},"124":{"tf":1.0},"129":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"75":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":2.0},"98":{"tf":1.7320508075688772}}}},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"95":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"43":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"102":{"tf":1.0},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0}}}}}}},"í":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"117":{"tf":1.0}}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"r":{">":{"/":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"11":{"tf":1.0},"119":{"tf":1.4142135623730951},"30":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"11":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"123":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"123":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"93":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":3,"docs":{"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}}}}}},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":18,"docs":{"114":{"tf":1.0},"20":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"30":{"tf":1.0},"32":{"tf":1.4142135623730951},"33":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":2,"docs":{"104":{"tf":1.0},"63":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":2,"docs":{"109":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"136":{"tf":1.0}}}}}},"í":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":9,"docs":{"114":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.0},"4":{"tf":1.0},"55":{"tf":1.0},"94":{"tf":1.0},"98":{"tf":1.4142135623730951}}}}}}}}}},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"95":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"105":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"a":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"a":{"df":2,"docs":{"70":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"95":{"tf":1.0}},"r":{"df":2,"docs":{"103":{"tf":1.0},"106":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":3,"docs":{"103":{"tf":1.4142135623730951},"121":{"tf":1.0},"8":{"tf":1.0}}}}}},"í":{"d":{"a":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"i":{"d":{"df":2,"docs":{"117":{"tf":1.0},"118":{"tf":1.0}},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"100":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"g":{"a":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}}}}},"z":{"df":1,"docs":{"93":{"tf":1.0}}}},"n":{"df":2,"docs":{"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":1,"docs":{"8":{"tf":1.0}}},"s":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"131":{"tf":1.4142135623730951},"132":{"tf":1.0},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":2.23606797749979},"136":{"tf":1.4142135623730951},"17":{"tf":1.0},"9":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"132":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}}},"df":11,"docs":{"0":{"tf":1.0},"101":{"tf":1.0},"105":{"tf":1.0},"111":{"tf":1.0},"123":{"tf":1.0},"133":{"tf":1.0},"50":{"tf":1.0},"87":{"tf":1.0},"90":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":8,"docs":{"10":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.0},"123":{"tf":1.7320508075688772},"125":{"tf":1.0},"95":{"tf":1.0}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"20":{"tf":1.0}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"83":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"df":5,"docs":{"103":{"tf":1.0},"113":{"tf":1.4142135623730951},"114":{"tf":1.0},"119":{"tf":1.0},"3":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"98":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"135":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"21":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.0}}}},"s":{"a":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{}},"u":{"a":{"df":2,"docs":{"104":{"tf":1.0},"8":{"tf":1.0}},"l":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":2.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":3,"docs":{"111":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"115":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"112":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}},"é":{"c":{"a":{"d":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"106":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"20":{"tf":1.0}}}}},"d":{"2":{"5":{"5":{"1":{"9":{"df":13,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"125":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"2":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"62":{"tf":1.0}}}}}}},"df":59,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"100":{"tf":1.0},"103":{"tf":1.7320508075688772},"104":{"tf":1.4142135623730951},"105":{"tf":1.4142135623730951},"107":{"tf":1.0},"109":{"tf":1.7320508075688772},"110":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":2.0},"114":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":2.0},"126":{"tf":2.23606797749979},"127":{"tf":1.0},"129":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":2.0},"135":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.4142135623730951},"24":{"tf":1.0},"27":{"tf":1.0},"3":{"tf":2.0},"44":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0},"62":{"tf":1.0},"70":{"tf":1.4142135623730951},"72":{"tf":1.0},"74":{"tf":2.0},"75":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.7320508075688772},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.7320508075688772},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.7320508075688772},"93":{"tf":1.7320508075688772},"94":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951},"99":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"l":{"a":{"df":2,"docs":{"31":{"tf":1.0},"93":{"tf":1.0}}},"df":12,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"119":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"126":{"tf":1.0},"129":{"tf":1.0},"62":{"tf":1.0},"70":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.4142135623730951}},"í":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"b":{"a":{"df":0,"docs":{},"r":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":39,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"105":{"tf":1.4142135623730951},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"113":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":2.23606797749979},"121":{"tf":1.7320508075688772},"123":{"tf":1.0},"124":{"tf":1.0},"129":{"tf":1.7320508075688772},"130":{"tf":1.0},"131":{"tf":1.0},"17":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"32":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.4142135623730951},"71":{"tf":1.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.0},"76":{"tf":1.0},"87":{"tf":2.0},"9":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.0},"98":{"tf":1.0}},"p":{"a":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"a":{"d":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"a":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{}}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"n":{"df":2,"docs":{"79":{"tf":1.0},"84":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":3,"docs":{"123":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0}},"r":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"95":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":3,"docs":{"4":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0}}},"r":{"df":3,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}}},"d":{"df":1,"docs":{"118":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":17,"docs":{"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":2.23606797749979},"126":{"tf":1.0},"127":{"tf":1.7320508075688772},"129":{"tf":1.4142135623730951},"72":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951},"83":{"tf":1.0},"85":{"tf":1.4142135623730951},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{},"ç":{"a":{"d":{"a":{"df":1,"docs":{"113":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"85":{"tf":1.0}}}}}}}},"df":1,"docs":{"37":{"tf":1.4142135623730951}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"o":{"df":2,"docs":{"125":{"tf":1.0},"88":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"26":{"tf":1.0},"62":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"d":{"a":{"df":3,"docs":{"16":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"70":{"tf":1.0}},"r":{"df":3,"docs":{"4":{"tf":1.0},"73":{"tf":1.4142135623730951},"83":{"tf":1.0}}}},"df":7,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"123":{"tf":1.0},"133":{"tf":1.0},"63":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"63":{"tf":1.0}}}}}},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"102":{"tf":1.0},"111":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"113":{"tf":1.0}}}}}},"i":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":5,"docs":{"103":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":2.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.0}},"m":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"110":{"tf":1.4142135623730951}}},"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":4,"docs":{"104":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"75":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"44":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"33":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"a":{"df":3,"docs":{"133":{"tf":1.0},"70":{"tf":1.0},"96":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"72":{"tf":1.0},"87":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"3":{"2":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"100":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"ç":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"113":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":3,"docs":{"72":{"tf":1.0},"73":{"tf":1.4142135623730951},"81":{"tf":1.0}}}},"df":0,"docs":{}}}},"í":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":3,"docs":{"109":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"33":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"a":{"df":3,"docs":{"100":{"tf":1.0},"110":{"tf":1.0},"95":{"tf":1.0}}},"df":5,"docs":{"124":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0},"99":{"tf":1.0}}},"t":{"a":{"df":8,"docs":{"26":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"77":{"tf":1.7320508075688772},"91":{"tf":1.0},"93":{"tf":1.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.0}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"132":{"tf":1.0}}}}},"o":{"df":2,"docs":{"135":{"tf":1.0},"95":{"tf":1.4142135623730951}}}},"df":13,"docs":{"1":{"tf":1.0},"105":{"tf":1.0},"107":{"tf":1.0},"112":{"tf":1.0},"18":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"j":{"a":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"16":{"tf":1.0},"88":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"é":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"126":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"26":{"tf":1.0},"60":{"tf":1.0},"75":{"tf":1.0}}}},"df":3,"docs":{"32":{"tf":1.0},"33":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}}}}}},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"t":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"136":{"tf":1.0},"78":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":1,"docs":{"106":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"129":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"127":{"tf":1.0}},"r":{"df":4,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"a":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"122":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"37":{"tf":1.0},"96":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"u":{"c":{"a":{"df":0,"docs":{},"o":{"df":4,"docs":{"132":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"74":{"tf":1.0}}}},"df":0,"docs":{},"t":{"a":{"df":4,"docs":{"105":{"tf":1.0},"129":{"tf":1.0},"33":{"tf":1.0},"70":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":7,"docs":{"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"17":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"98":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"r":{"df":7,"docs":{"128":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"73":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":8,"docs":{"117":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"68":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.0},"79":{"tf":1.0}}}}}}},"i":{"b":{"df":2,"docs":{"45":{"tf":1.0},"67":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"31":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"100":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.0},"122":{"tf":1.0},"127":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"82":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"c":{"a":{"df":2,"docs":{"91":{"tf":1.0},"99":{"tf":1.0}},"r":{"df":1,"docs":{"91":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}},"õ":{"df":2,"docs":{"1":{"tf":1.0},"62":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"44":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"df":1,"docs":{"130":{"tf":1.0}},"r":{"df":1,"docs":{"120":{"tf":1.0}},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"26":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.0},"25":{"tf":1.0},"56":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":3,"docs":{"26":{"tf":1.0},"3":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":7,"docs":{"11":{"tf":1.4142135623730951},"18":{"tf":1.0},"25":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":1.0},"61":{"tf":1.4142135623730951},"63":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"38":{"tf":1.0},"45":{"tf":1.0}}}},"õ":{"df":1,"docs":{"38":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"124":{"tf":1.4142135623730951}}},"df":0,"docs":{},"o":{"df":4,"docs":{"124":{"tf":1.0},"125":{"tf":2.0},"129":{"tf":1.0},"63":{"tf":1.0}}}}}},"r":{"a":{"df":2,"docs":{"101":{"tf":1.0},"112":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"8":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"c":{"5":{"b":{"4":{"a":{"3":{"9":{"2":{"0":{"1":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"h":{"a":{"df":7,"docs":{"103":{"tf":1.0},"116":{"tf":1.0},"122":{"tf":1.0},"126":{"tf":1.0},"54":{"tf":1.0},"82":{"tf":1.0},"99":{"tf":1.0}},"r":{"df":3,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"51":{"tf":1.0}}}}},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"126":{"tf":1.0},"83":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"a":{"df":2,"docs":{"74":{"tf":1.0},"94":{"tf":1.0}}},"df":1,"docs":{"128":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"a":{"df":1,"docs":{"125":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":1,"docs":{"94":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{",":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"22":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"í":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"129":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}},"z":{"df":4,"docs":{"119":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"71":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":3,"docs":{"1":{"tf":1.0},"105":{"tf":1.0},"73":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"76":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"42":{"tf":1.0}},"s":{",":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"o":{",":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"c":{"a":{"df":1,"docs":{"114":{"tf":1.0}},"m":{"df":2,"docs":{"123":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"127":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"114":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"76":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"t":{"a":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"ó":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"3":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"x":{"df":0,"docs":{},"o":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"i":{"df":4,"docs":{"1":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"69":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"125":{"tf":1.0},"5":{"tf":1.0}}}},"r":{"a":{"df":1,"docs":{"123":{"tf":1.0}},"m":{"df":1,"docs":{"55":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":4,"docs":{"102":{"tf":1.0},"76":{"tf":1.0},"94":{"tf":1.0},"98":{"tf":1.0}},"t":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}},"o":{"df":12,"docs":{"1":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0},"85":{"tf":1.0}}},"s":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"131":{"tf":1.0}},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"78":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":1,"docs":{"101":{"tf":1.0}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"26":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"102":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":19,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.449489742783178},"102":{"tf":2.0},"103":{"tf":2.0},"104":{"tf":2.6457513110645907},"105":{"tf":2.23606797749979},"106":{"tf":2.0},"107":{"tf":1.0},"108":{"tf":1.7320508075688772},"117":{"tf":2.8284271247461903},"118":{"tf":1.7320508075688772},"119":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":2.449489742783178},"122":{"tf":1.7320508075688772},"126":{"tf":1.0},"129":{"tf":1.4142135623730951},"3":{"tf":1.0},"98":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"s":{"d":{"df":2,"docs":{"8":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"106":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"130":{"tf":1.0},"82":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"ê":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":6,"docs":{"103":{"tf":1.0},"110":{"tf":1.0},"117":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"84":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":1,"docs":{"82":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"_":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":3,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.0}}}}}}},"í":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"g":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"103":{"tf":1.0},"104":{"tf":1.0},"122":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"106":{"tf":1.0},"87":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"b":{"df":4,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"67":{"tf":1.0}}},"c":{"df":0,"docs":{},"m":{"df":3,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"19":{"tf":1.0}}}}},"r":{"a":{"d":{"a":{"df":2,"docs":{"110":{"tf":1.0},"74":{"tf":1.4142135623730951}}},"df":0,"docs":{},"o":{"df":2,"docs":{"114":{"tf":1.0},"118":{"tf":1.0}}}},"df":4,"docs":{"121":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"71":{"tf":1.0}},"r":{"df":2,"docs":{"101":{"tf":1.0},"94":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}},"n":{"c":{"df":0,"docs":{},"i":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}},"df":0,"docs":{},"á":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"107":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"76":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"39":{"tf":1.0},"4":{"tf":1.0}}}},"õ":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"r":{"d":{"a":{"df":1,"docs":{"129":{"tf":1.0}},"m":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"14":{"tf":1.0},"18":{"tf":1.0}}},"df":0,"docs":{}}}},"h":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"114":{"tf":1.0},"126":{"tf":1.0},"87":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"128":{"tf":1.0},"84":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"92":{"tf":1.0}},"r":{"d":{"c":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"79":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":23,"docs":{"103":{"tf":1.0},"104":{"tf":1.7320508075688772},"112":{"tf":1.0},"113":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"50":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":1.4142135623730951},"92":{"tf":1.0},"94":{"tf":1.0}}}}},"df":2,"docs":{"106":{"tf":1.7320508075688772},"11":{"tf":1.0}},"e":{"a":{"d":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"105":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"1":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0}}}}}},"df":0,"docs":{}},"2":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"118":{"tf":1.0},"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"df":0,"docs":{}},"3":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":4,"docs":{"118":{"tf":2.23606797749979},"119":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":1.0}}}},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"11":{"tf":2.23606797749979}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":6,"docs":{"109":{"tf":1.0},"116":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.4142135623730951},"44":{"tf":1.0}}}}}}},"df":0,"docs":{}},"x":{"a":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":2,"docs":{"48":{"tf":1.0},"58":{"tf":1.0}}}},"df":1,"docs":{"22":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"df":1,"docs":{"3":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":4,"docs":{"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"/":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"}":{"/":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"z":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"19":{"tf":1.0},"31":{"tf":1.0}},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"df":0,"docs":{}}},"r":{"a":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"~":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"n":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"0":{"tf":1.0}}},"df":1,"docs":{"11":{"tf":1.0}},"o":{"df":4,"docs":{"1":{"tf":1.0},"118":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}}}}},"df":0,"docs":{}}},"í":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"d":{"df":5,"docs":{"121":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"e":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":6,"docs":{"11":{"tf":1.0},"19":{"tf":1.0},"26":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"60":{"tf":1.0}},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"d":{"a":{"d":{"df":18,"docs":{"1":{"tf":1.0},"114":{"tf":1.7320508075688772},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.7320508075688772},"121":{"tf":1.0},"125":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"27":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":2.23606797749979},"81":{"tf":1.0},"94":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":4,"docs":{"22":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}},"n":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"82":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"100":{"tf":1.0},"2":{"tf":1.0}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"109":{"tf":1.0}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":1,"docs":{"71":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"á":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"115":{"tf":1.0}}},"l":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}}},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}}}}}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":7,"docs":{"114":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"135":{"tf":1.0},"2":{"tf":1.0},"22":{"tf":1.0},"62":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"125":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"122":{"tf":1.0},"36":{"tf":1.0}}}},"í":{"d":{"df":0,"docs":{},"o":{"df":4,"docs":{"21":{"tf":1.0},"26":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"113":{"tf":1.0},"124":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}}},"x":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":2,"docs":{"108":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"ê":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"39":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":2,"docs":{"120":{"tf":1.0},"75":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"117":{"tf":1.0},"122":{"tf":1.4142135623730951}}}},"õ":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"120":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"0":{"tf":1.0},"116":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":4,"docs":{"124":{"tf":1.0},"133":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.0}},"i":{"df":2,"docs":{"74":{"tf":1.0},"92":{"tf":1.0}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"19":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"71":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"135":{"tf":1.0},"76":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":6,"docs":{"11":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.4142135623730951},"32":{"tf":1.0}},"i":{"df":3,"docs":{"11":{"tf":1.0},"19":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"120":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"l":{"a":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"7":{"tf":1.0}},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":1,"docs":{"10":{"tf":1.0}},"r":{"df":4,"docs":{"119":{"tf":1.0},"29":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":4,"docs":{"11":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":6,"docs":{"10":{"tf":2.0},"119":{"tf":1.0},"12":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"8":{"tf":2.6457513110645907},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"õ":{"df":4,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}}}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"24":{"tf":1.0},"51":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"11":{"tf":1.0}},"i":{"d":{"a":{"d":{"df":7,"docs":{"105":{"tf":1.0},"2":{"tf":1.0},"24":{"tf":1.0},"3":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0},"55":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"102":{"tf":1.0},"125":{"tf":1.0},"82":{"tf":2.6457513110645907}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"37":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"43":{"tf":1.0}}}}}}},"df":0,"docs":{},"f":{"a":{"c":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"a":{"df":1,"docs":{"124":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}},"o":{"df":1,"docs":{"72":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"125":{"tf":1.0}}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"v":{"df":1,"docs":{"127":{"tf":1.0}},"á":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"é":{"df":1,"docs":{"32":{"tf":1.0}}}},"í":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":3,"docs":{"115":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0}}}}},"df":0,"docs":{}},"ú":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"o":{"df":2,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951}},"t":{"df":1,"docs":{"98":{"tf":1.0}}}},"p":{"df":6,"docs":{"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":1.0}},"v":{"4":{"df":3,"docs":{"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}}},"6":{"_":{"df":0,"docs":{},"v":{"6":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":2.449489742783178}}}}}}},"df":0,"docs":{}}},"df":4,"docs":{"86":{"tf":1.7320508075688772},"87":{"tf":2.23606797749979},"88":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"a":{"df":1,"docs":{"76":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"117":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"o":{"df":26,"docs":{"10":{"tf":1.0},"100":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"19":{"tf":1.0},"32":{"tf":1.0},"62":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"4":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":3,"docs":{"82":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"j":{"a":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"14":{"tf":1.0},"31":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":6,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0}}}},"g":{"df":2,"docs":{"20":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":5,"docs":{"26":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0},"79":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":4,"docs":{"110":{"tf":1.0},"114":{"tf":1.0},"121":{"tf":1.0},"8":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}}}},"k":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":4,"docs":{"3":{"tf":1.0},"82":{"tf":1.0},"92":{"tf":1.0},"95":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"b":{"/":{"df":2,"docs":{"126":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951}}},"df":3,"docs":{"23":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.4142135623730951}}},"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.0},"3":{"tf":1.0}}},"y":{"df":1,"docs":{"119":{"tf":1.0}}}},"y":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"a":{"df":2,"docs":{"119":{"tf":1.0},"18":{"tf":1.4142135623730951}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"37":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"102":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"a":{"df":3,"docs":{"126":{"tf":1.0},"128":{"tf":1.4142135623730951},"130":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"72":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"74":{"tf":1.0}}}}}}},"í":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":2,"docs":{"60":{"tf":1.0},"62":{"tf":1.0}}},"l":{"df":2,"docs":{"118":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":2,"docs":{"1":{"tf":1.0},"26":{"tf":1.0}}},"v":{"a":{"df":4,"docs":{"125":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":2,"docs":{"74":{"tf":1.0},"93":{"tf":1.0}}}}},"i":{"b":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"71":{"tf":1.0},"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"3":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"98":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"117":{"tf":1.4142135623730951},"121":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"t":{"a":{"d":{"a":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"126":{"tf":1.0},"128":{"tf":1.4142135623730951}}}},"p":{"a":{"df":1,"docs":{"76":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"96":{"tf":1.0}}},"h":{"a":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"x":{"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":2.0},"71":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"37":{"tf":1.0},"83":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"4":{"tf":1.0},"45":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"23":{"tf":1.0},"64":{"tf":1.0}}}},"df":6,"docs":{"11":{"tf":1.4142135623730951},"23":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":6,"docs":{"79":{"tf":1.0},"81":{"tf":1.0},"86":{"tf":1.4142135623730951},"87":{"tf":2.0},"89":{"tf":1.0},"90":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"r":{"df":2,"docs":{"108":{"tf":1.0},"121":{"tf":1.0}},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"o":{"c":{"a":{"df":0,"docs":{},"i":{"df":4,"docs":{"105":{"tf":1.0},"121":{"tf":1.0},"3":{"tf":1.0},"64":{"tf":1.0}}},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":3,"docs":{"71":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":14,"docs":{"105":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"19":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"45":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0},"98":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"2":{"tf":1.0},"82":{"tf":1.0}}}}}}},"t":{"df":3,"docs":{"22":{"tf":1.0},"37":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"135":{"tf":1.4142135623730951},"75":{"tf":2.0},"85":{"tf":1.4142135623730951}},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"105":{"tf":1.7320508075688772},"108":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"o":{"df":5,"docs":{"14":{"tf":1.0},"71":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"89":{"tf":1.0}}}},"df":8,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"112":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.0},"91":{"tf":1.0},"94":{"tf":1.0}},"i":{"df":13,"docs":{"101":{"tf":1.4142135623730951},"103":{"tf":1.0},"106":{"tf":1.4142135623730951},"109":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.7320508075688772},"123":{"tf":1.0},"2":{"tf":1.0},"7":{"tf":1.0},"92":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"107":{"tf":1.0}},"i":{"a":{"df":7,"docs":{"109":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"90":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":6,"docs":{"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"50":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}},"o":{"df":3,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"92":{"tf":1.0},"97":{"tf":1.0}}},"r":{"df":2,"docs":{"121":{"tf":1.0},"82":{"tf":1.0}},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}}}},"é":{"df":0,"docs":{},"m":{"df":3,"docs":{"103":{"tf":1.0},"107":{"tf":1.0},"99":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"104":{"tf":1.0},"124":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"122":{"tf":1.0}}}}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":2,"docs":{"128":{"tf":1.0},"82":{"tf":1.4142135623730951}}}}}}},"b":{"df":6,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"106":{"tf":2.23606797749979},"108":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"n":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":1,"docs":{"101":{"tf":1.0}},"e":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"102":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":3,"docs":{"20":{"tf":1.7320508075688772},"21":{"tf":1.0},"22":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":6,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"a":{"1":{"b":{"2":{"c":{"3":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"4":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"9":{"d":{"0":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"2":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"v":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"4":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"a":{"7":{"b":{"8":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"g":{"7":{"df":0,"docs":{},"h":{"8":{"df":0,"docs":{},"i":{"9":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":17,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.7320508075688772},"107":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"115":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"29":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.4142135623730951},"4":{"tf":2.0},"45":{"tf":1.0},"62":{"tf":1.0},"67":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"df":3,"docs":{"117":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"125":{"tf":1.7320508075688772},"127":{"tf":1.0}}},"n":{"df":1,"docs":{"124":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"m":{"a":{"df":5,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"119":{"tf":1.0},"124":{"tf":1.4142135623730951},"98":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":5,"docs":{"1":{"tf":1.0},"111":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0},"99":{"tf":1.0}}}},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}},"e":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}}},"d":{"a":{"d":{"df":0,"docs":{},"o":{"df":6,"docs":{"1":{"tf":1.0},"120":{"tf":1.0},"26":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"114":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"a":{"df":3,"docs":{"130":{"tf":1.0},"85":{"tf":1.0},"95":{"tf":1.0}}},"df":1,"docs":{"130":{"tf":1.0}},"s":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":3,"docs":{"127":{"tf":1.0},"129":{"tf":1.7320508075688772},"96":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"129":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"63":{"tf":1.0}}}},"õ":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"94":{"tf":1.0}}}},"ê":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"h":{"a":{"df":4,"docs":{"20":{"tf":2.0},"21":{"tf":1.0},"22":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"90":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"126":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":4,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.0}}},"m":{"df":1,"docs":{"67":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"b":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"129":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"3":{"tf":1.4142135623730951}},"e":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"9":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"96":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"113":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":3,"docs":{"109":{"tf":1.0},"122":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"38":{"tf":2.0},"39":{"tf":1.0},"4":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"130":{"tf":1.0},"85":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"t":{"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"100":{"tf":1.4142135623730951}}}},"s":{"a":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"129":{"tf":1.0}},"r":{"df":1,"docs":{"75":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"a":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"96":{"tf":1.0}}},"l":{"df":3,"docs":{"127":{"tf":1.0},"129":{"tf":1.0},"98":{"tf":1.0}}}}}},"u":{"d":{"a":{"df":1,"docs":{"127":{"tf":1.0}},"n":{"c":{"a":{"df":3,"docs":{"129":{"tf":1.0},"130":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"ç":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"101":{"tf":1.0},"106":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"132":{"tf":1.0},"135":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":3,"docs":{"124":{"tf":1.0},"131":{"tf":1.0},"73":{"tf":1.0}}}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"á":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"63":{"tf":1.0}}},"df":0,"docs":{}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":2,"docs":{"107":{"tf":1.4142135623730951},"108":{"tf":1.7320508075688772}}}}}}},"í":{"d":{"df":0,"docs":{},"i":{"a":{"df":3,"docs":{"122":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":2,"docs":{"108":{"tf":1.0},"115":{"tf":1.0}}}}}}},"ú":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"100":{"tf":1.0}}}}}}}}}},"n":{"+":{"df":0,"docs":{},"m":{"df":1,"docs":{"101":{"tf":1.0}}}},"a":{"d":{"a":{"df":3,"docs":{"105":{"tf":1.0},"117":{"tf":1.0},"21":{"tf":1.0}}},"df":0,"docs":{}},"df":23,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.0},"123":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":1.0},"133":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.4142135623730951},"45":{"tf":1.0},"67":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"83":{"tf":1.0},"84":{"tf":1.0},"87":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0}}}},"o":{"df":14,"docs":{"123":{"tf":1.0},"124":{"tf":1.7320508075688772},"125":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"134":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.4142135623730951},"97":{"tf":1.0},"98":{"tf":1.7320508075688772}}},"t":{"df":7,"docs":{"123":{"tf":2.0},"124":{"tf":2.8284271247461903},"125":{"tf":2.0},"126":{"tf":1.0},"128":{"tf":2.23606797749979},"130":{"tf":1.7320508075688772},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"129":{"tf":1.0},"86":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"92":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"z":{"a":{"df":1,"docs":{"113":{"tf":1.0}}},"df":0,"docs":{}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":3,"docs":{"26":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.0}}}},"df":0,"docs":{}},"k":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":10,"docs":{"10":{"tf":1.0},"101":{"tf":1.4142135623730951},"104":{"tf":1.0},"105":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951},"117":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"37":{"tf":1.0},"4":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"124":{"tf":1.4142135623730951},"90":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"á":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":2,"docs":{"102":{"tf":1.0},"98":{"tf":1.0}}},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"a":{"df":4,"docs":{"104":{"tf":1.0},"37":{"tf":1.4142135623730951},"69":{"tf":1.0},"95":{"tf":1.0}}},"df":5,"docs":{"1":{"tf":1.0},"125":{"tf":1.0},"26":{"tf":1.0},"72":{"tf":1.0},"78":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"129":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":3,"docs":{"123":{"tf":1.0},"79":{"tf":1.0},"84":{"tf":1.0}}}}}}}},"i":{"c":{"a":{"df":2,"docs":{"100":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"117":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"134":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"75":{"tf":1.4142135623730951},"84":{"tf":1.0}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":4,"docs":{"79":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.7320508075688772},"90":{"tf":1.0}}}},"df":21,"docs":{"111":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"128":{"tf":1.0},"129":{"tf":1.7320508075688772},"131":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.7320508075688772},"70":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.4142135623730951},"91":{"tf":1.0},"92":{"tf":2.0},"93":{"tf":1.7320508075688772},"94":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.0},"97":{"tf":1.7320508075688772},"98":{"tf":1.4142135623730951}},"n":{"c":{"df":2,"docs":{"74":{"tf":1.7320508075688772},"94":{"tf":1.4142135623730951}}},"df":2,"docs":{"37":{"tf":1.0},"43":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"a":{"df":1,"docs":{"89":{"tf":1.0}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"87":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"v":{"a":{"df":2,"docs":{"74":{"tf":1.0},"76":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":6,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"121":{"tf":1.4142135623730951},"129":{"tf":1.4142135623730951},"55":{"tf":1.0},"97":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"82":{"tf":1.0}}}}}},"n":{"c":{"a":{"df":5,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"121":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"63":{"tf":1.0}}}}}},"ã":{"df":0,"docs":{},"o":{"df":15,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"111":{"tf":1.0},"112":{"tf":2.0},"116":{"tf":1.0},"117":{"tf":1.4142135623730951},"121":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"43":{"tf":1.0},"55":{"tf":1.4142135623730951},"8":{"tf":1.0},"99":{"tf":1.0}}}},"í":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"44":{"tf":1.0}}},"l":{"df":3,"docs":{"37":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.0}}}}}},"ó":{"df":6,"docs":{"103":{"tf":1.0},"106":{"tf":1.4142135623730951},"113":{"tf":1.0},"4":{"tf":1.4142135623730951},"9":{"tf":1.0},"99":{"tf":1.0}}},"ú":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"67":{"tf":1.0}}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}},"o":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"é":{"df":0,"docs":{},"m":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}}},"df":79,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":2.6457513110645907},"104":{"tf":1.7320508075688772},"105":{"tf":1.4142135623730951},"106":{"tf":2.0},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"109":{"tf":1.7320508075688772},"110":{"tf":1.7320508075688772},"111":{"tf":1.4142135623730951},"112":{"tf":2.0},"113":{"tf":2.23606797749979},"114":{"tf":1.0},"115":{"tf":2.0},"116":{"tf":1.0},"117":{"tf":2.0},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"125":{"tf":2.8284271247461903},"126":{"tf":2.0},"127":{"tf":1.0},"129":{"tf":2.23606797749979},"13":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"135":{"tf":1.0},"136":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"2":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.4142135623730951},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"29":{"tf":1.7320508075688772},"3":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"45":{"tf":2.0},"50":{"tf":2.0},"62":{"tf":2.0},"7":{"tf":1.7320508075688772},"70":{"tf":1.0},"71":{"tf":1.7320508075688772},"74":{"tf":1.7320508075688772},"75":{"tf":1.7320508075688772},"76":{"tf":1.4142135623730951},"77":{"tf":1.0},"78":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"81":{"tf":1.0},"83":{"tf":1.0},"85":{"tf":1.0},"88":{"tf":1.0},"9":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.7320508075688772},"94":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.4142135623730951},"97":{"tf":1.7320508075688772},"98":{"tf":2.0},"99":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"105":{"tf":1.0},"99":{"tf":1.0}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}},"k":{"df":3,"docs":{"24":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}},"n":{"d":{"df":4,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"125":{"tf":1.0},"81":{"tf":1.0}}},"df":0,"docs":{}},"p":{"c":{"a":{"df":0,"docs":{},"o":{"df":2,"docs":{"123":{"tf":1.0},"72":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"o":{"df":3,"docs":{"136":{"tf":1.0},"72":{"tf":1.4142135623730951},"78":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"112":{"tf":1.0},"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"s":{"d":{"df":3,"docs":{"8":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"71":{"tf":1.0}}}}},"o":{"df":2,"docs":{"76":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"õ":{"df":1,"docs":{"39":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"72":{"tf":1.0}}}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":6,"docs":{"30":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"õ":{"df":8,"docs":{"17":{"tf":1.0},"30":{"tf":1.0},"35":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"8":{"tf":1.0}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"103":{"tf":1.0},"129":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":2,"docs":{"117":{"tf":1.0},"125":{"tf":1.0}}}}}}},"s":{"df":35,"docs":{"10":{"tf":1.0},"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":2.23606797749979},"104":{"tf":1.7320508075688772},"105":{"tf":2.0},"107":{"tf":1.0},"111":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"121":{"tf":1.7320508075688772},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"135":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"36":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"51":{"tf":1.0},"60":{"tf":1.0},"78":{"tf":1.0},"82":{"tf":1.0},"86":{"tf":1.0},"88":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"97":{"tf":1.0}}},"u":{"df":24,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"110":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.0},"13":{"tf":1.0},"15":{"tf":1.0},"39":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"51":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"63":{"tf":1.0},"67":{"tf":1.4142135623730951},"7":{"tf":1.0},"85":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.7320508075688772},"99":{"tf":1.0}},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":3,"docs":{"112":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":13,"docs":{"106":{"tf":1.0},"113":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"128":{"tf":1.0},"39":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"90":{"tf":1.0},"92":{"tf":1.4142135623730951},"95":{"tf":1.0},"98":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}}}}}},"p":{"2":{"df":0,"docs":{},"p":{"df":5,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0}}}},"a":{"c":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":4,"docs":{"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"126":{"tf":1.0},"8":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"o":{"df":11,"docs":{"133":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"81":{"tf":1.4142135623730951},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.4142135623730951},"89":{"tf":2.0},"96":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":5,"docs":{"72":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"82":{"tf":1.0},"90":{"tf":1.0}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"ã":{"df":0,"docs":{},"o":{"df":9,"docs":{"108":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"118":{"tf":1.0},"121":{"tf":1.4142135623730951}}}}},"r":{"_":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"b":{"df":1,"docs":{"106":{"tf":1.0}}},"c":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":77,"docs":{"0":{"tf":1.0},"1":{"tf":1.7320508075688772},"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"105":{"tf":1.7320508075688772},"106":{"tf":2.0},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"109":{"tf":1.7320508075688772},"111":{"tf":1.0},"112":{"tf":1.7320508075688772},"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"119":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":2.23606797749979},"124":{"tf":2.0},"125":{"tf":1.7320508075688772},"126":{"tf":1.7320508075688772},"127":{"tf":1.4142135623730951},"128":{"tf":2.449489742783178},"129":{"tf":1.0},"13":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"2":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.7320508075688772},"3":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.4142135623730951},"63":{"tf":1.0},"66":{"tf":1.0},"7":{"tf":1.0},"72":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"75":{"tf":1.4142135623730951},"76":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0},"82":{"tf":1.4142135623730951},"83":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.7320508075688772},"88":{"tf":1.0},"9":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.4142135623730951},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"99":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"82":{"tf":1.0}}}}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"82":{"tf":1.0}}}}}}},"r":{"df":3,"docs":{"108":{"tf":1.0},"135":{"tf":1.0},"76":{"tf":1.0}}}},"df":11,"docs":{"103":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.7320508075688772},"114":{"tf":1.7320508075688772},"119":{"tf":1.0},"130":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"82":{"tf":1.0}},"e":{"c":{"df":1,"docs":{"118":{"tf":1.0}}},"df":9,"docs":{"100":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":2.23606797749979},"105":{"tf":1.0},"3":{"tf":1.0},"83":{"tf":1.4142135623730951},"92":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}},"i":{"d":{"a":{"d":{"df":2,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"a":{"df":4,"docs":{"10":{"tf":1.0},"70":{"tf":1.0},"92":{"tf":1.0},"98":{"tf":2.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":11,"docs":{"10":{"tf":1.0},"101":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"34":{"tf":1.0},"5":{"tf":1.0},"73":{"tf":1.0}}}}},"â":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"113":{"tf":1.0}}},"df":3,"docs":{"24":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":2,"docs":{"17":{"tf":1.0},"22":{"tf":1.0}},"u":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"7":{"tf":1.0},"72":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"m":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":3,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"126":{"tf":1.7320508075688772},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"2":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951}}}},"l":{"a":{"df":3,"docs":{"3":{"tf":1.0},"77":{"tf":1.0},"95":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":7,"docs":{"103":{"tf":1.0},"104":{"tf":1.0},"111":{"tf":1.0},"4":{"tf":1.0},"8":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0}}}},"n":{"a":{"df":1,"docs":{"124":{"tf":1.0}}},"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"118":{"tf":1.0},"63":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":4,"docs":{"1":{"tf":1.0},"132":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"106":{"tf":1.0}}},"r":{"df":1,"docs":{"101":{"tf":1.0}}},"u":{"df":1,"docs":{"105":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"95":{"tf":1.0}},"r":{"df":1,"docs":{"97":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"55":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"33":{"tf":1.0},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"16":{"tf":1.0}}},"df":1,"docs":{"70":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"116":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"d":{"a":{"df":2,"docs":{"136":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"a":{"df":5,"docs":{"0":{"tf":1.0},"109":{"tf":1.0},"121":{"tf":1.0},"44":{"tf":1.4142135623730951},"55":{"tf":1.0}}},"df":0,"docs":{}}}},"ç":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":2,"docs":{"94":{"tf":1.0},"98":{"tf":1.0}},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"105":{"tf":1.0},"82":{"tf":1.0},"97":{"tf":1.0}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"125":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"g":{"df":2,"docs":{"14":{"tf":1.4142135623730951},"8":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":2,"docs":{"105":{"tf":1.0},"91":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":4,"docs":{"14":{"tf":1.4142135623730951},"72":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"20":{"tf":1.0},"38":{"tf":1.4142135623730951}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":11,"docs":{"101":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"44":{"tf":1.0},"62":{"tf":1.0},"78":{"tf":1.0}},"m":{"df":9,"docs":{"101":{"tf":1.0},"106":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.4142135623730951},"121":{"tf":1.0},"125":{"tf":1.0},"88":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"124":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":7,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"82":{"tf":1.7320508075688772},"91":{"tf":1.0},"93":{"tf":1.7320508075688772},"95":{"tf":1.7320508075688772}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"97":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":24,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"104":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"126":{"tf":1.0},"130":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"37":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.4142135623730951},"72":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.4142135623730951},"89":{"tf":1.0},"92":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"q":{"df":0,"docs":{},"u":{"df":3,"docs":{"112":{"tf":1.0},"2":{"tf":1.0},"87":{"tf":1.0}}}},"t":{"a":{"df":7,"docs":{"124":{"tf":1.7320508075688772},"133":{"tf":1.0},"16":{"tf":1.7320508075688772},"72":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.4142135623730951},"96":{"tf":1.0}}},"df":2,"docs":{"128":{"tf":1.0},"135":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"93":{"tf":1.0}}}},"i":{"df":1,"docs":{"105":{"tf":1.0}}}},"í":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"u":{"c":{"df":0,"docs":{},"o":{"df":2,"docs":{"103":{"tf":1.0},"95":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"z":{"df":0,"docs":{},"o":{"df":2,"docs":{"115":{"tf":1.0},"2":{"tf":1.0}}}}},"df":5,"docs":{"14":{"tf":1.0},"21":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.0},"6":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"a":{"df":7,"docs":{"106":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"26":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}},"m":{"df":2,"docs":{"109":{"tf":1.0},"119":{"tf":1.0}}},"r":{"df":3,"docs":{"63":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0}},"i":{"a":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"x":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"a":{"d":{"a":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"0":{"tf":1.0},"20":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"109":{"tf":1.0}}}}}},"df":1,"docs":{"11":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"76":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"112":{"tf":1.0},"121":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"125":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":3,"docs":{"17":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":7,"docs":{"123":{"tf":1.0},"129":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"67":{"tf":1.0},"83":{"tf":1.0},"93":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":2,"docs":{"60":{"tf":1.0},"62":{"tf":1.0}}}},"í":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0}}}}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":2,"docs":{"106":{"tf":1.0},"129":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":2,"docs":{"109":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"d":{"a":{"df":8,"docs":{"109":{"tf":1.0},"110":{"tf":1.4142135623730951},"114":{"tf":1.0},"115":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":3,"docs":{"115":{"tf":1.0},"123":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":4,"docs":{"37":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"123":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":3,"docs":{"125":{"tf":1.0},"4":{"tf":1.0},"97":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"111":{"tf":1.0}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"74":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"129":{"tf":1.0}}}}}}}},"j":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"d":{"a":{"df":1,"docs":{"109":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":2,"docs":{"3":{"tf":1.0},"9":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":2,"docs":{"130":{"tf":1.0},"85":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"37":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"õ":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"95":{"tf":1.0},"97":{"tf":1.0}}}}},"ó":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}}}},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":4,"docs":{"103":{"tf":1.0},"16":{"tf":1.4142135623730951},"88":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":1,"docs":{"7":{"tf":1.0}}}},"v":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":5,"docs":{"105":{"tf":1.0},"3":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.4142135623730951}},"n":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"125":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}}}}}},"á":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"107":{"tf":1.0}}}},"df":0,"docs":{}}}},"ó":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":3,"docs":{"103":{"tf":1.0},"17":{"tf":1.0},"22":{"tf":1.0}}}}}}}},"t":{"df":2,"docs":{"37":{"tf":1.0},"42":{"tf":1.0}}},"u":{"b":{"df":1,"docs":{"15":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"a":{"df":2,"docs":{"113":{"tf":1.0},"115":{"tf":1.0}}},"df":0,"docs":{}},"df":4,"docs":{"113":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.0}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"113":{"tf":1.4142135623730951},"3":{"tf":1.0}}}},"õ":{"df":1,"docs":{"114":{"tf":1.0}}}}},"df":7,"docs":{"124":{"tf":1.0},"23":{"tf":1.0},"37":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.4142135623730951}},"o":{"df":5,"docs":{"123":{"tf":1.7320508075688772},"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"128":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.0},"130":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"38":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}}},"ó":{"df":4,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"115":{"tf":1.0},"3":{"tf":1.0}}},"ú":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"a":{"df":9,"docs":{"109":{"tf":1.4142135623730951},"110":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"i":{"df":2,"docs":{"111":{"tf":1.0},"93":{"tf":1.0}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"117":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"0":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"117":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"125":{"tf":1.0},"44":{"tf":1.0},"62":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":22,"docs":{"1":{"tf":1.0},"100":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.4142135623730951},"106":{"tf":1.0},"110":{"tf":1.0},"113":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"116":{"tf":1.0},"119":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.0},"71":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"82":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":5,"docs":{"104":{"tf":1.0},"82":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"98":{"tf":1.0}}}}}},"df":1,"docs":{"9":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":3,"docs":{"111":{"tf":1.0},"117":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{}}},"df":56,"docs":{"0":{"tf":1.0},"1":{"tf":1.7320508075688772},"10":{"tf":1.0},"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"117":{"tf":1.0},"119":{"tf":1.0},"122":{"tf":1.4142135623730951},"123":{"tf":1.0},"124":{"tf":1.7320508075688772},"125":{"tf":1.4142135623730951},"129":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.7320508075688772},"33":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"50":{"tf":1.0},"55":{"tf":1.4142135623730951},"62":{"tf":1.0},"7":{"tf":1.0},"70":{"tf":1.4142135623730951},"74":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":2.0},"94":{"tf":1.4142135623730951},"95":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}},"m":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"4":{"tf":1.0},"44":{"tf":1.0},"93":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"r":{"df":2,"docs":{"125":{"tf":1.0},"93":{"tf":1.0}}}},"i":{"c":{"df":9,"docs":{"129":{"tf":1.4142135623730951},"16":{"tf":1.0},"3":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.0},"96":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"â":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":2,"docs":{"115":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":4,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"116":{"tf":1.0},"2":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"132":{"tf":1.0},"15":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"p":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"94":{"tf":1.0},"98":{"tf":1.0}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"106":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}}}}}},"y":{"df":1,"docs":{"63":{"tf":1.0}}},"z":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":1,"docs":{"126":{"tf":2.0}},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":2,"docs":{"135":{"tf":1.0},"71":{"tf":1.0}}},"m":{"df":0,"docs":{},"e":{".":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"26":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"93":{"tf":1.0}}},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":2,"docs":{"104":{"tf":1.0},"50":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"b":{"df":2,"docs":{"104":{"tf":1.0},"106":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"106":{"tf":1.0},"126":{"tf":1.0}}}},"i":{"d":{"a":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":1,"docs":{"97":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"a":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":2,"docs":{"106":{"tf":1.4142135623730951},"126":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":1,"docs":{"128":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"a":{"d":{"a":{"df":2,"docs":{"7":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"129":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"129":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":4,"docs":{"101":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":1.0}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}}}}},"ó":{"df":0,"docs":{},"i":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"105":{"tf":1.0}}}},"v":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":4,"docs":{"111":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":1.0},"93":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":28,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"100":{"tf":1.0},"103":{"tf":1.4142135623730951},"105":{"tf":1.4142135623730951},"106":{"tf":1.0},"108":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":2.0},"16":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"70":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.4142135623730951},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951},"92":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951},"98":{"tf":2.0}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"105":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.0}}}}},"df":0,"docs":{},"â":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":2,"docs":{"121":{"tf":1.0},"129":{"tf":1.4142135623730951}},"e":{"d":{"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"127":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"129":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"104":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":3,"docs":{"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}}}},"r":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"104":{"tf":1.0},"106":{"tf":1.0}}}},"df":1,"docs":{"115":{"tf":1.0}},"r":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"a":{"df":0,"docs":{},"y":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"p":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"128":{"tf":1.4142135623730951}}}},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"128":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"p":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"123":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":2.449489742783178},"127":{"tf":1.0},"128":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"98":{"tf":1.0}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"126":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.0}}}}}}}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"126":{"tf":1.0},"82":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"100":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":5,"docs":{"105":{"tf":1.7320508075688772},"106":{"tf":1.0},"108":{"tf":1.7320508075688772},"3":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"103":{"tf":1.0}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":7,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":1.0},"3":{"tf":1.0},"99":{"tf":1.0}}}}}},"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"124":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"132":{"tf":1.0},"135":{"tf":1.0}}}}}},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"10":{"tf":1.0},"15":{"tf":1.0}}}}}}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"z":{"df":1,"docs":{"125":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"82":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"7":{"tf":1.0},"94":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"121":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"124":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"14":{"tf":1.0},"6":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}},"ê":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":2,"docs":{"100":{"tf":1.0},"123":{"tf":1.0}},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"95":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"97":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"2":{"tf":1.0},"75":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"d":{"a":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"117":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"103":{"tf":1.0}}}}},"d":{"a":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"õ":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"123":{"tf":1.0},"128":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"82":{"tf":1.4142135623730951},"92":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":6,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0},"21":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{":":{"1":{".":{"8":{"5":{"df":1,"docs":{"132":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"=":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{",":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"=":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"75":{"tf":1.0}}}}}},"c":{"df":1,"docs":{"7":{"tf":1.0}}},"df":3,"docs":{"14":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":2.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}},"á":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":2,"docs":{"17":{"tf":1.0},"18":{"tf":1.0}}}},"df":0,"docs":{}}}}},"s":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"b":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"124":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"a":{"df":2,"docs":{"77":{"tf":1.0},"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"76":{"tf":1.0}}}},"l":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"95":{"tf":1.0}}}},"v":{"a":{"df":1,"docs":{"118":{"tf":1.0}},"r":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":4,"docs":{"104":{"tf":1.0},"126":{"tf":1.0},"88":{"tf":1.0},"95":{"tf":1.0}}},"í":{"d":{"a":{"df":7,"docs":{"120":{"tf":1.0},"122":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"51":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":2,"docs":{"4":{"tf":1.0},"8":{"tf":1.0}},"e":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"80":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}},"o":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"df":31,"docs":{"10":{"tf":1.0},"100":{"tf":1.4142135623730951},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"106":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"12":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.0},"16":{"tf":1.0},"31":{"tf":1.0},"54":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.4142135623730951},"74":{"tf":1.0},"77":{"tf":1.7320508075688772},"78":{"tf":1.0},"8":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"98":{"tf":1.0}},"e":{"d":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.0},"117":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"u":{"df":2,"docs":{"111":{"tf":1.0},"97":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":4,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":9,"docs":{"105":{"tf":1.0},"125":{"tf":1.0},"128":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"76":{"tf":1.0},"82":{"tf":1.7320508075688772},"91":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"a":{"df":1,"docs":{"99":{"tf":1.0}},"n":{"df":0,"docs":{},"ç":{"a":{"df":2,"docs":{"121":{"tf":1.4142135623730951},"122":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":3,"docs":{"117":{"tf":1.0},"121":{"tf":1.0},"31":{"tf":1.0}}}}}},"j":{"a":{"df":2,"docs":{"115":{"tf":1.0},"95":{"tf":1.0}},"m":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"a":{"d":{"a":{"df":8,"docs":{"109":{"tf":1.4142135623730951},"110":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":1.7320508075688772},"115":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951}}},"df":0,"docs":{},"o":{"df":2,"docs":{"115":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"f":{"df":1,"docs":{"11":{"tf":1.0}}},"o":{"df":1,"docs":{"112":{"tf":1.0}}}},"m":{"df":18,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"2":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"4":{"tf":1.0},"62":{"tf":1.4142135623730951},"63":{"tf":1.0},"73":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"133":{"tf":1.0},"134":{"tf":1.4142135623730951},"4":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.7320508075688772}}}}},"p":{"df":0,"docs":{},"r":{"df":4,"docs":{"109":{"tf":1.0},"112":{"tf":1.0},"89":{"tf":1.0},"98":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"78":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"37":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":3,"docs":{"113":{"tf":1.0},"121":{"tf":1.0},"72":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"129":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"r":{"a":{"df":1,"docs":{"74":{"tf":1.0}}},"df":9,"docs":{"1":{"tf":1.0},"108":{"tf":1.0},"121":{"tf":1.0},"25":{"tf":1.0},"4":{"tf":1.0},"62":{"tf":1.0},"78":{"tf":1.0},"88":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"109":{"tf":1.0}}}},"i":{"a":{"df":2,"docs":{"21":{"tf":1.0},"37":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"135":{"tf":1.0}},"o":{"df":1,"docs":{"126":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"124":{"tf":1.7320508075688772},"128":{"tf":1.0},"131":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0},"98":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"128":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"o":{"df":3,"docs":{"126":{"tf":1.7320508075688772},"127":{"tf":1.0},"128":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"118":{"tf":1.0},"120":{"tf":1.0},"124":{"tf":1.0}}}}},"o":{"df":3,"docs":{"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":1.0}}},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"119":{"tf":1.0},"121":{"tf":1.4142135623730951}}}},"õ":{"df":1,"docs":{"121":{"tf":1.0}}}}},"u":{"df":28,"docs":{"10":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.4142135623730951},"109":{"tf":1.0},"117":{"tf":1.7320508075688772},"12":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":2.0},"126":{"tf":1.0},"127":{"tf":1.4142135623730951},"128":{"tf":1.0},"129":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"29":{"tf":1.0},"4":{"tf":1.4142135623730951},"45":{"tf":1.0},"62":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"83":{"tf":1.0},"90":{"tf":1.0},"92":{"tf":1.7320508075688772},"93":{"tf":1.0},"95":{"tf":1.7320508075688772},"97":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"’":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"1":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"df":0,"docs":{}},"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":2.449489742783178},"120":{"tf":1.7320508075688772}}}}},"df":1,"docs":{"7":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"12":{"tf":1.4142135623730951}}}}}},"i":{"df":1,"docs":{"93":{"tf":1.0}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"109":{"tf":1.0},"2":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"24":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"e":{"d":{"2":{"5":{"5":{"1":{"9":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":5,"docs":{"1":{"tf":1.0},"112":{"tf":1.0},"124":{"tf":1.0},"62":{"tf":1.0},"93":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"df":2,"docs":{"89":{"tf":2.0},"98":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"103":{"tf":1.0},"106":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"â":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":4,"docs":{"115":{"tf":1.0},"8":{"tf":2.0},"87":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}}}}},"z":{"df":0,"docs":{},"e":{"df":4,"docs":{"120":{"tf":1.0},"23":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"132":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"102":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"b":{"df":1,"docs":{"105":{"tf":1.0}},"r":{"df":8,"docs":{"120":{"tf":1.0},"122":{"tf":1.0},"16":{"tf":1.0},"50":{"tf":1.0},"62":{"tf":1.0},"70":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"72":{"tf":1.0},"78":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"90":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"v":{"df":3,"docs":{"0":{"tf":1.0},"121":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":1,"docs":{"116":{"tf":1.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"99":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"u":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"87":{"tf":1.0},"89":{"tf":1.0},"98":{"tf":1.0}}}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"117":{"tf":1.0}}}}}}}},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"3":{"df":1,"docs":{"8":{"tf":1.0}}},"df":5,"docs":{"104":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"8":{"tf":3.7416573867739413}}}}}}},"s":{"df":0,"docs":{},"f":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":2.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"22":{"tf":1.0},"83":{"tf":1.4142135623730951},"85":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"3":{"4":{"7":{"8":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"1":{"9":{"3":{"0":{"2":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"128":{"tf":1.0}}}}}}},"df":5,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0}}}}},"u":{"a":{"df":19,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"110":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"121":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"22":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"45":{"tf":1.0},"55":{"tf":1.0},"92":{"tf":1.0},"94":{"tf":1.0},"97":{"tf":1.4142135623730951},"99":{"tf":1.0}}},"b":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":1,"docs":{"103":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"119":{"tf":1.0}},"i":{"df":1,"docs":{"97":{"tf":1.0}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}}}}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"135":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"130":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"14":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"100":{"tf":1.0},"90":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"20":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.0}}}},"df":4,"docs":{"109":{"tf":1.0},"112":{"tf":1.0},"129":{"tf":1.0},"86":{"tf":1.0}}},"df":1,"docs":{"86":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}},"õ":{"df":1,"docs":{"111":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"71":{"tf":1.0},"81":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}},"y":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"94":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"124":{"tf":1.0},"126":{"tf":1.0}}}}}}}},"ã":{"df":0,"docs":{},"o":{"df":11,"docs":{"102":{"tf":1.0},"103":{"tf":1.7320508075688772},"106":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"115":{"tf":1.0},"121":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.4142135623730951}}}},"é":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"111":{"tf":1.0},"116":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":7,"docs":{"104":{"tf":1.0},"4":{"tf":1.0},"67":{"tf":1.0},"70":{"tf":1.0},"82":{"tf":1.4142135623730951},"92":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"22":{"tf":1.0},"37":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"=":{"5":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"94":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":4,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"107":{"tf":1.7320508075688772},"67":{"tf":1.0}}}}}},"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"125":{"tf":1.4142135623730951},"87":{"tf":1.0}}}},"é":{"df":0,"docs":{},"m":{"df":1,"docs":{"112":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"104":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"x":{"a":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"117":{"tf":1.7320508075688772},"122":{"tf":1.0},"132":{"tf":1.0}},"e":{"df":31,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"12":{"tf":1.7320508075688772},"120":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0},"53":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0}},"m":{"df":10,"docs":{"105":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.0},"8":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"d":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":7,"docs":{"0":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.4142135623730951},"116":{"tf":1.0},"4":{"tf":1.4142135623730951},"82":{"tf":1.0},"92":{"tf":1.0}},"r":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"129":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"123":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"124":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":5,"docs":{"115":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":1,"docs":{"128":{"tf":1.0}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":78,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.23606797749979},"10":{"tf":1.7320508075688772},"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"103":{"tf":2.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.7320508075688772},"109":{"tf":2.0},"11":{"tf":2.23606797749979},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":2.23606797749979},"113":{"tf":2.23606797749979},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.4142135623730951},"118":{"tf":1.0},"123":{"tf":1.0},"129":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":2.23606797749979},"134":{"tf":1.4142135623730951},"136":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.0},"22":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.7320508075688772},"29":{"tf":1.7320508075688772},"3":{"tf":2.6457513110645907},"30":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":2.8284271247461903},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.7320508075688772},"56":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.0},"70":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":2.23606797749979},"75":{"tf":2.0},"78":{"tf":1.0},"8":{"tf":1.4142135623730951},"86":{"tf":1.0},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"98":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}},"s":{"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"d":{"b":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"a":{"d":{"a":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":2,"docs":{"131":{"tf":1.0},"135":{"tf":1.0}}}},"df":2,"docs":{"15":{"tf":2.0},"87":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"135":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"85":{"tf":1.0}},"o":{"df":13,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"112":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"119":{"tf":1.0},"122":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.4142135623730951}}}}},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"118":{"tf":1.4142135623730951},"120":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"128":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"95":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":14,"docs":{"114":{"tf":1.0},"124":{"tf":1.7320508075688772},"128":{"tf":1.0},"130":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"98":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"l":{"df":1,"docs":{"96":{"tf":1.0}},"s":{"df":0,"docs":{},"v":{"1":{".":{"2":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"d":{"a":{"df":9,"docs":{"102":{"tf":1.4142135623730951},"105":{"tf":1.0},"129":{"tf":1.0},"136":{"tf":1.0},"32":{"tf":1.0},"64":{"tf":1.0},"76":{"tf":1.0},"87":{"tf":1.4142135623730951},"96":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":14,"docs":{"105":{"tf":1.4142135623730951},"119":{"tf":1.0},"121":{"tf":1.4142135623730951},"135":{"tf":1.0},"2":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0},"51":{"tf":1.0},"60":{"tf":1.0},"88":{"tf":1.0},"90":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"126":{"tf":1.7320508075688772}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"â":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"72":{"tf":1.0},"78":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":3,"docs":{"109":{"tf":1.0},"74":{"tf":1.0},"98":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"i":{"df":2,"docs":{"101":{"tf":1.0},"117":{"tf":1.0}}},"l":{"df":4,"docs":{"101":{"tf":1.0},"108":{"tf":1.0},"130":{"tf":1.0},"67":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"71":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"a":{"b":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":4,"docs":{"3":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"75":{"tf":1.0}}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"96":{"tf":1.0}}}}},"z":{"df":1,"docs":{"123":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"125":{"tf":1.0},"128":{"tf":1.0},"77":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"ê":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"108":{"tf":1.4142135623730951},"55":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"96":{"tf":1.4142135623730951}}}}}}}},"t":{"a":{"d":{"a":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"124":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"a":{"df":3,"docs":{"123":{"tf":1.0},"128":{"tf":1.0},"130":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"123":{"tf":1.0},"129":{"tf":1.0}}},"o":{"c":{"a":{"df":4,"docs":{"106":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"127":{"tf":1.0}},"r":{"df":2,"docs":{"96":{"tf":1.0},"97":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":3,"docs":{"128":{"tf":1.0},"79":{"tf":1.0},"84":{"tf":1.0}}},"n":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"74":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"á":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"ê":{"df":1,"docs":{"102":{"tf":1.0}}}},"u":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"26":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"x":{"df":0,"docs":{},"t":{"df":6,"docs":{"118":{"tf":1.0},"121":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"83":{"tf":1.0}}}}},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0}}}},"p":{"df":6,"docs":{"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"133":{"tf":1.0},"16":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"96":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"w":{"df":1,"docs":{"77":{"tf":1.4142135623730951}}}},"m":{"a":{"df":44,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.7320508075688772},"100":{"tf":1.4142135623730951},"103":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.0},"107":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":2.23606797749979},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":2.23606797749979},"126":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.4142135623730951},"131":{"tf":1.0},"135":{"tf":1.0},"18":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.0},"22":{"tf":1.4142135623730951},"25":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":2.6457513110645907},"46":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"63":{"tf":1.4142135623730951},"67":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.7320508075688772},"90":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0},"94":{"tf":1.0},"96":{"tf":1.0}}},"df":63,"docs":{"1":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":2.0},"105":{"tf":1.4142135623730951},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.7320508075688772},"112":{"tf":1.0},"113":{"tf":1.7320508075688772},"114":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.7320508075688772},"120":{"tf":1.4142135623730951},"121":{"tf":2.0},"123":{"tf":2.449489742783178},"124":{"tf":1.0},"125":{"tf":2.8284271247461903},"126":{"tf":2.23606797749979},"127":{"tf":1.0},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"133":{"tf":1.7320508075688772},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"20":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":2.23606797749979},"45":{"tf":1.7320508075688772},"54":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"70":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.7320508075688772},"77":{"tf":1.0},"78":{"tf":1.0},"82":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"90":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"94":{"tf":2.8284271247461903},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.0}}},"n":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"74":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":2,"docs":{"104":{"tf":1.0},"133":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"95":{"tf":1.0}}}}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"124":{"tf":1.0}}}}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"135":{"tf":1.0}}},"s":{"a":{"d":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":4,"docs":{"26":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"92":{"tf":1.0}}}},"df":13,"docs":{"101":{"tf":1.0},"102":{"tf":1.0},"106":{"tf":1.0},"111":{"tf":1.0},"116":{"tf":1.0},"132":{"tf":1.0},"16":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.4142135623730951}},"g":{"df":1,"docs":{"11":{"tf":1.0}}},"m":{"df":2,"docs":{"126":{"tf":1.0},"90":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"o":{"df":4,"docs":{"110":{"tf":1.4142135623730951},"111":{"tf":1.0},"15":{"tf":1.0},"95":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":4,"docs":{"113":{"tf":1.0},"136":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}}}},"df":4,"docs":{"24":{"tf":1.0},"8":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}},"o":{"df":7,"docs":{"28":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.0},"55":{"tf":1.0},"57":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0}}},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"74":{"tf":1.0},"90":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":4,"docs":{"1":{"tf":1.0},"38":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"124":{"tf":1.0},"131":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"v":{"1":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":1,"docs":{"118":{"tf":1.0}}},"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"124":{"tf":1.0}}},"i":{"d":{"a":{"d":{"df":1,"docs":{"50":{"tf":1.0}}},"df":2,"docs":{"103":{"tf":1.0},"119":{"tf":1.0}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}}},"df":4,"docs":{"120":{"tf":1.0},"24":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"37":{"tf":1.0},"72":{"tf":1.0},"78":{"tf":1.0},"90":{"tf":1.0}}}}},"r":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"75":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"69":{"tf":1.0}}}}}},"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}},"j":{"a":{"df":4,"docs":{"136":{"tf":1.0},"21":{"tf":1.0},"72":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"m":{"df":1,"docs":{"1":{"tf":1.0}}},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"113":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"11":{"tf":1.0},"120":{"tf":1.0},"135":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":4,"docs":{"18":{"tf":1.0},"24":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0}},"i":{"c":{"a":{"d":{"a":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"50":{"tf":1.0}}}},"df":5,"docs":{"105":{"tf":1.4142135623730951},"106":{"tf":1.0},"119":{"tf":1.0},"125":{"tf":1.4142135623730951},"50":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"100":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":7,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"113":{"tf":1.0},"135":{"tf":1.0},"24":{"tf":1.4142135623730951},"46":{"tf":1.0},"97":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":7,"docs":{"104":{"tf":1.0},"121":{"tf":1.0},"3":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}},"õ":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{}},"df":5,"docs":{"11":{"tf":1.4142135623730951},"24":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0},"53":{"tf":1.0}},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"55":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"120":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"7":{"tf":1.0}}}},"õ":{"df":1,"docs":{"122":{"tf":1.0}}}}},"z":{"df":1,"docs":{"104":{"tf":1.0}}}},"i":{"a":{"df":7,"docs":{"3":{"tf":1.0},"7":{"tf":1.0},"75":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":1,"docs":{"112":{"tf":1.0}},"r":{"df":1,"docs":{"87":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":5,"docs":{"109":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"df":5,"docs":{"23":{"tf":1.0},"37":{"tf":1.0},"42":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"21":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"97":{"tf":1.0}}}}},"o":{"c":{"df":20,"docs":{"10":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"106":{"tf":1.7320508075688772},"11":{"tf":1.0},"110":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.7320508075688772},"116":{"tf":1.4142135623730951},"12":{"tf":1.0},"121":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"44":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":7,"docs":{"123":{"tf":1.0},"129":{"tf":1.0},"135":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"77":{"tf":1.0},"91":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"125":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"á":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"df":2,"docs":{"24":{"tf":1.0},"51":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}}}},"í":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"w":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":1,"docs":{"98":{"tf":1.0}}}},"v":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}}},"df":5,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"df":2,"docs":{"123":{"tf":1.0},"98":{"tf":1.0}},"m":{"df":3,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"i":{"df":2,"docs":{"127":{"tf":1.0},"96":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"89":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"x":{"2":{"5":{"5":{"1":{"9":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"g":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"93":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"95":{"tf":2.0}}}}},"y":{"df":1,"docs":{"93":{"tf":1.0}}},"z":{"df":1,"docs":{"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":4,"docs":{"122":{"tf":1.0},"127":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}}}},"breadcrumbs":{"root":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"4":{"4":{"3":{"3":{"df":7,"docs":{"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"0":{"0":{"df":2,"docs":{"73":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"68":{"tf":1.0}}},"2":{"df":3,"docs":{"118":{"tf":1.0},"23":{"tf":1.0},"68":{"tf":1.4142135623730951}}},"df":4,"docs":{"106":{"tf":1.0},"129":{"tf":1.0},"51":{"tf":1.0},"89":{"tf":2.0}}},"1":{".":{"3":{"df":1,"docs":{"96":{"tf":1.0}}},"8":{"5":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{"0":{"0":{"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"101":{"tf":1.0}}},"df":3,"docs":{"126":{"tf":1.0},"129":{"tf":1.0},"68":{"tf":1.0}}},"2":{"7":{".":{"0":{".":{"0":{".":{"1":{":":{"9":{"1":{"9":{"0":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"23":{"tf":1.0},"68":{"tf":1.0}}},"5":{"0":{"df":1,"docs":{"101":{"tf":1.0}}},"df":1,"docs":{"118":{"tf":1.0}}},"6":{"+":{"8":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"0":{"df":1,"docs":{"94":{"tf":1.0}}},"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.0},"67":{"tf":1.0}}},"7":{"df":1,"docs":{"14":{"tf":1.0}}},"9":{"2":{".":{"1":{"6":{"8":{".":{"1":{".":{"1":{"0":{"0":{"df":1,"docs":{"123":{"tf":1.0}}},":":{"4":{"4":{"3":{"3":{",":{"1":{"9":{"2":{".":{"1":{"6":{"8":{".":{"1":{".":{"1":{"1":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"]":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":1.4142135623730951},"122":{"tf":1.0},"19":{"tf":1.4142135623730951},"51":{"tf":1.0},"68":{"tf":1.0},"71":{"tf":1.0},"8":{"tf":1.0},"89":{"tf":1.0}}},"2":{"0":{"0":{"1":{":":{"d":{"b":{"8":{":":{":":{"1":{"]":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"2":{"6":{"df":4,"docs":{"118":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"68":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":4,"docs":{"74":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.0},"92":{"tf":1.0}}},"4":{"df":4,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"105":{"tf":1.0},"108":{"tf":1.0}}},"5":{"6":{"df":9,"docs":{"102":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.0},"3":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":2,"docs":{"23":{"tf":1.0},"68":{"tf":1.0}}},"df":1,"docs":{"68":{"tf":1.0}}},"df":9,"docs":{"108":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"120":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"129":{"tf":1.0},"20":{"tf":1.4142135623730951},"8":{"tf":1.0}},"s":{"df":1,"docs":{"129":{"tf":1.0}}}},"3":{".":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"74":{"tf":1.0}}},"3":{"df":1,"docs":{"101":{"tf":1.0}}},"4":{"df":1,"docs":{"120":{"tf":1.0}}},"6":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"101":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"135":{"tf":1.0},"14":{"tf":1.0},"21":{"tf":1.4142135623730951},"23":{"tf":1.0},"68":{"tf":1.0},"79":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951}}},"4":{"4":{"3":{"3":{"/":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{"df":1,"docs":{"77":{"tf":1.0}}}},"df":0,"docs":{}}},":":{"4":{"4":{"3":{"3":{"/":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{"df":4,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.0},"87":{"tf":1.4142135623730951},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"+":{"2":{"4":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"102":{"tf":1.0}}},"df":5,"docs":{"102":{"tf":1.0},"108":{"tf":1.0},"22":{"tf":1.4142135623730951},"3":{"tf":1.7320508075688772},"68":{"tf":1.0}},"–":{"2":{"5":{"6":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"0":{"0":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}},"df":1,"docs":{"128":{"tf":1.0}}},"df":5,"docs":{"121":{"tf":1.0},"125":{"tf":1.0},"129":{"tf":1.0},"23":{"tf":1.4142135623730951},"76":{"tf":1.0}},"s":{"df":1,"docs":{"129":{"tf":1.0}}}},"6":{"0":{"df":1,"docs":{"128":{"tf":1.0}}},"4":{"df":5,"docs":{"126":{"tf":1.0},"128":{"tf":1.0},"22":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0}}},"df":1,"docs":{"24":{"tf":1.4142135623730951}}},"7":{"2":{"df":1,"docs":{"102":{"tf":1.0}}},"6":{"8":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"102":{"tf":1.7320508075688772},"25":{"tf":1.4142135623730951}}},"8":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"6":{"4":{"0":{"0":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":9,"docs":{"1":{"tf":1.0},"101":{"tf":1.4142135623730951},"102":{"tf":1.0},"26":{"tf":1.4142135623730951},"38":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.0}}},"9":{"df":0,"docs":{},"f":{"2":{"c":{"4":{"a":{"1":{"b":{"3":{"df":0,"docs":{},"e":{"7":{"d":{"8":{"df":0,"docs":{},"f":{"0":{"c":{"a":{"b":{"c":{"1":{"2":{"3":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"4":{"5":{"6":{"7":{"8":{"9":{"0":{"1":{"2":{"3":{"4":{"5":{"6":{"7":{"8":{"a":{"b":{"c":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"1":{"2":{"3":{"4":{"5":{"6":{"7":{"8":{"9":{"a":{"b":{"c":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"0":{"1":{"df":2,"docs":{"53":{"tf":1.4142135623730951},"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"61":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":5,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"26":{"tf":1.0},"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"c":{"5":{"b":{"4":{"a":{"3":{"2":{"1":{"0":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"_":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"a":{"1":{"b":{"2":{"c":{"3":{"d":{"4":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"a":{"7":{"b":{"8":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"b":{"7":{"c":{"2":{"d":{"9":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"0":{"1":{"8":{"2":{"3":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"a":{"a":{"df":2,"docs":{"67":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}},"d":{"df":2,"docs":{"112":{"tf":2.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":3,"docs":{"115":{"tf":1.0},"4":{"tf":1.0},"77":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"d":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"123":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":3,"docs":{"125":{"tf":1.0},"3":{"tf":1.0},"71":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"113":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":1.0}},"m":{"df":1,"docs":{"86":{"tf":1.0}}},"r":{"df":2,"docs":{"108":{"tf":1.0},"76":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":6,"docs":{"109":{"tf":1.0},"116":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":2,"docs":{"115":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"88":{"tf":1.0}}}}}},"í":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"109":{"tf":1.0}}},"l":{"df":1,"docs":{"109":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":3,"docs":{"14":{"tf":1.0},"2":{"tf":1.0},"72":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":5,"docs":{"103":{"tf":1.0},"110":{"tf":1.0},"116":{"tf":1.0},"33":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"r":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"d":{"df":1,"docs":{"8":{"tf":1.0}},"r":{"df":1,"docs":{"72":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":1,"docs":{"7":{"tf":1.0}},"i":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":1,"docs":{"122":{"tf":1.0}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"117":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":3,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"3":{"tf":1.0}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":3,"docs":{"114":{"tf":1.0},"125":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"d":{"a":{"df":5,"docs":{"105":{"tf":1.0},"62":{"tf":1.0},"69":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"j":{"df":0,"docs":{},"u":{"d":{"a":{"df":1,"docs":{"123":{"tf":1.0}},"m":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"82":{"tf":1.0}}}}}},"l":{"c":{"a":{"df":0,"docs":{},"n":{"c":{"a":{"df":1,"docs":{"95":{"tf":1.0}},"r":{"df":2,"docs":{"124":{"tf":1.0},"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"110":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":4,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"92":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"93":{"tf":1.0}}}},"m":{"a":{"df":1,"docs":{"109":{"tf":1.0}}},"df":1,"docs":{"62":{"tf":1.0}}},"n":{"df":3,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"87":{"tf":1.0}}},"é":{"df":0,"docs":{},"m":{"df":2,"docs":{"62":{"tf":1.0},"63":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"77":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":1,"docs":{"121":{"tf":1.0}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"95":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"131":{"tf":1.0},"29":{"tf":1.0},"75":{"tf":1.0}}}}}},"o":{"df":4,"docs":{"111":{"tf":1.4142135623730951},"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"126":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"96":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"n":{"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"76":{"tf":1.0}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"o":{"df":3,"docs":{"1":{"tf":1.0},"62":{"tf":1.0},"92":{"tf":1.0}}},"t":{"df":6,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"41":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}}}}}}}}},"i":{"df":0,"docs":{},"g":{"a":{"df":1,"docs":{"125":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"121":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"129":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"df":18,"docs":{"103":{"tf":1.7320508075688772},"105":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"114":{"tf":1.0},"117":{"tf":1.7320508075688772},"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"129":{"tf":1.0},"32":{"tf":1.0},"83":{"tf":1.0},"92":{"tf":1.0},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}},"p":{"a":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.0},"3":{"tf":1.0}}}}}}},"r":{"df":1,"docs":{"74":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":16,"docs":{"101":{"tf":1.0},"104":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.0},"132":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"44":{"tf":1.0},"75":{"tf":1.0},"87":{"tf":1.0},"90":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}}},"k":{"df":2,"docs":{"15":{"tf":1.4142135623730951},"8":{"tf":1.0}}},"o":{"df":1,"docs":{"97":{"tf":1.0}},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"95":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}}},"p":{"df":6,"docs":{"129":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"15":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"92":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"123":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":2,"docs":{"14":{"tf":1.0},"8":{"tf":1.0}}},"ó":{"df":7,"docs":{"109":{"tf":1.0},"121":{"tf":1.4142135623730951},"29":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"55":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"36":{"tf":1.7320508075688772},"48":{"tf":1.7320508075688772},"58":{"tf":1.7320508075688772}}}}}}}}},"m":{"a":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"d":{"a":{"df":8,"docs":{"100":{"tf":1.0},"104":{"tf":1.0},"110":{"tf":1.0},"114":{"tf":1.0},"2":{"tf":1.0},"46":{"tf":1.0},"55":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":3,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"82":{"tf":1.4142135623730951}}}},"df":4,"docs":{"133":{"tf":1.0},"45":{"tf":1.0},"93":{"tf":1.7320508075688772},"98":{"tf":1.4142135623730951}},"m":{"df":2,"docs":{"106":{"tf":1.7320508075688772},"126":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":19,"docs":{"101":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"118":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"126":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"63":{"tf":1.0},"66":{"tf":1.0},"8":{"tf":1.0}}}}}}},"r":{"df":4,"docs":{"101":{"tf":1.0},"106":{"tf":1.0},"81":{"tf":1.0},"95":{"tf":1.0}}}},"df":3,"docs":{"106":{"tf":1.0},"121":{"tf":1.4142135623730951},"63":{"tf":1.0}},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"63":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":29,"docs":{"101":{"tf":1.0},"102":{"tf":1.7320508075688772},"106":{"tf":1.0},"110":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"24":{"tf":1.0},"29":{"tf":1.4142135623730951},"3":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.7320508075688772},"39":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":2.23606797749979},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"54":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.7320508075688772},"72":{"tf":1.4142135623730951},"74":{"tf":1.0},"78":{"tf":1.4142135623730951},"90":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"113":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"95":{"tf":1.0}}},"n":{"a":{"d":{"a":{"df":2,"docs":{"113":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"45":{"tf":1.0}},"r":{"df":1,"docs":{"29":{"tf":1.0}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":11,"docs":{"1":{"tf":1.0},"111":{"tf":1.0},"113":{"tf":1.4142135623730951},"114":{"tf":1.7320508075688772},"125":{"tf":2.23606797749979},"2":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"60":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"i":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"111":{"tf":1.0},"112":{"tf":1.0},"125":{"tf":1.0},"94":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":3,"docs":{"112":{"tf":1.0},"125":{"tf":1.0},"94":{"tf":1.4142135623730951}}}}},"df":2,"docs":{"76":{"tf":1.0},"95":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}},"õ":{"df":1,"docs":{"105":{"tf":1.0}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"v":{"a":{"df":2,"docs":{"119":{"tf":1.0},"129":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"98":{"tf":1.0}}}}},"r":{"a":{"df":3,"docs":{"123":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"77":{"tf":1.0}},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}},"v":{"df":4,"docs":{"126":{"tf":1.0},"129":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}},"é":{"df":3,"docs":{"0":{"tf":1.0},"108":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":4,"docs":{"123":{"tf":1.0},"124":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"á":{"df":1,"docs":{"16":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"119":{"tf":1.0},"130":{"tf":1.0},"3":{"tf":1.4142135623730951},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"a":{"df":1,"docs":{"97":{"tf":1.0}},"r":{"df":2,"docs":{"127":{"tf":1.0},"82":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"130":{"tf":1.0},"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"105":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"a":{"df":4,"docs":{"0":{"tf":1.0},"25":{"tf":1.4142135623730951},"3":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":3,"docs":{"26":{"tf":1.0},"56":{"tf":1.0},"62":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"10":{"tf":1.0},"12":{"tf":1.4142135623730951},"97":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"104":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":8,"docs":{"100":{"tf":1.0},"119":{"tf":1.0},"12":{"tf":1.0},"39":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.0},"97":{"tf":1.0},"99":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"á":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"75":{"tf":1.0}}}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}}}},"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"25":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":4,"docs":{"119":{"tf":1.0},"25":{"tf":1.0},"61":{"tf":1.0},"63":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"93":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"c":{"df":0,"docs":{},"o":{"df":8,"docs":{"19":{"tf":1.4142135623730951},"27":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"69":{"tf":1.4142135623730951},"81":{"tf":1.0}}},"á":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}}}},"d":{"a":{"df":3,"docs":{"126":{"tf":1.0},"128":{"tf":1.4142135623730951},"130":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"123":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"6":{"4":{"df":1,"docs":{"118":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"a":{"d":{"a":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":4,"docs":{"111":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{}},"df":8,"docs":{"11":{"tf":1.0},"132":{"tf":1.0},"30":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"8":{"tf":1.0}}},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"i":{"c":{"a":{"df":1,"docs":{"81":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"125":{"tf":2.8284271247461903},"126":{"tf":1.4142135623730951},"67":{"tf":1.0},"72":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":5,"docs":{"111":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"53":{"tf":1.4142135623730951},"82":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"a":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":0,"docs":{}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"132":{"tf":1.0},"70":{"tf":1.0}}}}}},"df":1,"docs":{"118":{"tf":1.0}},"á":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"122":{"tf":1.0}}}}}}},"t":{"df":6,"docs":{"110":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"92":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"3":{"(":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":10,"docs":{"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"111":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0},"62":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"b":{"df":4,"docs":{"122":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"81":{"tf":1.0}}},"c":{"df":0,"docs":{},"k":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"106":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"109":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"3":{"tf":1.0},"96":{"tf":1.0}}}}}}}},"u":{"df":1,"docs":{"63":{"tf":1.0}}}},"o":{"a":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"126":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"84":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"1":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{",":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":3,"docs":{"79":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{":":{"4":{"4":{"3":{"3":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},":":{"4":{"4":{"3":{"3":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"135":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":15,"docs":{"129":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":2.0},"4":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.4142135623730951},"73":{"tf":2.23606797749979},"78":{"tf":1.0},"79":{"tf":1.0},"83":{"tf":1.7320508075688772},"88":{"tf":2.0},"90":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":2.0}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":2,"docs":{"37":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"8":{"tf":1.0}}}}},"s":{"d":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"82":{"tf":1.4142135623730951},"97":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"132":{"tf":1.0},"135":{"tf":2.0},"15":{"tf":2.23606797749979},"9":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"s":{"c":{"a":{"df":6,"docs":{"3":{"tf":1.0},"45":{"tf":1.0},"82":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}},"r":{"df":2,"docs":{"105":{"tf":1.0},"95":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"120":{"tf":1.0},"74":{"tf":1.7320508075688772}}}}}},"c":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"ç":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"d":{"a":{"df":22,"docs":{"0":{"tf":1.0},"1":{"tf":1.7320508075688772},"103":{"tf":1.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.7320508075688772},"106":{"tf":1.4142135623730951},"110":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.4142135623730951},"124":{"tf":1.0},"135":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0},"62":{"tf":1.4142135623730951},"74":{"tf":1.0},"92":{"tf":1.0},"94":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"104":{"tf":1.4142135623730951},"132":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"103":{"tf":1.0}}}},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"m":{"a":{"d":{"a":{"df":3,"docs":{"102":{"tf":2.23606797749979},"103":{"tf":1.0},"123":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":11,"docs":{"29":{"tf":1.0},"30":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"o":{"df":1,"docs":{"86":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"136":{"tf":1.0},"91":{"tf":1.0}}}}}}},"í":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"99":{"tf":1.0}}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"22":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0},"67":{"tf":1.0}},"í":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"62":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"a":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{},"o":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"10":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}},"df":4,"docs":{"10":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"o":{"df":1,"docs":{"74":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"a":{"df":2,"docs":{"121":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":2,"docs":{"55":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}},"d":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0}}},"df":1,"docs":{"72":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"127":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"2":{"tf":1.4142135623730951},"4":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"c":{"a":{"df":3,"docs":{"71":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"7":{"tf":1.0},"77":{"tf":1.0}}}}}}},"o":{"df":1,"docs":{"92":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"m":{"a":{"d":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":28,"docs":{"110":{"tf":2.8284271247461903},"111":{"tf":2.6457513110645907},"113":{"tf":2.449489742783178},"114":{"tf":3.0},"115":{"tf":1.4142135623730951},"116":{"tf":2.0},"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"119":{"tf":1.7320508075688772},"120":{"tf":1.0},"121":{"tf":1.7320508075688772},"122":{"tf":1.4142135623730951},"19":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.4142135623730951},"33":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"45":{"tf":1.0},"60":{"tf":1.0},"74":{"tf":1.4142135623730951},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":12,"docs":{"103":{"tf":1.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.7320508075688772},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"26":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"i":{"d":{"a":{"d":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":1,"docs":{"131":{"tf":1.0}},"f":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"c":{"df":0,"docs":{},"l":{"df":3,"docs":{"37":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.4142135623730951}}}},"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"72":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"135":{"tf":1.4142135623730951},"98":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}}}},"á":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"a":{"df":2,"docs":{"111":{"tf":1.0},"115":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"114":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"o":{"b":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"c":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"103":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":3,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":1,"docs":{"121":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"õ":{"df":1,"docs":{"107":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"67":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":48,"docs":{"119":{"tf":1.0},"12":{"tf":1.0},"27":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.7320508075688772},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0},"72":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":45,"docs":{"101":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.7320508075688772},"108":{"tf":1.0},"110":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"121":{"tf":1.0},"123":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"126":{"tf":2.23606797749979},"128":{"tf":1.4142135623730951},"131":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"20":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"26":{"tf":1.0},"3":{"tf":2.449489742783178},"38":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"50":{"tf":1.0},"54":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0},"67":{"tf":1.0},"7":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.7320508075688772},"74":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.0},"82":{"tf":1.4142135623730951},"87":{"tf":1.0},"88":{"tf":1.7320508075688772},"89":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0},"94":{"tf":1.0}},"e":{"c":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"11":{"tf":1.4142135623730951},"135":{"tf":1.7320508075688772},"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":19,"docs":{"103":{"tf":1.4142135623730951},"110":{"tf":1.4142135623730951},"113":{"tf":1.0},"117":{"tf":1.4142135623730951},"119":{"tf":1.0},"123":{"tf":1.0},"128":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.4142135623730951},"26":{"tf":1.7320508075688772},"39":{"tf":1.4142135623730951},"4":{"tf":1.0},"56":{"tf":1.0},"60":{"tf":1.7320508075688772},"73":{"tf":1.0},"83":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.4142135623730951},"99":{"tf":1.0}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"104":{"tf":1.0},"50":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"124":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"63":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"8":{"tf":1.0}},"r":{"df":5,"docs":{"10":{"tf":1.4142135623730951},"13":{"tf":1.0},"132":{"tf":1.0},"15":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"5":{"tf":1.0},"8":{"tf":1.0}}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"101":{"tf":1.0},"63":{"tf":1.0}}},"df":3,"docs":{"10":{"tf":1.0},"12":{"tf":2.6457513110645907},"3":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":7,"docs":{"10":{"tf":1.0},"102":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"70":{"tf":1.0},"79":{"tf":1.4142135623730951},"98":{"tf":1.7320508075688772}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"108":{"tf":1.0},"89":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"135":{"tf":2.449489742783178}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"62":{"tf":1.0}},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"v":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"117":{"tf":1.0}}}}}}}},"df":1,"docs":{"122":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"116":{"tf":1.0},"2":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"77":{"tf":1.0}},"r":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":9,"docs":{"4":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":3,"docs":{"123":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}},"m":{"df":2,"docs":{"123":{"tf":1.0},"73":{"tf":1.0}}},"r":{"a":{"df":1,"docs":{"88":{"tf":1.0}}},"df":3,"docs":{"123":{"tf":1.0},"125":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{}}},"df":2,"docs":{"124":{"tf":1.0},"125":{"tf":1.4142135623730951}},"x":{"a":{"df":0,"docs":{},"o":{"df":3,"docs":{"123":{"tf":1.0},"129":{"tf":1.0},"96":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"o":{"df":6,"docs":{"127":{"tf":1.0},"129":{"tf":1.0},"70":{"tf":1.0},"76":{"tf":1.4142135623730951},"87":{"tf":1.0},"92":{"tf":1.0}}}}},"f":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"ç":{"a":{"df":2,"docs":{"116":{"tf":1.0},"55":{"tf":1.0}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"124":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{":":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"136":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"33":{"tf":1.0}}}}}}},"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":5,"docs":{"136":{"tf":1.0},"14":{"tf":1.4142135623730951},"19":{"tf":1.0},"72":{"tf":1.0},"78":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"r":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":16,"docs":{"128":{"tf":1.7320508075688772},"136":{"tf":2.0},"72":{"tf":1.4142135623730951},"78":{"tf":2.23606797749979},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":2.23606797749979}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"81":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"78":{"tf":1.0}}}},"df":3,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"29":{"tf":1.0}},"r":{"df":1,"docs":{"33":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":4,"docs":{"108":{"tf":1.7320508075688772},"17":{"tf":1.4142135623730951},"19":{"tf":1.0},"29":{"tf":1.0}}}}}},"df":2,"docs":{"17":{"tf":1.0},"19":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"103":{"tf":1.0}},"r":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":1,"docs":{"55":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":2,"docs":{"14":{"tf":1.0},"92":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"e":{"c":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":2,"docs":{"92":{"tf":1.0},"95":{"tf":1.0}},"i":{"d":{"df":0,"docs":{},"o":{"df":4,"docs":{"105":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"62":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"82":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":2,"docs":{"116":{"tf":1.0},"125":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"123":{"tf":1.0}}}},"i":{"df":0,"docs":{},"u":{"df":2,"docs":{"124":{"tf":1.0},"129":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"õ":{"df":1,"docs":{"121":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":1,"docs":{"92":{"tf":1.0}}}},"u":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"132":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"103":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"92":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"4":{"tf":1.0},"71":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"97":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"104":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"133":{"tf":1.4142135623730951},"136":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"131":{"tf":1.0}}}}}},"m":{"df":2,"docs":{"132":{"tf":1.0},"74":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"113":{"tf":1.0},"126":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"104":{"tf":1.0},"60":{"tf":1.0},"93":{"tf":1.0}}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}},"ú":{"d":{"df":0,"docs":{},"o":{"df":19,"docs":{"1":{"tf":1.0},"109":{"tf":1.4142135623730951},"110":{"tf":2.449489742783178},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":2.0},"115":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"22":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":2.0},"4":{"tf":1.4142135623730951},"45":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0},"62":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"100":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"a":{"df":2,"docs":{"128":{"tf":1.0},"4":{"tf":1.0}}},"df":2,"docs":{"75":{"tf":1.0},"89":{"tf":1.0}}}}},"é":{"df":0,"docs":{},"m":{"df":1,"docs":{"1":{"tf":1.0}}}},"ê":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"92":{"tf":1.0}}},"r":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"95":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"104":{"tf":1.0}},"r":{"df":2,"docs":{"112":{"tf":1.0},"55":{"tf":1.0}}}},"df":1,"docs":{"22":{"tf":1.0}}}},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"d":{"a":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"112":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"110":{"tf":1.0},"78":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":4,"docs":{"105":{"tf":1.0},"121":{"tf":1.0},"51":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"105":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":2,"docs":{"4":{"tf":1.0},"43":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"p":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"10":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":20,"docs":{"11":{"tf":1.7320508075688772},"118":{"tf":1.4142135623730951},"121":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"34":{"tf":1.7320508075688772},"35":{"tf":1.4142135623730951},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"e":{"d":{"2":{"5":{"5":{"1":{"9":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"ç":{"a":{"df":1,"docs":{"39":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"d":{"a":{"df":3,"docs":{"1":{"tf":1.0},"114":{"tf":1.0},"69":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"109":{"tf":1.0},"60":{"tf":1.0}}}}},"df":12,"docs":{"0":{"tf":1.0},"103":{"tf":1.0},"110":{"tf":1.0},"113":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"60":{"tf":1.0},"71":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"r":{"df":11,"docs":{"10":{"tf":1.0},"101":{"tf":1.0},"115":{"tf":1.0},"18":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.4142135623730951},"34":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"74":{"tf":1.0},"94":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"3":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"107":{"tf":1.0},"121":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":1.0},"94":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"f":{"a":{"d":{"a":{"df":3,"docs":{"109":{"tf":1.4142135623730951},"112":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":6,"docs":{"110":{"tf":1.4142135623730951},"112":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{},"i":{"a":{"df":10,"docs":{"109":{"tf":1.7320508075688772},"110":{"tf":2.0},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.0},"114":{"tf":2.23606797749979},"115":{"tf":1.7320508075688772},"2":{"tf":1.0},"3":{"tf":1.7320508075688772},"96":{"tf":1.0}}},"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"112":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"á":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":4,"docs":{"1":{"tf":1.0},"111":{"tf":1.0},"116":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"e":{"d":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"+":{"c":{"df":1,"docs":{"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"99":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"j":{"a":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"129":{"tf":1.0}}}},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}},"v":{"a":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"101":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{}}}},"á":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":3,"docs":{"0":{"tf":1.0},"113":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"í":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"df":0,"docs":{}}},"ó":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"37":{"tf":1.4142135623730951},"5":{"tf":1.0},"51":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"a":{"df":5,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"25":{"tf":1.4142135623730951},"63":{"tf":1.0}}},"df":0,"docs":{}}}},"ô":{"df":0,"docs":{},"n":{"df":0,"docs":{},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"117":{"tf":1.0}}}}}}}}},"d":{"a":{"d":{"df":0,"docs":{},"o":{"df":32,"docs":{"100":{"tf":1.0},"101":{"tf":1.7320508075688772},"102":{"tf":1.4142135623730951},"103":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.4142135623730951},"112":{"tf":1.7320508075688772},"115":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":1.0},"133":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"27":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.4142135623730951},"33":{"tf":1.0},"37":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"63":{"tf":1.0},"66":{"tf":1.0},"69":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"81":{"tf":1.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}}},"df":30,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"102":{"tf":1.4142135623730951},"103":{"tf":2.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.7320508075688772},"114":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.4142135623730951},"126":{"tf":1.0},"132":{"tf":1.0},"15":{"tf":1.0},"4":{"tf":1.0},"48":{"tf":1.0},"50":{"tf":1.0},"58":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":2.0},"92":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":29,"docs":{"10":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"105":{"tf":1.0},"108":{"tf":1.0},"128":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":2.23606797749979},"72":{"tf":1.0},"73":{"tf":2.23606797749979},"75":{"tf":2.23606797749979},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.7320508075688772},"8":{"tf":1.0},"88":{"tf":1.0},"91":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.4142135623730951},"99":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":2,"docs":{"1":{"tf":1.0},"62":{"tf":1.0}}}}},"t":{"a":{":":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"/":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"11":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"11":{"tf":1.0},"19":{"tf":1.0},"31":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"103":{"tf":1.0}}}}}},"df":18,"docs":{"109":{"tf":1.0},"11":{"tf":1.4142135623730951},"112":{"tf":1.0},"113":{"tf":1.4142135623730951},"120":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"78":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":1,"docs":{"33":{"tf":1.0}}},"d":{"df":1,"docs":{"67":{"tf":1.0}}},"df":6,"docs":{"117":{"tf":1.7320508075688772},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"72":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":0,"docs":{}}},":":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"132":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"df":2,"docs":{"15":{"tf":1.7320508075688772},"75":{"tf":1.4142135623730951}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":3,"docs":{"26":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"60":{"tf":1.7320508075688772}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"110":{"tf":1.0},"113":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":107,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.23606797749979},"10":{"tf":1.0},"101":{"tf":3.1622776601683795},"102":{"tf":2.23606797749979},"103":{"tf":1.7320508075688772},"104":{"tf":2.6457513110645907},"105":{"tf":2.23606797749979},"106":{"tf":1.4142135623730951},"107":{"tf":2.23606797749979},"108":{"tf":3.3166247903554},"109":{"tf":1.4142135623730951},"110":{"tf":2.6457513110645907},"111":{"tf":2.8284271247461903},"112":{"tf":1.7320508075688772},"113":{"tf":1.7320508075688772},"114":{"tf":3.4641016151377544},"115":{"tf":2.0},"116":{"tf":2.449489742783178},"117":{"tf":1.4142135623730951},"118":{"tf":2.0},"119":{"tf":2.23606797749979},"120":{"tf":1.0},"121":{"tf":4.242640687119285},"122":{"tf":3.605551275463989},"123":{"tf":2.23606797749979},"124":{"tf":2.23606797749979},"125":{"tf":3.7416573867739413},"126":{"tf":2.8284271247461903},"127":{"tf":2.449489742783178},"128":{"tf":3.4641016151377544},"129":{"tf":2.6457513110645907},"13":{"tf":1.0},"130":{"tf":3.3166247903554},"131":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":2.23606797749979},"2":{"tf":1.7320508075688772},"20":{"tf":1.0},"22":{"tf":1.4142135623730951},"24":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":2.23606797749979},"3":{"tf":3.872983346207417},"30":{"tf":1.0},"32":{"tf":1.7320508075688772},"33":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"37":{"tf":1.7320508075688772},"38":{"tf":1.7320508075688772},"39":{"tf":2.6457513110645907},"4":{"tf":2.449489742783178},"41":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.4142135623730951},"55":{"tf":2.449489742783178},"58":{"tf":1.4142135623730951},"59":{"tf":1.0},"60":{"tf":2.449489742783178},"62":{"tf":2.0},"63":{"tf":2.23606797749979},"66":{"tf":1.0},"67":{"tf":2.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"70":{"tf":1.0},"71":{"tf":2.0},"72":{"tf":2.8284271247461903},"73":{"tf":1.4142135623730951},"74":{"tf":3.0},"75":{"tf":1.7320508075688772},"76":{"tf":1.4142135623730951},"77":{"tf":1.7320508075688772},"78":{"tf":1.0},"8":{"tf":1.4142135623730951},"81":{"tf":1.0},"82":{"tf":2.8284271247461903},"83":{"tf":2.0},"84":{"tf":1.4142135623730951},"85":{"tf":1.7320508075688772},"88":{"tf":1.0},"89":{"tf":1.7320508075688772},"9":{"tf":1.0},"90":{"tf":1.4142135623730951},"91":{"tf":2.0},"92":{"tf":2.23606797749979},"93":{"tf":1.0},"94":{"tf":3.872983346207417},"95":{"tf":2.0},"96":{"tf":2.6457513110645907},"97":{"tf":2.6457513110645907},"98":{"tf":2.23606797749979},"99":{"tf":1.4142135623730951}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"128":{"tf":1.0}}},"df":1,"docs":{"95":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"121":{"tf":1.4142135623730951},"122":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"106":{"tf":1.0},"117":{"tf":1.0}},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"104":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"133":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"ê":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":3,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"2":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":2,"docs":{"129":{"tf":1.4142135623730951},"93":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"74":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"s":{"a":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"100":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":1,"docs":{"37":{"tf":1.0}},"o":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":5,"docs":{"124":{"tf":1.4142135623730951},"3":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"97":{"tf":1.0}}}}}},"r":{"df":3,"docs":{"129":{"tf":1.0},"83":{"tf":1.0},"92":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"o":{"df":7,"docs":{"72":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":13,"docs":{"108":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.4142135623730951},"30":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.4142135623730951},"4":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0}}}}}}},"u":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"70":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"d":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"j":{"a":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}},"m":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"110":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"44":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"115":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951}}}}},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"98":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"76":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"s":{"a":{"df":1,"docs":{"92":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"108":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":4,"docs":{"124":{"tf":1.4142135623730951},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"60":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"u":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"d":{"a":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"91":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"121":{"tf":1.0},"130":{"tf":1.0}}}},"df":3,"docs":{"104":{"tf":1.0},"119":{"tf":1.0},"129":{"tf":1.0}},"m":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":0,"docs":{}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"105":{"tf":2.0},"110":{"tf":1.0}}}}}}}},"v":{"df":2,"docs":{"14":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":5,"docs":{"106":{"tf":1.0},"128":{"tf":1.0},"29":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}},"l":{"df":1,"docs":{"8":{"tf":1.0}}},"r":{"a":{"df":1,"docs":{"135":{"tf":1.0}}},"df":1,"docs":{"11":{"tf":1.0}},"i":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"t":{"df":12,"docs":{"103":{"tf":1.0},"124":{"tf":1.0},"129":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"75":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":2.23606797749979},"98":{"tf":1.7320508075688772}}}},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"95":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"43":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"102":{"tf":1.0},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0}}}}}}},"í":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"117":{"tf":1.0}}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"r":{">":{"/":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"11":{"tf":1.0},"119":{"tf":1.4142135623730951},"30":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"11":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"123":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"123":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"93":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":3,"docs":{"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}}}}}},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":18,"docs":{"114":{"tf":1.0},"20":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"30":{"tf":1.0},"32":{"tf":1.7320508075688772},"33":{"tf":1.0},"34":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":2,"docs":{"104":{"tf":1.0},"63":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":2,"docs":{"109":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"136":{"tf":1.0}}}}}},"í":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":9,"docs":{"114":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.0},"4":{"tf":1.0},"55":{"tf":1.0},"94":{"tf":1.0},"98":{"tf":1.4142135623730951}}}}}}}}}},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"95":{"tf":2.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"105":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"a":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"a":{"df":2,"docs":{"70":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"95":{"tf":1.0}},"r":{"df":2,"docs":{"103":{"tf":1.0},"106":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":3,"docs":{"103":{"tf":1.7320508075688772},"121":{"tf":1.0},"8":{"tf":1.0}}}}}},"í":{"d":{"a":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"i":{"d":{"df":2,"docs":{"117":{"tf":1.0},"118":{"tf":1.0}},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"100":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"g":{"a":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}}}}},"z":{"df":1,"docs":{"93":{"tf":1.0}}}},"n":{"df":2,"docs":{"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":1,"docs":{"8":{"tf":1.0}}},"s":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"79":{"tf":1.0},"83":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"131":{"tf":2.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.7320508075688772},"134":{"tf":1.4142135623730951},"135":{"tf":2.6457513110645907},"136":{"tf":1.7320508075688772},"17":{"tf":1.0},"9":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"132":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}}},"df":11,"docs":{"0":{"tf":1.0},"101":{"tf":1.0},"105":{"tf":1.0},"111":{"tf":1.0},"123":{"tf":1.0},"133":{"tf":1.0},"50":{"tf":1.0},"87":{"tf":1.0},"90":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":8,"docs":{"10":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.0},"123":{"tf":1.7320508075688772},"125":{"tf":1.0},"95":{"tf":1.0}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"20":{"tf":1.0}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"83":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"o":{"df":5,"docs":{"103":{"tf":1.0},"113":{"tf":1.4142135623730951},"114":{"tf":1.0},"119":{"tf":1.0},"3":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"98":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"135":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"21":{"tf":1.7320508075688772},"37":{"tf":1.0},"41":{"tf":1.0}}}},"s":{"a":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{}},"u":{"a":{"df":2,"docs":{"104":{"tf":1.0},"8":{"tf":1.0}},"l":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":2.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":3,"docs":{"111":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"115":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"112":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}},"é":{"c":{"a":{"d":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"106":{"tf":1.0},"108":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"20":{"tf":1.0}}}}},"d":{"2":{"5":{"5":{"1":{"9":{"df":13,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"125":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"2":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"62":{"tf":1.0}}}}}}},"df":64,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":2.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.7320508075688772},"106":{"tf":1.0},"107":{"tf":1.4142135623730951},"108":{"tf":1.0},"109":{"tf":2.23606797749979},"110":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":2.23606797749979},"114":{"tf":2.0},"115":{"tf":1.7320508075688772},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":1.0},"125":{"tf":2.0},"126":{"tf":2.23606797749979},"127":{"tf":1.0},"129":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":2.0},"135":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.4142135623730951},"24":{"tf":1.0},"27":{"tf":1.0},"3":{"tf":2.0},"44":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0},"62":{"tf":1.0},"70":{"tf":1.4142135623730951},"72":{"tf":1.0},"74":{"tf":2.0},"75":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.7320508075688772},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.7320508075688772},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.7320508075688772},"93":{"tf":1.7320508075688772},"94":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951},"99":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"l":{"a":{"df":2,"docs":{"31":{"tf":1.0},"93":{"tf":1.0}}},"df":12,"docs":{"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"119":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"126":{"tf":1.0},"129":{"tf":1.0},"62":{"tf":1.0},"70":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.4142135623730951}},"í":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"b":{"a":{"df":0,"docs":{},"r":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":39,"docs":{"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.4142135623730951},"104":{"tf":1.4142135623730951},"105":{"tf":1.4142135623730951},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"113":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":2.23606797749979},"121":{"tf":1.7320508075688772},"123":{"tf":1.0},"124":{"tf":1.0},"129":{"tf":1.7320508075688772},"130":{"tf":1.0},"131":{"tf":1.0},"17":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"32":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.4142135623730951},"71":{"tf":1.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.0},"76":{"tf":1.0},"87":{"tf":2.23606797749979},"9":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.0},"98":{"tf":1.0}},"p":{"a":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"a":{"d":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"a":{"df":2,"docs":{"0":{"tf":1.0},"2":{"tf":1.0}}},"df":0,"docs":{}}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"d":{"df":0,"docs":{},"n":{"df":2,"docs":{"79":{"tf":1.0},"84":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":3,"docs":{"123":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0}},"r":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"95":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":3,"docs":{"4":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.4142135623730951}}},"r":{"df":3,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"70":{"tf":1.0}}}}}}}}},"d":{"df":1,"docs":{"118":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"104":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":17,"docs":{"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":2.23606797749979},"126":{"tf":1.0},"127":{"tf":2.0},"129":{"tf":1.4142135623730951},"72":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951},"83":{"tf":1.0},"85":{"tf":1.4142135623730951},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.4142135623730951},"89":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{},"ç":{"a":{"d":{"a":{"df":1,"docs":{"113":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"85":{"tf":1.0}}}}}}}},"df":1,"docs":{"37":{"tf":1.4142135623730951}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"o":{"df":2,"docs":{"125":{"tf":1.0},"88":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"26":{"tf":1.0},"62":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"d":{"a":{"df":3,"docs":{"16":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"70":{"tf":1.0}},"r":{"df":3,"docs":{"4":{"tf":1.0},"73":{"tf":1.4142135623730951},"83":{"tf":1.0}}}},"df":7,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"123":{"tf":1.0},"133":{"tf":1.0},"63":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"63":{"tf":1.0}}}}}},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"102":{"tf":1.0},"111":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"110":{"tf":1.0},"111":{"tf":1.0},"113":{"tf":1.0}}}}}},"i":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":5,"docs":{"103":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":2.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.0}},"m":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"110":{"tf":1.4142135623730951}}},"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":4,"docs":{"104":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"75":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"44":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"33":{"tf":1.0}}}},"i":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"a":{"df":3,"docs":{"133":{"tf":1.0},"70":{"tf":1.0},"96":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"87":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"72":{"tf":1.0},"87":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"3":{"2":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"100":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"ç":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"113":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":3,"docs":{"72":{"tf":1.0},"73":{"tf":1.4142135623730951},"81":{"tf":1.0}}}},"df":0,"docs":{}}}},"í":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":3,"docs":{"109":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"33":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"a":{"df":3,"docs":{"100":{"tf":1.0},"110":{"tf":1.0},"95":{"tf":1.0}}},"df":5,"docs":{"124":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0},"99":{"tf":1.0}}},"t":{"a":{"df":8,"docs":{"26":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"77":{"tf":1.7320508075688772},"91":{"tf":1.0},"93":{"tf":1.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.0}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"132":{"tf":1.0}}}}},"o":{"df":2,"docs":{"135":{"tf":1.0},"95":{"tf":1.4142135623730951}}}},"df":13,"docs":{"1":{"tf":1.0},"105":{"tf":1.0},"107":{"tf":1.0},"112":{"tf":1.0},"18":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"j":{"a":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"16":{"tf":1.0},"88":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"é":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"126":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"26":{"tf":1.0},"60":{"tf":1.0},"75":{"tf":1.0}}}},"df":3,"docs":{"32":{"tf":1.0},"33":{"tf":1.0},"60":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"t":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"136":{"tf":1.0},"78":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":1,"docs":{"106":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"129":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"127":{"tf":1.0}},"r":{"df":4,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"a":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"122":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"37":{"tf":1.0},"96":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"u":{"c":{"a":{"df":0,"docs":{},"o":{"df":4,"docs":{"132":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"74":{"tf":1.0}}}},"df":0,"docs":{},"t":{"a":{"df":4,"docs":{"105":{"tf":1.0},"129":{"tf":1.0},"33":{"tf":1.0},"70":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":14,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.4142135623730951},"135":{"tf":1.0},"17":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"98":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"r":{"df":7,"docs":{"128":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"73":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}},"df":1,"docs":{"17":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":8,"docs":{"117":{"tf":1.0},"40":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"73":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.4142135623730951}}}}}}},"i":{"b":{"df":2,"docs":{"45":{"tf":1.0},"67":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"104":{"tf":1.0},"31":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"100":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.0},"122":{"tf":1.0},"127":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"82":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"c":{"a":{"df":2,"docs":{"91":{"tf":1.0},"99":{"tf":1.0}},"r":{"df":1,"docs":{"91":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}},"õ":{"df":2,"docs":{"1":{"tf":1.0},"62":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"44":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"df":1,"docs":{"130":{"tf":1.0}},"r":{"df":1,"docs":{"120":{"tf":1.0}},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"26":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":3,"docs":{"10":{"tf":1.0},"25":{"tf":1.4142135623730951},"56":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":3,"docs":{"26":{"tf":1.4142135623730951},"3":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":11,"docs":{"11":{"tf":1.4142135623730951},"18":{"tf":1.0},"25":{"tf":1.7320508075688772},"56":{"tf":1.7320508075688772},"57":{"tf":1.4142135623730951},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.7320508075688772},"62":{"tf":1.0},"63":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"38":{"tf":1.0},"45":{"tf":1.0}}}},"õ":{"df":1,"docs":{"38":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"124":{"tf":1.4142135623730951}}},"df":0,"docs":{},"o":{"df":4,"docs":{"124":{"tf":1.0},"125":{"tf":2.0},"129":{"tf":1.0},"63":{"tf":1.0}}}}}},"r":{"a":{"df":2,"docs":{"101":{"tf":1.0},"112":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"8":{"df":0,"docs":{},"e":{"7":{"d":{"6":{"c":{"5":{"b":{"4":{"a":{"3":{"9":{"2":{"0":{"1":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"h":{"a":{"df":7,"docs":{"103":{"tf":1.0},"116":{"tf":1.0},"122":{"tf":1.0},"126":{"tf":1.0},"54":{"tf":1.4142135623730951},"82":{"tf":1.0},"99":{"tf":1.0}},"r":{"df":3,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"51":{"tf":1.0}}}}},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"126":{"tf":1.4142135623730951},"83":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"a":{"df":2,"docs":{"74":{"tf":1.0},"94":{"tf":1.0}}},"df":1,"docs":{"128":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"a":{"df":1,"docs":{"125":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":1,"docs":{"94":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{",":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"22":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"í":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"129":{"tf":1.0},"3":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"102":{"tf":1.0}}}}},"z":{"df":4,"docs":{"119":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"71":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":3,"docs":{"1":{"tf":1.0},"105":{"tf":1.0},"73":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"76":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"42":{"tf":1.0}},"s":{",":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"o":{",":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"c":{"a":{"df":1,"docs":{"114":{"tf":1.0}},"m":{"df":2,"docs":{"123":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"127":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"2":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"114":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"76":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"126":{"tf":1.0},"16":{"tf":1.0},"77":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}},"t":{"a":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"ó":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"15":{"tf":2.449489742783178},"3":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"x":{"df":0,"docs":{},"o":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"i":{"df":4,"docs":{"1":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"69":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"125":{"tf":1.0},"5":{"tf":1.0}}}},"r":{"a":{"df":1,"docs":{"123":{"tf":1.0}},"m":{"df":1,"docs":{"55":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":4,"docs":{"102":{"tf":1.0},"76":{"tf":1.0},"94":{"tf":1.0},"98":{"tf":1.0}},"t":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}},"o":{"df":12,"docs":{"1":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0},"85":{"tf":1.0}}},"s":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"131":{"tf":1.0}},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"78":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":1,"docs":{"101":{"tf":1.0}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"26":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"102":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"o":{"df":19,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":2.449489742783178},"102":{"tf":2.0},"103":{"tf":2.0},"104":{"tf":2.8284271247461903},"105":{"tf":2.23606797749979},"106":{"tf":2.0},"107":{"tf":1.0},"108":{"tf":1.7320508075688772},"117":{"tf":2.8284271247461903},"118":{"tf":2.0},"119":{"tf":1.7320508075688772},"120":{"tf":1.7320508075688772},"121":{"tf":2.449489742783178},"122":{"tf":1.7320508075688772},"126":{"tf":1.0},"129":{"tf":1.4142135623730951},"3":{"tf":1.0},"98":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"s":{"d":{"df":2,"docs":{"8":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"106":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"130":{"tf":1.0},"82":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"ê":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":6,"docs":{"103":{"tf":1.4142135623730951},"110":{"tf":1.4142135623730951},"117":{"tf":1.4142135623730951},"123":{"tf":1.0},"124":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"84":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":1,"docs":{"82":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"/":{"_":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":3,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.0}}}}}}},"í":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"g":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"103":{"tf":1.0},"104":{"tf":1.0},"122":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"106":{"tf":1.0},"87":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"b":{"df":4,"docs":{"106":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"67":{"tf":1.0}}},"c":{"df":0,"docs":{},"m":{"df":3,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"19":{"tf":1.0}}}}},"r":{"a":{"d":{"a":{"df":2,"docs":{"110":{"tf":1.0},"74":{"tf":1.4142135623730951}}},"df":0,"docs":{},"o":{"df":2,"docs":{"114":{"tf":1.0},"118":{"tf":1.0}}}},"df":4,"docs":{"121":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"71":{"tf":1.0}},"r":{"df":2,"docs":{"101":{"tf":1.0},"94":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}},"n":{"c":{"df":0,"docs":{},"i":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}},"df":0,"docs":{},"á":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"107":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"76":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"39":{"tf":1.0},"4":{"tf":1.0}}}},"õ":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"r":{"d":{"a":{"df":1,"docs":{"129":{"tf":1.0}},"m":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"14":{"tf":1.0},"18":{"tf":1.0}}},"df":0,"docs":{}}}},"h":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"114":{"tf":1.0},"126":{"tf":1.0},"87":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"128":{"tf":1.0},"84":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"92":{"tf":1.0}},"r":{"d":{"c":{"df":0,"docs":{},"o":{"d":{"df":4,"docs":{"79":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"90":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":23,"docs":{"103":{"tf":1.0},"104":{"tf":1.7320508075688772},"112":{"tf":1.0},"113":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"50":{"tf":1.0},"57":{"tf":1.0},"58":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.0},"70":{"tf":1.0},"74":{"tf":1.4142135623730951},"92":{"tf":1.0},"94":{"tf":1.0}}}}},"df":2,"docs":{"106":{"tf":1.7320508075688772},"11":{"tf":1.0}},"e":{"a":{"d":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"105":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"1":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0}}}}}},"df":0,"docs":{}},"2":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"118":{"tf":1.0},"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"df":0,"docs":{}},"3":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":4,"docs":{"118":{"tf":2.23606797749979},"119":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"121":{"tf":1.0}}}},"l":{"df":0,"docs":{},"p":{"df":1,"docs":{"11":{"tf":2.23606797749979}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":9,"docs":{"109":{"tf":1.0},"116":{"tf":2.0},"117":{"tf":1.0},"118":{"tf":1.7320508075688772},"119":{"tf":1.4142135623730951},"120":{"tf":1.0},"121":{"tf":1.7320508075688772},"122":{"tf":1.0},"44":{"tf":1.0}}}}}}},"df":0,"docs":{}},"x":{"a":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":2,"docs":{"48":{"tf":1.0},"58":{"tf":1.0}}}},"df":1,"docs":{"22":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"df":1,"docs":{"3":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":4,"docs":{"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"126":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"/":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"}":{"/":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"z":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"19":{"tf":1.0},"31":{"tf":1.0}},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"df":0,"docs":{}}},"r":{"a":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.0}},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"~":{"df":0,"docs":{},"i":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"n":{"c":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"0":{"tf":1.0}}},"df":1,"docs":{"11":{"tf":1.0}},"o":{"df":4,"docs":{"1":{"tf":1.0},"118":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}}}}},"df":0,"docs":{}}},"í":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"d":{"df":5,"docs":{"121":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"97":{"tf":1.0}},"e":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"101":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":6,"docs":{"11":{"tf":1.0},"19":{"tf":1.0},"26":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"60":{"tf":1.0}},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"d":{"a":{"d":{"df":18,"docs":{"1":{"tf":1.0},"114":{"tf":1.7320508075688772},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.7320508075688772},"121":{"tf":1.0},"125":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"27":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":2.449489742783178},"81":{"tf":1.0},"94":{"tf":1.7320508075688772},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":4,"docs":{"22":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"74":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"131":{"tf":1.0},"132":{"tf":1.7320508075688772},"38":{"tf":1.4142135623730951}}},"n":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"82":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"2":{"tf":1.0}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"109":{"tf":1.0}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":1,"docs":{"71":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"á":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"115":{"tf":1.0}}},"l":{"df":1,"docs":{"113":{"tf":1.0}}}}}}}}},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}}}}}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":7,"docs":{"114":{"tf":1.0},"121":{"tf":1.0},"125":{"tf":1.0},"135":{"tf":1.0},"2":{"tf":1.0},"22":{"tf":1.0},"62":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"125":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"122":{"tf":1.0},"36":{"tf":1.0}}}},"í":{"d":{"df":0,"docs":{},"o":{"df":4,"docs":{"21":{"tf":1.0},"26":{"tf":1.0},"37":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"113":{"tf":1.0},"124":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}}},"x":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"99":{"tf":1.0}}}},"df":2,"docs":{"108":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"ê":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"39":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":2,"docs":{"120":{"tf":1.0},"75":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"117":{"tf":1.0},"122":{"tf":1.4142135623730951}}}},"õ":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}}},"df":1,"docs":{"120":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"0":{"tf":1.0},"116":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":4,"docs":{"124":{"tf":1.0},"133":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.0}},"i":{"df":2,"docs":{"74":{"tf":1.0},"92":{"tf":1.0}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"19":{"tf":1.4142135623730951},"27":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"71":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"135":{"tf":1.0},"76":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":9,"docs":{"11":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.7320508075688772},"32":{"tf":1.4142135623730951},"33":{"tf":1.0}},"i":{"df":3,"docs":{"11":{"tf":1.0},"19":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"120":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"l":{"a":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"7":{"tf":1.0}},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":1,"docs":{"10":{"tf":1.0}},"r":{"df":4,"docs":{"119":{"tf":1.0},"29":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":13,"docs":{"10":{"tf":1.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"5":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"df":6,"docs":{"10":{"tf":2.0},"119":{"tf":1.0},"12":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"8":{"tf":2.6457513110645907},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"õ":{"df":4,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}}}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"24":{"tf":1.0},"51":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"11":{"tf":1.0}},"i":{"d":{"a":{"d":{"df":7,"docs":{"105":{"tf":1.0},"2":{"tf":1.0},"24":{"tf":1.4142135623730951},"3":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0},"55":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"102":{"tf":1.0},"125":{"tf":1.0},"82":{"tf":2.6457513110645907}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"37":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"43":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"f":{"a":{"c":{"df":1,"docs":{"87":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"a":{"df":1,"docs":{"124":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"33":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}},"o":{"df":1,"docs":{"72":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"125":{"tf":1.0}}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":5,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"v":{"df":1,"docs":{"127":{"tf":1.0}},"á":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"é":{"df":1,"docs":{"32":{"tf":1.0}}}},"í":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":11,"docs":{"115":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0}}}}},"df":0,"docs":{}},"ú":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"o":{"df":2,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951}},"t":{"df":1,"docs":{"98":{"tf":1.0}}}},"p":{"df":6,"docs":{"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":1.0}},"v":{"4":{"df":3,"docs":{"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951}}},"6":{"_":{"df":0,"docs":{},"v":{"6":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":2.6457513110645907}}}}}}},"df":0,"docs":{}}},"df":4,"docs":{"86":{"tf":2.0},"87":{"tf":2.449489742783178},"88":{"tf":1.7320508075688772},"89":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"r":{"a":{"df":1,"docs":{"76":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"117":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"o":{"df":26,"docs":{"10":{"tf":1.0},"100":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"19":{"tf":1.0},"32":{"tf":1.0},"62":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"4":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":3,"docs":{"82":{"tf":1.0},"95":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"j":{"a":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"14":{"tf":1.0},"31":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":6,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0}}}},"g":{"df":2,"docs":{"20":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":5,"docs":{"26":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0},"79":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":4,"docs":{"110":{"tf":1.0},"114":{"tf":1.0},"121":{"tf":1.0},"8":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}}}},"k":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":4,"docs":{"3":{"tf":1.0},"82":{"tf":1.0},"92":{"tf":1.0},"95":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"b":{"/":{"df":2,"docs":{"126":{"tf":1.4142135623730951},"128":{"tf":1.4142135623730951}}},"df":3,"docs":{"23":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.4142135623730951}}},"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.0},"3":{"tf":1.0}}},"y":{"df":1,"docs":{"119":{"tf":1.0}}}},"y":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"111":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"a":{"df":2,"docs":{"119":{"tf":1.0},"18":{"tf":1.4142135623730951}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"37":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"102":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"a":{"df":3,"docs":{"126":{"tf":1.0},"128":{"tf":1.4142135623730951},"130":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"72":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"74":{"tf":1.0}}}}}}},"í":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":2,"docs":{"60":{"tf":1.0},"62":{"tf":1.0}}},"l":{"df":2,"docs":{"118":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":2,"docs":{"1":{"tf":1.0},"26":{"tf":1.0}}},"v":{"a":{"df":4,"docs":{"125":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":2,"docs":{"74":{"tf":1.0},"93":{"tf":1.0}}}}},"i":{"b":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"71":{"tf":1.0},"81":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"3":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"98":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"117":{"tf":1.4142135623730951},"121":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"t":{"a":{"d":{"a":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"126":{"tf":1.0},"128":{"tf":1.4142135623730951}}}},"p":{"a":{"df":1,"docs":{"76":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"96":{"tf":1.0}}},"h":{"a":{"df":1,"docs":{"72":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"x":{"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":2.0},"71":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"37":{"tf":1.0},"83":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"4":{"tf":1.0},"45":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"64":{"tf":1.0}}}},"df":8,"docs":{"11":{"tf":1.4142135623730951},"23":{"tf":1.0},"64":{"tf":1.7320508075688772},"65":{"tf":1.4142135623730951},"66":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":6,"docs":{"79":{"tf":1.0},"81":{"tf":1.0},"86":{"tf":1.4142135623730951},"87":{"tf":2.0},"89":{"tf":1.0},"90":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":7,"docs":{"134":{"tf":1.0},"135":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"r":{"df":2,"docs":{"108":{"tf":1.0},"121":{"tf":1.0}},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"o":{"c":{"a":{"df":0,"docs":{},"i":{"df":4,"docs":{"105":{"tf":1.0},"121":{"tf":1.0},"3":{"tf":1.0},"64":{"tf":1.0}}},"l":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":3,"docs":{"71":{"tf":1.0},"79":{"tf":1.0},"81":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":14,"docs":{"105":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"19":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"45":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0},"98":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"91":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"2":{"tf":1.0},"82":{"tf":1.0}}}}}}},"t":{"df":3,"docs":{"22":{"tf":1.0},"37":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"135":{"tf":1.4142135623730951},"75":{"tf":2.23606797749979},"85":{"tf":1.4142135623730951}},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"105":{"tf":2.0},"108":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"92":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"a":{"c":{"df":0,"docs":{},"o":{"df":5,"docs":{"14":{"tf":1.0},"71":{"tf":1.0},"8":{"tf":1.0},"81":{"tf":1.0},"89":{"tf":1.0}}}},"df":8,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"112":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.0},"91":{"tf":1.0},"94":{"tf":1.0}},"i":{"df":13,"docs":{"101":{"tf":1.4142135623730951},"103":{"tf":1.0},"106":{"tf":1.4142135623730951},"109":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.7320508075688772},"123":{"tf":1.0},"2":{"tf":1.0},"7":{"tf":1.0},"92":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"107":{"tf":1.0}},"i":{"a":{"df":7,"docs":{"109":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"90":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":6,"docs":{"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"50":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}},"o":{"df":3,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"92":{"tf":1.0},"97":{"tf":1.0}}},"r":{"df":2,"docs":{"121":{"tf":1.0},"82":{"tf":1.0}},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}}}},"é":{"df":0,"docs":{},"m":{"df":3,"docs":{"103":{"tf":1.0},"107":{"tf":1.0},"99":{"tf":1.0}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"104":{"tf":1.0},"124":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"122":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"122":{"tf":1.0}}}}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":2,"docs":{"128":{"tf":1.0},"82":{"tf":1.4142135623730951}}}}}}},"b":{"df":6,"docs":{"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"106":{"tf":2.23606797749979},"108":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"n":{"df":1,"docs":{"84":{"tf":1.0}}}},"df":1,"docs":{"101":{"tf":1.0}},"e":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"102":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":3,"docs":{"20":{"tf":1.7320508075688772},"21":{"tf":1.0},"22":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":6,"docs":{"11":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"a":{"1":{"b":{"2":{"c":{"3":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"4":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"9":{"d":{"0":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"2":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"v":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"4":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"p":{"df":0,"docs":{},"g":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"f":{"6":{"a":{"7":{"b":{"8":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"g":{"7":{"df":0,"docs":{},"h":{"8":{"df":0,"docs":{},"i":{"9":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":17,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.7320508075688772},"107":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"115":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"29":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.7320508075688772},"4":{"tf":2.0},"45":{"tf":1.0},"62":{"tf":1.0},"67":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"df":3,"docs":{"117":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"125":{"tf":1.7320508075688772},"127":{"tf":1.0}}},"n":{"df":1,"docs":{"124":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"m":{"a":{"df":5,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"119":{"tf":1.0},"124":{"tf":1.4142135623730951},"98":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":5,"docs":{"1":{"tf":1.0},"111":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0},"99":{"tf":1.0}}}},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}},"e":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"a":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}}},"d":{"a":{"d":{"df":0,"docs":{},"o":{"df":6,"docs":{"1":{"tf":1.0},"120":{"tf":1.0},"26":{"tf":1.0},"42":{"tf":1.4142135623730951},"45":{"tf":1.0},"60":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":1,"docs":{"114":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"a":{"df":3,"docs":{"130":{"tf":1.0},"85":{"tf":1.0},"95":{"tf":1.0}}},"df":1,"docs":{"130":{"tf":1.0}},"s":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":3,"docs":{"127":{"tf":1.4142135623730951},"129":{"tf":1.7320508075688772},"96":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"129":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"63":{"tf":1.0}}}},"õ":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"62":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"94":{"tf":1.0}}}},"ê":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"h":{"a":{"df":4,"docs":{"20":{"tf":2.0},"21":{"tf":1.0},"22":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"90":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"126":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":4,"docs":{"111":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.0}}},"m":{"df":1,"docs":{"67":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"b":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"129":{"tf":1.4142135623730951},"13":{"tf":1.0},"130":{"tf":1.0},"3":{"tf":1.4142135623730951}},"e":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"9":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"96":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"113":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":3,"docs":{"109":{"tf":1.0},"122":{"tf":1.0},"43":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"38":{"tf":2.0},"39":{"tf":1.0},"4":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"130":{"tf":1.4142135623730951},"85":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"t":{"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.0}}}},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"100":{"tf":1.4142135623730951}}}},"s":{"a":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"129":{"tf":1.0}},"r":{"df":1,"docs":{"75":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"a":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"96":{"tf":1.0}}},"l":{"df":3,"docs":{"127":{"tf":1.0},"129":{"tf":1.0},"98":{"tf":1.0}}}}}},"u":{"d":{"a":{"df":1,"docs":{"127":{"tf":1.0}},"n":{"c":{"a":{"df":3,"docs":{"129":{"tf":1.0},"130":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"ç":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"101":{"tf":1.0},"106":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"132":{"tf":1.0},"135":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"96":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":3,"docs":{"124":{"tf":1.0},"131":{"tf":1.0},"73":{"tf":1.0}}}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}},"á":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"63":{"tf":1.0}}},"df":0,"docs":{}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":2,"docs":{"107":{"tf":1.7320508075688772},"108":{"tf":1.7320508075688772}}}}}}},"í":{"d":{"df":0,"docs":{},"i":{"a":{"df":3,"docs":{"122":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":2,"docs":{"108":{"tf":1.0},"115":{"tf":1.0}}}}}}},"ú":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"100":{"tf":1.0}}}}}}}}}},"n":{"+":{"df":0,"docs":{},"m":{"df":1,"docs":{"101":{"tf":1.0}}}},"a":{"d":{"a":{"df":3,"docs":{"105":{"tf":1.0},"117":{"tf":1.0},"21":{"tf":1.0}}},"df":0,"docs":{}},"df":23,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.0},"123":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":1.0},"133":{"tf":1.0},"16":{"tf":1.0},"4":{"tf":1.4142135623730951},"45":{"tf":1.0},"67":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"83":{"tf":1.0},"84":{"tf":1.0},"87":{"tf":1.0},"91":{"tf":1.0},"93":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0}}}},"o":{"df":14,"docs":{"123":{"tf":1.0},"124":{"tf":1.7320508075688772},"125":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"134":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.4142135623730951},"97":{"tf":1.0},"98":{"tf":1.7320508075688772}}},"t":{"df":9,"docs":{"123":{"tf":2.449489742783178},"124":{"tf":3.1622776601683795},"125":{"tf":2.23606797749979},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":2.449489742783178},"129":{"tf":1.0},"130":{"tf":2.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"129":{"tf":1.0},"86":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"92":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"z":{"a":{"df":1,"docs":{"113":{"tf":1.0}}},"df":0,"docs":{}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":3,"docs":{"26":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.0}}}},"df":0,"docs":{}},"k":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":10,"docs":{"10":{"tf":1.0},"101":{"tf":1.4142135623730951},"104":{"tf":1.0},"105":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951},"117":{"tf":1.0},"17":{"tf":1.0},"3":{"tf":1.4142135623730951},"37":{"tf":1.0},"4":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"124":{"tf":1.4142135623730951},"90":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"á":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}},"m":{"df":2,"docs":{"102":{"tf":1.0},"98":{"tf":1.0}}},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"a":{"df":4,"docs":{"104":{"tf":1.0},"37":{"tf":1.4142135623730951},"69":{"tf":1.0},"95":{"tf":1.0}}},"df":5,"docs":{"1":{"tf":1.0},"125":{"tf":1.0},"26":{"tf":1.0},"72":{"tf":1.0},"78":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"129":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":3,"docs":{"123":{"tf":1.0},"79":{"tf":1.0},"84":{"tf":1.4142135623730951}}}}}}}},"i":{"c":{"a":{"df":2,"docs":{"100":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"117":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"134":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"111":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"75":{"tf":1.4142135623730951},"84":{"tf":1.0}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":4,"docs":{"79":{"tf":1.0},"81":{"tf":1.4142135623730951},"87":{"tf":1.7320508075688772},"90":{"tf":1.0}}}},"df":21,"docs":{"111":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"128":{"tf":1.0},"129":{"tf":1.7320508075688772},"131":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.7320508075688772},"70":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.4142135623730951},"91":{"tf":1.0},"92":{"tf":2.23606797749979},"93":{"tf":1.7320508075688772},"94":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.0},"97":{"tf":1.7320508075688772},"98":{"tf":1.4142135623730951}},"n":{"c":{"df":2,"docs":{"74":{"tf":1.7320508075688772},"94":{"tf":1.4142135623730951}}},"df":2,"docs":{"37":{"tf":1.0},"43":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"t":{"a":{"df":1,"docs":{"89":{"tf":1.0}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"87":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"v":{"a":{"df":2,"docs":{"74":{"tf":1.0},"76":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":6,"docs":{"105":{"tf":1.0},"106":{"tf":1.0},"121":{"tf":1.4142135623730951},"129":{"tf":1.4142135623730951},"55":{"tf":1.0},"97":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"82":{"tf":1.0}}}}}},"n":{"c":{"a":{"df":5,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"121":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"63":{"tf":1.0}}}}}},"ã":{"df":0,"docs":{},"o":{"df":15,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"106":{"tf":1.7320508075688772},"111":{"tf":1.0},"112":{"tf":2.0},"116":{"tf":1.0},"117":{"tf":1.4142135623730951},"121":{"tf":1.0},"122":{"tf":1.0},"2":{"tf":1.0},"43":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"8":{"tf":1.0},"99":{"tf":1.0}}}},"í":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"44":{"tf":1.4142135623730951}}},"l":{"df":3,"docs":{"37":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.0}}}}}},"ó":{"df":6,"docs":{"103":{"tf":1.0},"106":{"tf":1.4142135623730951},"113":{"tf":1.0},"4":{"tf":1.4142135623730951},"9":{"tf":1.0},"99":{"tf":1.0}}},"ú":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"67":{"tf":1.0}}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}},"o":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"79":{"tf":1.0},"85":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"é":{"df":0,"docs":{},"m":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"r":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}}},"df":79,"docs":{"1":{"tf":2.0},"10":{"tf":1.7320508075688772},"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":2.6457513110645907},"104":{"tf":1.7320508075688772},"105":{"tf":1.4142135623730951},"106":{"tf":2.0},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"109":{"tf":1.7320508075688772},"110":{"tf":1.7320508075688772},"111":{"tf":1.4142135623730951},"112":{"tf":2.0},"113":{"tf":2.23606797749979},"114":{"tf":1.0},"115":{"tf":2.0},"116":{"tf":1.0},"117":{"tf":2.0},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"121":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"125":{"tf":2.8284271247461903},"126":{"tf":2.0},"127":{"tf":1.0},"129":{"tf":2.23606797749979},"13":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"135":{"tf":1.0},"136":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"2":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.4142135623730951},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"29":{"tf":1.7320508075688772},"3":{"tf":1.7320508075688772},"33":{"tf":1.7320508075688772},"37":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"45":{"tf":2.23606797749979},"50":{"tf":2.23606797749979},"62":{"tf":2.0},"7":{"tf":1.7320508075688772},"70":{"tf":1.0},"71":{"tf":2.0},"74":{"tf":1.7320508075688772},"75":{"tf":1.7320508075688772},"76":{"tf":1.4142135623730951},"77":{"tf":1.0},"78":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772},"81":{"tf":1.0},"83":{"tf":1.0},"85":{"tf":1.0},"88":{"tf":1.0},"9":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":2.0},"94":{"tf":1.4142135623730951},"95":{"tf":1.0},"96":{"tf":1.4142135623730951},"97":{"tf":1.7320508075688772},"98":{"tf":2.0},"99":{"tf":1.7320508075688772}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"105":{"tf":1.0},"99":{"tf":1.0}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}},"k":{"df":3,"docs":{"24":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951}}},"n":{"d":{"df":4,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"125":{"tf":1.0},"81":{"tf":1.0}}},"df":0,"docs":{}},"p":{"c":{"a":{"df":0,"docs":{},"o":{"df":2,"docs":{"123":{"tf":1.0},"72":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"o":{"df":3,"docs":{"136":{"tf":1.0},"72":{"tf":1.7320508075688772},"78":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"112":{"tf":1.0},"113":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"s":{"d":{"df":3,"docs":{"8":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"71":{"tf":1.0}}}}},"o":{"df":2,"docs":{"76":{"tf":1.0},"96":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"õ":{"df":1,"docs":{"39":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"72":{"tf":1.0}}}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":6,"docs":{"30":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"õ":{"df":8,"docs":{"17":{"tf":1.0},"30":{"tf":1.4142135623730951},"35":{"tf":1.0},"37":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"59":{"tf":1.4142135623730951},"66":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"103":{"tf":1.0},"129":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":2,"docs":{"117":{"tf":1.0},"125":{"tf":1.0}}}}}}},"s":{"df":35,"docs":{"10":{"tf":1.0},"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":2.23606797749979},"104":{"tf":1.7320508075688772},"105":{"tf":2.0},"107":{"tf":1.0},"111":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"121":{"tf":1.7320508075688772},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"125":{"tf":1.4142135623730951},"135":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"36":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"51":{"tf":1.0},"60":{"tf":1.0},"78":{"tf":1.0},"82":{"tf":1.0},"86":{"tf":1.0},"88":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.7320508075688772},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"97":{"tf":1.0}}},"u":{"df":24,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"110":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.0},"126":{"tf":1.0},"128":{"tf":1.0},"13":{"tf":1.0},"15":{"tf":1.0},"39":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772},"51":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"63":{"tf":1.0},"67":{"tf":1.4142135623730951},"7":{"tf":1.0},"85":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.7320508075688772},"99":{"tf":1.0}},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":3,"docs":{"112":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":13,"docs":{"106":{"tf":1.0},"113":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"128":{"tf":1.0},"39":{"tf":1.0},"70":{"tf":1.0},"73":{"tf":1.0},"90":{"tf":1.0},"92":{"tf":1.4142135623730951},"95":{"tf":1.0},"98":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"118":{"tf":1.0},"120":{"tf":1.0}}}}}}},"p":{"2":{"df":0,"docs":{},"p":{"df":5,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0}}}},"a":{"c":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":4,"docs":{"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"126":{"tf":1.0},"8":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"o":{"df":11,"docs":{"133":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"81":{"tf":1.4142135623730951},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.4142135623730951},"89":{"tf":2.0},"96":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":5,"docs":{"72":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"82":{"tf":1.0},"90":{"tf":1.0}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"ã":{"df":0,"docs":{},"o":{"df":9,"docs":{"108":{"tf":1.0},"30":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"118":{"tf":1.0},"121":{"tf":1.4142135623730951}}}}},"r":{"_":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"b":{"df":1,"docs":{"106":{"tf":1.0}}},"c":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":77,"docs":{"0":{"tf":1.0},"1":{"tf":1.7320508075688772},"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"105":{"tf":1.7320508075688772},"106":{"tf":2.0},"107":{"tf":1.0},"108":{"tf":1.4142135623730951},"109":{"tf":1.7320508075688772},"111":{"tf":1.0},"112":{"tf":1.7320508075688772},"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"119":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.4142135623730951},"122":{"tf":1.0},"123":{"tf":2.23606797749979},"124":{"tf":2.0},"125":{"tf":1.7320508075688772},"126":{"tf":1.7320508075688772},"127":{"tf":1.4142135623730951},"128":{"tf":2.449489742783178},"129":{"tf":1.0},"13":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"2":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.7320508075688772},"3":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"45":{"tf":1.0},"49":{"tf":1.0},"55":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.4142135623730951},"63":{"tf":1.0},"66":{"tf":1.0},"7":{"tf":1.0},"72":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"75":{"tf":1.4142135623730951},"76":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.0},"82":{"tf":1.4142135623730951},"83":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.7320508075688772},"88":{"tf":1.0},"9":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.4142135623730951},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"99":{"tf":1.0}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"82":{"tf":1.0}}}}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"82":{"tf":1.0}}}}}}},"r":{"df":3,"docs":{"108":{"tf":1.0},"135":{"tf":1.0},"76":{"tf":1.0}}}},"df":11,"docs":{"103":{"tf":1.0},"106":{"tf":1.0},"108":{"tf":1.7320508075688772},"114":{"tf":1.7320508075688772},"119":{"tf":1.0},"130":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"82":{"tf":1.0}},"e":{"c":{"df":1,"docs":{"118":{"tf":1.0}}},"df":9,"docs":{"100":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":2.23606797749979},"105":{"tf":1.0},"3":{"tf":1.0},"83":{"tf":1.4142135623730951},"92":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}},"i":{"d":{"a":{"d":{"df":2,"docs":{"101":{"tf":1.4142135623730951},"102":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"a":{"df":4,"docs":{"10":{"tf":1.0},"70":{"tf":1.0},"92":{"tf":1.0},"98":{"tf":2.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":11,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"119":{"tf":1.4142135623730951},"132":{"tf":1.0},"133":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"34":{"tf":1.0},"5":{"tf":1.0},"73":{"tf":1.0}}}}},"â":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"113":{"tf":1.0}}},"df":3,"docs":{"24":{"tf":1.0},"53":{"tf":1.0},"78":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"22":{"tf":1.0}},"u":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"7":{"tf":1.0},"72":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"m":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":3,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"123":{"tf":1.4142135623730951},"126":{"tf":1.7320508075688772},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"2":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951}}}},"l":{"a":{"df":3,"docs":{"3":{"tf":1.0},"77":{"tf":1.0},"95":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":7,"docs":{"103":{"tf":1.0},"104":{"tf":1.0},"111":{"tf":1.0},"4":{"tf":1.0},"8":{"tf":1.0},"88":{"tf":1.0},"92":{"tf":1.0}}}},"n":{"a":{"df":1,"docs":{"124":{"tf":1.0}}},"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"118":{"tf":1.0},"63":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":4,"docs":{"1":{"tf":1.0},"132":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"102":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"106":{"tf":1.0}}},"r":{"df":1,"docs":{"101":{"tf":1.0}}},"u":{"df":1,"docs":{"105":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"95":{"tf":1.0}},"r":{"df":1,"docs":{"97":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"55":{"tf":1.0},"97":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"33":{"tf":1.0},"93":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"16":{"tf":1.0}}},"df":1,"docs":{"70":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"116":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"d":{"a":{"df":2,"docs":{"136":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"a":{"df":5,"docs":{"0":{"tf":1.0},"109":{"tf":1.0},"121":{"tf":1.0},"44":{"tf":1.4142135623730951},"55":{"tf":1.0}}},"df":0,"docs":{}}}},"ç":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":2,"docs":{"94":{"tf":1.0},"98":{"tf":1.0}},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"105":{"tf":1.0},"82":{"tf":1.0},"97":{"tf":1.0}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"125":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"g":{"df":2,"docs":{"14":{"tf":1.4142135623730951},"8":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":2,"docs":{"105":{"tf":1.0},"91":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":4,"docs":{"14":{"tf":1.4142135623730951},"72":{"tf":1.0},"81":{"tf":1.0},"87":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"20":{"tf":1.0},"38":{"tf":1.4142135623730951}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":11,"docs":{"101":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.4142135623730951},"44":{"tf":1.0},"62":{"tf":1.0},"78":{"tf":1.0}},"m":{"df":9,"docs":{"101":{"tf":1.0},"106":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.4142135623730951},"121":{"tf":1.0},"125":{"tf":1.0},"88":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"124":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":7,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"70":{"tf":1.0},"82":{"tf":1.7320508075688772},"91":{"tf":1.0},"93":{"tf":1.7320508075688772},"95":{"tf":1.7320508075688772}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"97":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":28,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"104":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"126":{"tf":1.4142135623730951},"130":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"37":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.4142135623730951},"72":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"92":{"tf":1.0},"95":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"q":{"df":0,"docs":{},"u":{"df":3,"docs":{"112":{"tf":1.0},"2":{"tf":1.0},"87":{"tf":1.0}}}},"t":{"a":{"df":7,"docs":{"124":{"tf":1.7320508075688772},"133":{"tf":1.0},"16":{"tf":2.0},"72":{"tf":1.0},"73":{"tf":1.0},"77":{"tf":1.4142135623730951},"96":{"tf":1.0}}},"df":2,"docs":{"128":{"tf":1.0},"135":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"93":{"tf":1.0}}}},"i":{"df":1,"docs":{"105":{"tf":1.0}}}},"í":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"u":{"c":{"df":0,"docs":{},"o":{"df":2,"docs":{"103":{"tf":1.0},"95":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"z":{"df":0,"docs":{},"o":{"df":2,"docs":{"115":{"tf":1.0},"2":{"tf":1.0}}}}},"df":5,"docs":{"14":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951}},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"a":{"df":7,"docs":{"106":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"26":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}},"m":{"df":2,"docs":{"109":{"tf":1.0},"119":{"tf":1.0}}},"r":{"df":3,"docs":{"63":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0}},"i":{"a":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"x":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"a":{"d":{"a":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":2,"docs":{"0":{"tf":1.0},"20":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"109":{"tf":1.0}}}}}},"df":1,"docs":{"11":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"76":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"112":{"tf":1.0},"121":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"125":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":3,"docs":{"17":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":7,"docs":{"123":{"tf":1.0},"129":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"67":{"tf":1.0},"83":{"tf":1.0},"93":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":2,"docs":{"60":{"tf":1.0},"62":{"tf":1.4142135623730951}}}},"í":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.0},"115":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":2,"docs":{"106":{"tf":1.0},"129":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":2,"docs":{"109":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"d":{"a":{"df":8,"docs":{"109":{"tf":1.0},"110":{"tf":1.4142135623730951},"114":{"tf":1.0},"115":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":3,"docs":{"115":{"tf":1.0},"123":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":4,"docs":{"37":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"123":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":3,"docs":{"125":{"tf":1.0},"4":{"tf":1.0},"97":{"tf":1.4142135623730951}}}}}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"111":{"tf":1.0}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"74":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"129":{"tf":1.0}}}}}}}},"j":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"a":{"d":{"a":{"df":1,"docs":{"109":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":2,"docs":{"3":{"tf":1.0},"9":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":2,"docs":{"130":{"tf":1.0},"85":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"37":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"õ":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"95":{"tf":1.0},"97":{"tf":1.0}}}}},"ó":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}}}},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":4,"docs":{"103":{"tf":1.0},"16":{"tf":1.4142135623730951},"88":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":1,"docs":{"7":{"tf":1.0}}}},"v":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":5,"docs":{"105":{"tf":1.0},"3":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.7320508075688772}},"n":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"1":{"tf":1.0},"125":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":2,"docs":{"95":{"tf":1.4142135623730951},"97":{"tf":1.0}}}}}}},"á":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"107":{"tf":1.0}}}},"df":0,"docs":{}}}},"ó":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":3,"docs":{"103":{"tf":1.0},"17":{"tf":1.4142135623730951},"22":{"tf":1.0}}}}}}}},"t":{"df":2,"docs":{"37":{"tf":1.0},"42":{"tf":1.0}}},"u":{"b":{"df":1,"docs":{"15":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"a":{"df":2,"docs":{"113":{"tf":1.0},"115":{"tf":1.0}}},"df":0,"docs":{}},"df":4,"docs":{"113":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.0}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"113":{"tf":1.4142135623730951},"3":{"tf":1.0}}}},"õ":{"df":1,"docs":{"114":{"tf":1.0}}}}},"df":7,"docs":{"124":{"tf":1.0},"23":{"tf":1.0},"37":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.4142135623730951}},"o":{"df":5,"docs":{"123":{"tf":1.7320508075688772},"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.4142135623730951},"128":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"126":{"tf":1.0},"130":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"38":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.0}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}}},"ó":{"df":4,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.4142135623730951},"115":{"tf":1.0},"3":{"tf":1.0}}},"ú":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"a":{"df":9,"docs":{"109":{"tf":1.4142135623730951},"110":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"2":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"i":{"df":2,"docs":{"111":{"tf":1.0},"93":{"tf":1.0}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"101":{"tf":1.0},"105":{"tf":1.0},"117":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"0":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"117":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"125":{"tf":1.0},"44":{"tf":1.0},"62":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":22,"docs":{"1":{"tf":1.0},"100":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.4142135623730951},"106":{"tf":1.0},"110":{"tf":1.0},"113":{"tf":1.4142135623730951},"114":{"tf":1.4142135623730951},"116":{"tf":1.0},"119":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.0},"71":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"82":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":5,"docs":{"104":{"tf":1.0},"82":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"98":{"tf":1.0}}}}}},"df":1,"docs":{"9":{"tf":1.0}},"e":{"b":{"df":0,"docs":{},"r":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":3,"docs":{"111":{"tf":1.0},"117":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{}}},"df":56,"docs":{"0":{"tf":1.0},"1":{"tf":2.0},"10":{"tf":1.0},"100":{"tf":1.7320508075688772},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.4142135623730951},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"117":{"tf":1.0},"119":{"tf":1.0},"122":{"tf":1.4142135623730951},"123":{"tf":1.0},"124":{"tf":1.7320508075688772},"125":{"tf":1.4142135623730951},"129":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951},"37":{"tf":1.0},"4":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"50":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"62":{"tf":1.0},"7":{"tf":1.0},"70":{"tf":1.4142135623730951},"74":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.4142135623730951},"88":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":2.23606797749979},"94":{"tf":1.4142135623730951},"95":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}},"m":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"4":{"tf":1.0},"44":{"tf":1.0},"93":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"r":{"df":2,"docs":{"125":{"tf":1.0},"93":{"tf":1.0}}}},"i":{"c":{"df":9,"docs":{"129":{"tf":1.4142135623730951},"16":{"tf":1.0},"3":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"81":{"tf":1.0},"96":{"tf":2.0}}},"df":0,"docs":{}},"â":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":2,"docs":{"115":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":4,"docs":{"111":{"tf":1.7320508075688772},"114":{"tf":1.4142135623730951},"116":{"tf":1.0},"2":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"132":{"tf":1.0},"15":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"p":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"94":{"tf":1.0},"98":{"tf":1.0}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"106":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}}}}}},"y":{"df":1,"docs":{"63":{"tf":1.0}}},"z":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.0}}}}}},"df":1,"docs":{"126":{"tf":2.0}},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":2,"docs":{"135":{"tf":1.0},"71":{"tf":1.0}}},"m":{"df":0,"docs":{},"e":{".":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"26":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"93":{"tf":1.0}}},"l":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"125":{"tf":1.0}}}}}}}},"c":{"a":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":2,"docs":{"104":{"tf":1.0},"50":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"b":{"df":2,"docs":{"104":{"tf":1.0},"106":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"106":{"tf":1.0},"126":{"tf":1.0}}}},"i":{"d":{"a":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":1,"docs":{"97":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"a":{"df":1,"docs":{"126":{"tf":1.0}}},"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":2,"docs":{"106":{"tf":1.7320508075688772},"126":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":1,"docs":{"128":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"a":{"d":{"a":{"df":2,"docs":{"7":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"129":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"129":{"tf":2.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"r":{"df":4,"docs":{"101":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":1.0}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"121":{"tf":1.0},"122":{"tf":1.0}}}}}},"ó":{"df":0,"docs":{},"i":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"105":{"tf":1.0}}}},"v":{"df":1,"docs":{"119":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":4,"docs":{"111":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":1.0},"93":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":7,"docs":{"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":31,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"100":{"tf":1.0},"103":{"tf":1.4142135623730951},"105":{"tf":1.4142135623730951},"106":{"tf":1.0},"108":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":2.23606797749979},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951},"70":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.4142135623730951},"83":{"tf":1.0},"84":{"tf":1.4142135623730951},"91":{"tf":2.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.7320508075688772},"96":{"tf":1.7320508075688772},"97":{"tf":1.0},"98":{"tf":2.23606797749979}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"105":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"101":{"tf":1.0}}}}},"df":0,"docs":{},"â":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":2,"docs":{"121":{"tf":1.0},"129":{"tf":1.4142135623730951}},"e":{"d":{"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"127":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"129":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"104":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":3,"docs":{"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0}}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"121":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":3,"docs":{"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}}}},"r":{"a":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"104":{"tf":1.0},"106":{"tf":1.0}}}},"df":1,"docs":{"115":{"tf":1.0}},"r":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"a":{"df":0,"docs":{},"y":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"p":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"128":{"tf":1.4142135623730951}}}},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"m":{"a":{"df":0,"docs":{},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"128":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"p":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":7,"docs":{"123":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":2.6457513110645907},"127":{"tf":1.0},"128":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"98":{"tf":1.0}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"126":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"126":{"tf":1.0}}}}}}}}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}}}}}},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"126":{"tf":1.0},"82":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"100":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":11,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":2.23606797749979},"106":{"tf":1.4142135623730951},"107":{"tf":1.0},"108":{"tf":2.0},"3":{"tf":1.0},"99":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"103":{"tf":1.0}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":11,"docs":{"100":{"tf":1.7320508075688772},"101":{"tf":1.4142135623730951},"102":{"tf":1.7320508075688772},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"3":{"tf":1.0},"99":{"tf":1.7320508075688772}}}}}},"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"124":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"132":{"tf":1.0},"135":{"tf":1.0}}}}}},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"10":{"tf":1.0},"15":{"tf":1.0}}}}}}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"z":{"df":1,"docs":{"125":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"82":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"79":{"tf":1.0},"82":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"7":{"tf":1.0},"94":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"121":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"124":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"14":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951}}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}},"ê":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":2,"docs":{"100":{"tf":1.0},"123":{"tf":1.0}},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"88":{"tf":1.0}}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"95":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"97":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"2":{"tf":1.0},"75":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"d":{"a":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"117":{"tf":1.0},"122":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"106":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"103":{"tf":1.0}}}}},"d":{"a":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"õ":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"123":{"tf":1.0},"128":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"82":{"tf":1.4142135623730951},"92":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"103":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":6,"docs":{"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"136":{"tf":1.0},"21":{"tf":1.7320508075688772},"37":{"tf":1.0},"41":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{":":{"1":{".":{"8":{"5":{"df":1,"docs":{"132":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"=":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{",":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"=":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"75":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"75":{"tf":1.0}}}}}},"c":{"df":1,"docs":{"7":{"tf":1.0}}},"df":3,"docs":{"14":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":2.23606797749979}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}},"á":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":10,"docs":{"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}}}},"s":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"b":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"124":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"a":{"df":2,"docs":{"77":{"tf":1.0},"85":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"76":{"tf":1.0}}}},"l":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"106":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"95":{"tf":1.0}}}},"v":{"a":{"df":1,"docs":{"118":{"tf":1.0}},"r":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":4,"docs":{"104":{"tf":1.0},"126":{"tf":1.0},"88":{"tf":1.0},"95":{"tf":1.0}}},"í":{"d":{"a":{"df":7,"docs":{"120":{"tf":1.0},"122":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"51":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"k":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":2,"docs":{"4":{"tf":1.0},"8":{"tf":1.0}},"e":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"128":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"80":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}},"o":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"df":31,"docs":{"10":{"tf":1.0},"100":{"tf":1.4142135623730951},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"106":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"12":{"tf":1.0},"121":{"tf":1.0},"123":{"tf":1.4142135623730951},"124":{"tf":1.0},"125":{"tf":1.0},"16":{"tf":1.0},"31":{"tf":1.0},"54":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.4142135623730951},"74":{"tf":1.0},"77":{"tf":1.7320508075688772},"78":{"tf":1.0},"8":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"d":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"111":{"tf":1.0},"117":{"tf":1.4142135623730951},"122":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"u":{"df":2,"docs":{"111":{"tf":1.0},"97":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":4,"docs":{"110":{"tf":1.0},"112":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":9,"docs":{"105":{"tf":1.0},"125":{"tf":1.0},"128":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.0},"76":{"tf":1.0},"82":{"tf":1.7320508075688772},"91":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"a":{"df":1,"docs":{"99":{"tf":1.0}},"n":{"df":0,"docs":{},"ç":{"a":{"df":2,"docs":{"121":{"tf":1.7320508075688772},"122":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":3,"docs":{"117":{"tf":1.0},"121":{"tf":1.0},"31":{"tf":1.0}}}}}},"j":{"a":{"df":2,"docs":{"115":{"tf":1.0},"95":{"tf":1.0}},"m":{"df":1,"docs":{"104":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"a":{"d":{"a":{"df":9,"docs":{"109":{"tf":2.0},"110":{"tf":1.7320508075688772},"111":{"tf":1.4142135623730951},"112":{"tf":1.7320508075688772},"113":{"tf":2.23606797749979},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"4":{"tf":1.4142135623730951}}},"df":0,"docs":{},"o":{"df":2,"docs":{"115":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"f":{"df":1,"docs":{"11":{"tf":1.0}}},"o":{"df":1,"docs":{"112":{"tf":1.0}}}},"m":{"df":18,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"2":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"4":{"tf":1.0},"62":{"tf":1.4142135623730951},"63":{"tf":1.0},"73":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"133":{"tf":1.0},"134":{"tf":1.7320508075688772},"4":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.0},"92":{"tf":1.0},"97":{"tf":1.7320508075688772}}}}},"p":{"df":0,"docs":{},"r":{"df":4,"docs":{"109":{"tf":1.0},"112":{"tf":1.0},"89":{"tf":1.0},"98":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"78":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"d":{"a":{"df":1,"docs":{"37":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":3,"docs":{"113":{"tf":1.0},"121":{"tf":1.0},"72":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"129":{"tf":1.0},"97":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"r":{"a":{"df":1,"docs":{"74":{"tf":1.0}}},"df":9,"docs":{"1":{"tf":1.0},"108":{"tf":1.0},"121":{"tf":1.0},"25":{"tf":1.0},"4":{"tf":1.0},"62":{"tf":1.0},"78":{"tf":1.0},"88":{"tf":1.0},"96":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"109":{"tf":1.0}}}},"i":{"a":{"df":2,"docs":{"21":{"tf":1.0},"37":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"135":{"tf":1.0}},"o":{"df":1,"docs":{"126":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"124":{"tf":1.7320508075688772},"128":{"tf":1.0},"131":{"tf":1.0},"4":{"tf":1.0},"92":{"tf":1.0},"98":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"128":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"o":{"df":3,"docs":{"126":{"tf":1.7320508075688772},"127":{"tf":1.0},"128":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"118":{"tf":1.0},"120":{"tf":1.0},"124":{"tf":1.0}}}}},"o":{"df":3,"docs":{"126":{"tf":1.4142135623730951},"127":{"tf":1.0},"128":{"tf":1.0}}},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"119":{"tf":1.0},"121":{"tf":1.4142135623730951}}}},"õ":{"df":1,"docs":{"121":{"tf":1.0}}}}},"u":{"df":28,"docs":{"10":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.4142135623730951},"109":{"tf":1.0},"117":{"tf":1.7320508075688772},"12":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":2.0},"126":{"tf":1.0},"127":{"tf":1.4142135623730951},"128":{"tf":1.0},"129":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"29":{"tf":1.0},"4":{"tf":1.4142135623730951},"45":{"tf":1.0},"62":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"83":{"tf":1.0},"90":{"tf":1.0},"92":{"tf":1.7320508075688772},"93":{"tf":1.0},"95":{"tf":1.7320508075688772},"97":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"’":{"df":2,"docs":{"116":{"tf":1.0},"117":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"1":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"df":0,"docs":{}},"2":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":4,"docs":{"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":2.449489742783178},"120":{"tf":1.7320508075688772}}}}},"df":1,"docs":{"7":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"12":{"tf":1.7320508075688772}}}}}},"i":{"df":1,"docs":{"93":{"tf":1.0}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"109":{"tf":1.0},"2":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"24":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"e":{"d":{"2":{"5":{"5":{"1":{"9":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.0},"60":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":5,"docs":{"1":{"tf":1.0},"112":{"tf":1.0},"124":{"tf":1.0},"62":{"tf":1.0},"93":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"df":2,"docs":{"89":{"tf":2.0},"98":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"98":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"101":{"tf":1.4142135623730951},"103":{"tf":1.0},"106":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"106":{"tf":1.0}}}}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"â":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"a":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":4,"docs":{"115":{"tf":1.0},"8":{"tf":2.0},"87":{"tf":1.0},"92":{"tf":1.0}}},"df":0,"docs":{}}}}},"z":{"df":0,"docs":{},"e":{"df":4,"docs":{"120":{"tf":1.0},"23":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"132":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"102":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"b":{"df":1,"docs":{"105":{"tf":1.0}},"r":{"df":8,"docs":{"120":{"tf":1.0},"122":{"tf":1.0},"16":{"tf":1.0},"50":{"tf":1.0},"62":{"tf":1.0},"70":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"72":{"tf":1.0},"78":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"90":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"v":{"df":3,"docs":{"0":{"tf":1.0},"121":{"tf":1.0},"96":{"tf":1.0}},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":1,"docs":{"116":{"tf":1.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"99":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"105":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"u":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"87":{"tf":1.0},"89":{"tf":1.0},"98":{"tf":1.0}}}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"117":{"tf":1.0}}}}}}}},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"3":{"df":1,"docs":{"8":{"tf":1.0}}},"df":5,"docs":{"104":{"tf":1.0},"19":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"8":{"tf":3.872983346207417}}}}}}},"s":{"df":0,"docs":{},"f":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"87":{"tf":1.0},"89":{"tf":2.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"22":{"tf":1.0},"83":{"tf":1.4142135623730951},"85":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"3":{"4":{"7":{"8":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"1":{"9":{"3":{"0":{"2":{"df":1,"docs":{"128":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"128":{"tf":1.0}}}}}}},"df":5,"docs":{"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0}}}}},"u":{"a":{"df":19,"docs":{"103":{"tf":1.0},"105":{"tf":1.0},"110":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"121":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.7320508075688772},"2":{"tf":1.4142135623730951},"22":{"tf":1.0},"23":{"tf":1.4142135623730951},"26":{"tf":1.0},"45":{"tf":1.0},"55":{"tf":1.0},"92":{"tf":1.0},"94":{"tf":1.0},"97":{"tf":1.4142135623730951},"99":{"tf":1.0}}},"b":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":1,"docs":{"103":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"119":{"tf":1.0}},"i":{"df":1,"docs":{"97":{"tf":1.0}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}}}}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"135":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"130":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"14":{"tf":1.0},"77":{"tf":1.0},"8":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"100":{"tf":1.0},"90":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"20":{"tf":1.0},"38":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"df":4,"docs":{"109":{"tf":1.0},"112":{"tf":1.0},"129":{"tf":1.0},"86":{"tf":1.0}}},"df":1,"docs":{"86":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}},"õ":{"df":1,"docs":{"111":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":2,"docs":{"71":{"tf":1.0},"81":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}},"y":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"94":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"124":{"tf":1.0},"126":{"tf":1.0}}}}}}}},"ã":{"df":0,"docs":{},"o":{"df":11,"docs":{"102":{"tf":1.0},"103":{"tf":1.7320508075688772},"106":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.4142135623730951},"115":{"tf":1.0},"121":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.4142135623730951}}}},"é":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"111":{"tf":1.0},"116":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":7,"docs":{"104":{"tf":1.0},"4":{"tf":1.0},"67":{"tf":1.0},"70":{"tf":1.0},"82":{"tf":1.4142135623730951},"92":{"tf":1.7320508075688772},"97":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"98":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"22":{"tf":1.0},"37":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"=":{"5":{"df":1,"docs":{"135":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"94":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":4,"docs":{"102":{"tf":1.0},"103":{"tf":1.0},"107":{"tf":2.0},"67":{"tf":1.0}}}}}},"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"125":{"tf":1.4142135623730951},"87":{"tf":1.0}}}},"é":{"df":0,"docs":{},"m":{"df":1,"docs":{"112":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"104":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0}}}}},"r":{"d":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"x":{"a":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"117":{"tf":1.7320508075688772},"122":{"tf":1.0},"132":{"tf":1.0}},"e":{"df":31,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.4142135623730951},"12":{"tf":1.7320508075688772},"120":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.4142135623730951},"28":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"34":{"tf":1.4142135623730951},"35":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.4142135623730951},"47":{"tf":1.0},"53":{"tf":1.0},"56":{"tf":1.4142135623730951},"57":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.0}},"m":{"df":10,"docs":{"105":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"7":{"tf":1.0},"74":{"tf":1.0},"8":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"d":{"df":2,"docs":{"105":{"tf":1.0},"108":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":7,"docs":{"0":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.7320508075688772},"116":{"tf":1.0},"4":{"tf":1.4142135623730951},"82":{"tf":1.0},"92":{"tf":1.0}},"r":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"129":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"123":{"tf":1.0},"94":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"124":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":5,"docs":{"115":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"117":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":1,"docs":{"128":{"tf":1.0}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":78,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.449489742783178},"10":{"tf":1.7320508075688772},"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"102":{"tf":1.4142135623730951},"103":{"tf":2.0},"104":{"tf":1.4142135623730951},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":2.0},"109":{"tf":2.449489742783178},"11":{"tf":2.23606797749979},"110":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"112":{"tf":2.449489742783178},"113":{"tf":2.6457513110645907},"114":{"tf":1.4142135623730951},"115":{"tf":1.4142135623730951},"116":{"tf":1.4142135623730951},"118":{"tf":1.0},"123":{"tf":1.0},"129":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":2.23606797749979},"134":{"tf":1.4142135623730951},"136":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":1.0},"22":{"tf":1.7320508075688772},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.7320508075688772},"29":{"tf":1.7320508075688772},"3":{"tf":2.6457513110645907},"30":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":2.8284271247461903},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.7320508075688772},"56":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.0},"70":{"tf":1.7320508075688772},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":2.23606797749979},"75":{"tf":2.0},"78":{"tf":1.0},"8":{"tf":1.4142135623730951},"86":{"tf":1.0},"91":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.4142135623730951},"95":{"tf":1.0},"98":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}},"s":{"/":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"d":{"b":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.0},"29":{"tf":1.0}}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"_":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"{":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"130":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"a":{"d":{"a":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":2,"docs":{"131":{"tf":1.0},"135":{"tf":1.0}}}},"df":2,"docs":{"15":{"tf":2.0},"87":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"135":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"85":{"tf":1.0}},"o":{"df":13,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"112":{"tf":1.4142135623730951},"118":{"tf":1.7320508075688772},"119":{"tf":1.0},"122":{"tf":1.0},"20":{"tf":1.0},"26":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.4142135623730951}}}}},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"122":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"118":{"tf":1.4142135623730951},"120":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"128":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"95":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":14,"docs":{"114":{"tf":1.0},"124":{"tf":2.0},"128":{"tf":1.0},"130":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.7320508075688772},"4":{"tf":1.0},"45":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"98":{"tf":1.7320508075688772}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"l":{"df":1,"docs":{"96":{"tf":1.0}},"s":{"df":0,"docs":{},"v":{"1":{".":{"2":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"d":{"a":{"df":9,"docs":{"102":{"tf":1.4142135623730951},"105":{"tf":1.0},"129":{"tf":1.0},"136":{"tf":1.0},"32":{"tf":1.0},"64":{"tf":1.0},"76":{"tf":1.0},"87":{"tf":1.4142135623730951},"96":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":14,"docs":{"105":{"tf":1.4142135623730951},"119":{"tf":1.0},"121":{"tf":1.4142135623730951},"135":{"tf":1.0},"2":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0},"51":{"tf":1.0},"60":{"tf":1.0},"88":{"tf":1.0},"90":{"tf":1.0},"98":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"126":{"tf":1.7320508075688772}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"â":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"l":{"df":2,"docs":{"72":{"tf":1.0},"78":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":3,"docs":{"109":{"tf":1.0},"74":{"tf":1.0},"98":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"94":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"i":{"df":2,"docs":{"101":{"tf":1.0},"117":{"tf":1.0}}},"l":{"df":4,"docs":{"101":{"tf":1.0},"108":{"tf":1.0},"130":{"tf":1.0},"67":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"71":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"a":{"b":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":4,"docs":{"3":{"tf":1.0},"71":{"tf":1.0},"74":{"tf":1.4142135623730951},"94":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"75":{"tf":1.0}}}},"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"96":{"tf":1.0}}}}},"z":{"df":1,"docs":{"123":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"125":{"tf":1.0},"128":{"tf":1.0},"77":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"ê":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"108":{"tf":1.4142135623730951},"55":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"123":{"tf":1.0}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"104":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"3":{"tf":1.0},"96":{"tf":1.7320508075688772}}}}}}}},"t":{"a":{"d":{"a":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"124":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"a":{"df":8,"docs":{"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"123":{"tf":1.0},"129":{"tf":1.0}}},"o":{"c":{"a":{"df":4,"docs":{"106":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"127":{"tf":1.0}},"r":{"df":2,"docs":{"96":{"tf":1.0},"97":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":3,"docs":{"128":{"tf":1.0},"79":{"tf":1.0},"84":{"tf":1.0}}},"n":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"74":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"á":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"ê":{"df":1,"docs":{"102":{"tf":1.0}}}},"u":{"d":{"df":0,"docs":{},"o":{"df":2,"docs":{"26":{"tf":1.0},"99":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"x":{"df":0,"docs":{},"t":{"df":6,"docs":{"118":{"tf":1.0},"121":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"83":{"tf":1.0}}}}},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0}}}},"p":{"df":6,"docs":{"123":{"tf":1.0},"125":{"tf":1.4142135623730951},"133":{"tf":1.0},"16":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"96":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"w":{"df":1,"docs":{"77":{"tf":1.4142135623730951}}}},"m":{"a":{"df":44,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":2.0},"100":{"tf":1.4142135623730951},"103":{"tf":1.0},"104":{"tf":1.7320508075688772},"105":{"tf":1.0},"107":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.4142135623730951},"111":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":2.23606797749979},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":2.23606797749979},"126":{"tf":1.0},"127":{"tf":1.0},"129":{"tf":1.4142135623730951},"131":{"tf":1.0},"135":{"tf":1.0},"18":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.0},"22":{"tf":1.7320508075688772},"25":{"tf":1.4142135623730951},"3":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":2.6457513110645907},"46":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"63":{"tf":1.4142135623730951},"67":{"tf":1.0},"71":{"tf":1.0},"73":{"tf":1.4142135623730951},"74":{"tf":1.7320508075688772},"90":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.0},"94":{"tf":1.0},"96":{"tf":1.0}}},"df":65,"docs":{"1":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":2.0},"105":{"tf":1.4142135623730951},"106":{"tf":1.7320508075688772},"107":{"tf":1.0},"108":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.7320508075688772},"112":{"tf":1.0},"113":{"tf":1.7320508075688772},"114":{"tf":1.0},"115":{"tf":1.0},"117":{"tf":1.7320508075688772},"120":{"tf":1.7320508075688772},"121":{"tf":2.0},"123":{"tf":2.449489742783178},"124":{"tf":1.0},"125":{"tf":2.8284271247461903},"126":{"tf":2.23606797749979},"127":{"tf":1.0},"128":{"tf":1.4142135623730951},"129":{"tf":1.0},"133":{"tf":2.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"20":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":2.23606797749979},"45":{"tf":1.7320508075688772},"54":{"tf":1.0},"55":{"tf":1.0},"56":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"70":{"tf":2.0},"71":{"tf":1.4142135623730951},"72":{"tf":1.4142135623730951},"73":{"tf":1.7320508075688772},"74":{"tf":2.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.4142135623730951},"78":{"tf":1.0},"82":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"90":{"tf":1.0},"92":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"94":{"tf":2.8284271247461903},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.4142135623730951},"98":{"tf":1.0}}},"n":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"74":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":2,"docs":{"104":{"tf":1.0},"133":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"95":{"tf":1.0}}}}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"124":{"tf":1.0}}}}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"135":{"tf":1.0}}},"s":{"a":{"d":{"a":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":4,"docs":{"26":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"92":{"tf":1.0}}}},"df":13,"docs":{"101":{"tf":1.0},"102":{"tf":1.0},"106":{"tf":1.0},"111":{"tf":1.0},"116":{"tf":1.0},"132":{"tf":1.0},"16":{"tf":1.0},"72":{"tf":1.0},"75":{"tf":1.0},"78":{"tf":1.0},"8":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.4142135623730951}},"g":{"df":1,"docs":{"11":{"tf":1.0}}},"m":{"df":2,"docs":{"126":{"tf":1.0},"90":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"o":{"df":4,"docs":{"110":{"tf":1.4142135623730951},"111":{"tf":1.0},"15":{"tf":1.0},"95":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":4,"docs":{"113":{"tf":1.0},"136":{"tf":1.0},"91":{"tf":1.0},"99":{"tf":1.0}}}},"df":4,"docs":{"24":{"tf":1.0},"8":{"tf":1.0},"87":{"tf":1.0},"89":{"tf":1.0}},"o":{"df":7,"docs":{"28":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"47":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"57":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951},"65":{"tf":1.4142135623730951}}},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"74":{"tf":1.0},"90":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":4,"docs":{"1":{"tf":1.0},"38":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"124":{"tf":1.0},"131":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"v":{"1":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"60":{"tf":1.0}}}}}}},"df":1,"docs":{"118":{"tf":1.0}}},"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"112":{"tf":1.4142135623730951}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"124":{"tf":1.0}}},"i":{"d":{"a":{"d":{"df":1,"docs":{"50":{"tf":1.0}}},"df":2,"docs":{"103":{"tf":1.0},"119":{"tf":1.0}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"60":{"tf":1.0}}}}}},"df":4,"docs":{"120":{"tf":1.0},"24":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"37":{"tf":1.0},"72":{"tf":1.0},"78":{"tf":1.0},"90":{"tf":1.0}}}}},"r":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"73":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"75":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"69":{"tf":1.4142135623730951}}}}}},"df":2,"docs":{"133":{"tf":1.0},"136":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"125":{"tf":1.0}}}},"j":{"a":{"df":4,"docs":{"136":{"tf":1.0},"21":{"tf":1.0},"72":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"m":{"df":1,"docs":{"1":{"tf":1.0}}},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"103":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"113":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"11":{"tf":1.0},"120":{"tf":1.0},"135":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":4,"docs":{"18":{"tf":1.0},"24":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0}},"i":{"c":{"a":{"d":{"a":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"50":{"tf":1.4142135623730951}}}},"df":5,"docs":{"105":{"tf":1.4142135623730951},"106":{"tf":1.0},"119":{"tf":1.0},"125":{"tf":1.4142135623730951},"50":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"100":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":7,"docs":{"10":{"tf":1.0},"11":{"tf":1.4142135623730951},"113":{"tf":1.0},"135":{"tf":1.0},"24":{"tf":1.7320508075688772},"46":{"tf":1.0},"97":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":7,"docs":{"104":{"tf":1.4142135623730951},"121":{"tf":1.0},"3":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951},"55":{"tf":1.0}}}},"õ":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{}},"df":12,"docs":{"11":{"tf":1.4142135623730951},"24":{"tf":1.0},"46":{"tf":1.7320508075688772},"47":{"tf":1.4142135623730951},"48":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"55":{"tf":1.0}},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"55":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"122":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"120":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"7":{"tf":1.0}}}},"õ":{"df":1,"docs":{"122":{"tf":1.0}}}}},"z":{"df":1,"docs":{"104":{"tf":1.0}}}},"i":{"a":{"df":7,"docs":{"3":{"tf":1.0},"7":{"tf":1.0},"75":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"98":{"tf":1.0}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":1,"docs":{"112":{"tf":1.0}},"r":{"df":1,"docs":{"87":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"102":{"tf":1.0}}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":5,"docs":{"109":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"44":{"tf":1.4142135623730951},"67":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"df":5,"docs":{"23":{"tf":1.0},"37":{"tf":1.0},"42":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"21":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"97":{"tf":1.0}}}}},"o":{"c":{"df":20,"docs":{"10":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"106":{"tf":1.7320508075688772},"11":{"tf":1.0},"110":{"tf":1.0},"112":{"tf":1.0},"113":{"tf":1.7320508075688772},"116":{"tf":1.4142135623730951},"12":{"tf":1.0},"121":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"29":{"tf":1.0},"33":{"tf":1.0},"44":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":7,"docs":{"123":{"tf":1.0},"129":{"tf":1.0},"135":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"77":{"tf":1.0},"91":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"125":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"á":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"df":2,"docs":{"24":{"tf":1.0},"51":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"105":{"tf":1.0}}}},"df":0,"docs":{}}}},"í":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"w":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"df":1,"docs":{"98":{"tf":1.0}}}},"v":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"60":{"tf":1.0}}}}}},"df":5,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"df":2,"docs":{"123":{"tf":1.0},"98":{"tf":1.0}},"m":{"df":3,"docs":{"1":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"i":{"df":2,"docs":{"127":{"tf":1.0},"96":{"tf":1.0}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"89":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"x":{"2":{"5":{"5":{"1":{"9":{"df":3,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"14":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"g":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"93":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"95":{"tf":2.23606797749979}}}}},"y":{"df":1,"docs":{"93":{"tf":1.0}}},"z":{"df":1,"docs":{"93":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":4,"docs":{"122":{"tf":1.0},"127":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}}}}}},"title":{"root":{"1":{"df":1,"docs":{"19":{"tf":1.0}}},"2":{"df":1,"docs":{"20":{"tf":1.0}}},"3":{"df":1,"docs":{"21":{"tf":1.0}}},"4":{"df":2,"docs":{"22":{"tf":1.0},"3":{"tf":1.0}}},"5":{"df":1,"docs":{"23":{"tf":1.0}}},"6":{"df":1,"docs":{"24":{"tf":1.0}}},"7":{"df":1,"docs":{"25":{"tf":1.0}}},"8":{"df":1,"docs":{"26":{"tf":1.0}}},"a":{"a":{"d":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":2,"docs":{"13":{"tf":1.0},"15":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":3,"docs":{"36":{"tf":1.0},"48":{"tf":1.0},"58":{"tf":1.0}}}}}}}}},"m":{"a":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"93":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":2,"docs":{"20":{"tf":1.0},"38":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"i":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"62":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"12":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"69":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"53":{"tf":1.0}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"83":{"tf":1.0},"88":{"tf":1.0},"97":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"c":{"a":{"df":0,"docs":{},"m":{"a":{"d":{"a":{"df":1,"docs":{"102":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"í":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"a":{"df":1,"docs":{"62":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":2,"docs":{"55":{"tf":1.0},"63":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":4,"docs":{"111":{"tf":1.0},"114":{"tf":1.0},"116":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"101":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"72":{"tf":1.0}}}},"df":0,"docs":{}}},"df":5,"docs":{"135":{"tf":1.0},"21":{"tf":1.0},"42":{"tf":1.0},"54":{"tf":1.0},"88":{"tf":1.0}},"o":{"df":5,"docs":{"103":{"tf":1.0},"110":{"tf":1.0},"117":{"tf":1.0},"134":{"tf":1.0},"92":{"tf":1.0}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"15":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}},"o":{"df":1,"docs":{"79":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"89":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"135":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"4":{"tf":1.0},"91":{"tf":1.0}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":4,"docs":{"128":{"tf":1.0},"136":{"tf":1.0},"78":{"tf":1.0},"90":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"õ":{"df":1,"docs":{"121":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":3,"docs":{"22":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"109":{"tf":1.0},"110":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"á":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"113":{"tf":1.0}}},"df":0,"docs":{}}}}}},"ó":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":2,"docs":{"10":{"tf":1.0},"51":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}}},"d":{"a":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"112":{"tf":1.0},"32":{"tf":1.0},"69":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"71":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":32,"docs":{"101":{"tf":1.0},"102":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"107":{"tf":1.0},"111":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"127":{"tf":1.0},"16":{"tf":1.0},"32":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0},"69":{"tf":1.0},"72":{"tf":1.4142135623730951},"89":{"tf":1.0},"91":{"tf":1.0},"94":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0}},"s":{"c":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"29":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"115":{"tf":1.0},"122":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"76":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"t":{"df":2,"docs":{"82":{"tf":1.0},"93":{"tf":1.0}}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"95":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"103":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"131":{"tf":1.0},"135":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":4,"docs":{"109":{"tf":1.0},"114":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}},"m":{"df":1,"docs":{"87":{"tf":1.0}}},"n":{"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"92":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"s":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"87":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"60":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"x":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":3,"docs":{"133":{"tf":1.0},"134":{"tf":1.0},"70":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":6,"docs":{"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"68":{"tf":1.0},"73":{"tf":1.0},"79":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":1,"docs":{"56":{"tf":1.0}}}}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"l":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"77":{"tf":1.0}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"14":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"38":{"tf":1.0}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"102":{"tf":1.0}}}}}},"df":0,"docs":{},"o":{"df":4,"docs":{"104":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":3,"docs":{"103":{"tf":1.0},"110":{"tf":1.0},"117":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"116":{"tf":1.0},"118":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"125":{"tf":1.0}}}}},"í":{"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":3,"docs":{"19":{"tf":1.0},"74":{"tf":1.0},"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"132":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"100":{"tf":1.0}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"ê":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"39":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"71":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"120":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"11":{"tf":1.0},"5":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":1,"docs":{"43":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"í":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"v":{"6":{"_":{"df":0,"docs":{},"v":{"6":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"89":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":1,"docs":{"72":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":1,"docs":{"64":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"75":{"tf":1.0}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"105":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"ó":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"39":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"a":{"d":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"c":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"127":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"90":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"129":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"43":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"135":{"tf":1.0}}}}}},"á":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"107":{"tf":1.0}}}}}}}},"n":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"123":{"tf":1.0},"124":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"84":{"tf":1.0}}}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"81":{"tf":1.0}}}},"df":1,"docs":{"92":{"tf":1.0}}},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"43":{"tf":1.0}}}},"í":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"44":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"85":{"tf":1.0}}}}}}},"df":7,"docs":{"1":{"tf":1.0},"15":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0},"71":{"tf":1.0},"93":{"tf":1.0}},"p":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"o":{"df":1,"docs":{"72":{"tf":1.0}}}},"df":0,"docs":{},"ç":{"df":0,"docs":{},"õ":{"df":5,"docs":{"30":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0},"59":{"tf":1.0},"66":{"tf":1.0}}}}},"s":{"df":1,"docs":{"92":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"119":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"d":{"a":{"df":1,"docs":{"136":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"100":{"tf":1.0},"116":{"tf":1.0},"126":{"tf":1.0},"89":{"tf":1.0}},"t":{"a":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":4,"docs":{"14":{"tf":1.0},"21":{"tf":1.0},"41":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":1,"docs":{"62":{"tf":1.0}}}},"í":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"115":{"tf":1.0},"122":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"97":{"tf":1.0}}}}}}},"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}}},"ó":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"125":{"tf":1.0}}}},"df":0,"docs":{}}},"ó":{"df":1,"docs":{"111":{"tf":1.0}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":6,"docs":{"1":{"tf":1.0},"100":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"50":{"tf":1.0},"93":{"tf":1.0}}},"i":{"c":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}},"â":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"111":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"106":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"129":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":3,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"91":{"tf":1.0}}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"126":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"105":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":2,"docs":{"100":{"tf":1.0},"99":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":2,"docs":{"14":{"tf":1.0},"6":{"tf":1.0}}}}}}}}}},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"21":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}},"á":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}}},"s":{"a":{"df":0,"docs":{},"í":{"d":{"a":{"df":3,"docs":{"51":{"tf":1.0},"60":{"tf":1.0},"67":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"80":{"tf":1.0}}}},"df":1,"docs":{"92":{"tf":1.0}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"ç":{"a":{"df":1,"docs":{"121":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"l":{"a":{"d":{"a":{"df":2,"docs":{"109":{"tf":1.0},"113":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"134":{"tf":1.0}}}}}},"u":{"df":1,"docs":{"20":{"tf":1.0}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"a":{"df":2,"docs":{"19":{"tf":1.0},"23":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"d":{"a":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"86":{"tf":1.0}}}}}}}},"t":{"a":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"107":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":5,"docs":{"27":{"tf":1.0},"34":{"tf":1.0},"46":{"tf":1.0},"56":{"tf":1.0},"64":{"tf":1.0}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":1,"docs":{"113":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":6,"docs":{"1":{"tf":1.0},"107":{"tf":1.0},"109":{"tf":1.0},"113":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":3,"docs":{"124":{"tf":1.0},"39":{"tf":1.0},"98":{"tf":1.0}}}}},"r":{"a":{"b":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"94":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"96":{"tf":1.0}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"123":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"m":{"a":{"df":3,"docs":{"1":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":1.0}}},"df":3,"docs":{"120":{"tf":1.0},"133":{"tf":1.0},"70":{"tf":1.0}}},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"o":{"df":7,"docs":{"28":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.0},"55":{"tf":1.0},"57":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"69":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"50":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":2,"docs":{"11":{"tf":1.0},"24":{"tf":1.0}}},"ç":{"df":0,"docs":{},"ã":{"df":0,"docs":{},"o":{"df":3,"docs":{"104":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"46":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"a":{"d":{"df":1,"docs":{"44":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"21":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"95":{"tf":1.0}}}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}')); \ No newline at end of file
diff --git a/book/pt-br/searchindex-3eaa3696.js.gz b/book/pt-br/searchindex-3eaa3696.js.gz
deleted file mode 100644
index d70e1c8..0000000
--- a/book/pt-br/searchindex-3eaa3696.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/theme/custom-eff59930.css b/book/pt-br/theme/custom-eff59930.css
deleted file mode 100644
index 447e899..0000000
--- a/book/pt-br/theme/custom-eff59930.css
+++ /dev/null
@@ -1,44 +0,0 @@
-/* === Tesseras Light Theme === */
-.light {
- --bg: #faf8f5;
- --fg: #2c2c2c;
- --sidebar-bg: #1e3a5f;
- --sidebar-fg: #e2ddd5;
- --sidebar-non-existant: #8da4be;
- --sidebar-active: #d4a84b;
- --sidebar-spacer: #2a4a6f;
- --scrollbar: #3a5a7f;
- --icons: #6a8aaa;
- --icons-hover: #d4a84b;
- --links: #2a5a8f;
- --inline-code-color: #1e3a5f;
- --theme-popup-bg: #faf8f5;
- --theme-popup-border: #d4cfc8;
- --theme-hover: #f0ece6;
- --quote-bg: #f0ece6;
- --quote-border: #d4a84b;
- --warning-border: #d4a84b;
- --table-border-color: #d4cfc8;
- --table-header-bg: #f0ece6;
- --table-alternate-bg: #faf8f5;
- --searchbar-border-color: #d4cfc8;
- --searchbar-bg: #fff;
- --searchbar-fg: #2c2c2c;
- --searchbar-shadow-color: rgba(30, 58, 95, 0.1);
- --searchresults-header-fg: #1e3a5f;
- --searchresults-border-color: #d4cfc8;
- --searchresults-li-bg: #f0ece6;
- --search-mark-bg: #f5dfa0;
-}
-
-/* === Sidebar Logo === */
-#mdbook-sidebar mdbook-sidebar-scrollbox {
- top: 100px;
-}
-
-#mdbook-sidebar {
- background-image: url("../images/logo.png");
- background-repeat: no-repeat;
- background-position: center 20px;
- background-size: 60px auto;
-}
diff --git a/book/pt-br/theme/custom-eff59930.css.gz b/book/pt-br/theme/custom-eff59930.css.gz
deleted file mode 100644
index 8d79cbe..0000000
--- a/book/pt-br/theme/custom-eff59930.css.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/toc-25102ebc.js b/book/pt-br/toc-25102ebc.js
deleted file mode 100644
index 1035257..0000000
--- a/book/pt-br/toc-25102ebc.js
+++ /dev/null
@@ -1,454 +0,0 @@
-// Populate the sidebar
-//
-// This is a script, and not included directly in the page, to control the total size of the book.
-// The TOC contains an entry for each page, so if each page includes a copy of the TOC,
-// the total size of the page becomes O(n**2).
-class MDBookSidebarScrollbox extends HTMLElement {
- constructor() {
- super();
- }
- connectedCallback() {
- this.innerHTML = '<ol class="chapter"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="introduction.html">Introdução</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="installation.html"><strong aria-hidden="true">1.</strong> Instalação</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="quick-start.html"><strong aria-hidden="true">2.</strong> Início Rápido</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><span><strong aria-hidden="true">3.</strong> Comandos</span></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/init.html"><strong aria-hidden="true">3.1.</strong> init</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/create.html"><strong aria-hidden="true">3.2.</strong> create</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/verify.html"><strong aria-hidden="true">3.3.</strong> verify</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/export.html"><strong aria-hidden="true">3.4.</strong> export</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/list.html"><strong aria-hidden="true">3.5.</strong> list</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="running-a-node.html"><strong aria-hidden="true">4.</strong> Executando um No</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="configuration.html"><strong aria-hidden="true">5.</strong> Configuracao</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="network-concepts.html"><strong aria-hidden="true">6.</strong> Conceitos de Rede</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="replication.html"><strong aria-hidden="true">7.</strong> Replicação e Reparo</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="encryption.html"><strong aria-hidden="true">8.</strong> Criptografia e Tesseras Seladas</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="heir-recovery.html"><strong aria-hidden="true">9.</strong> Recuperação de Chaves por Herdeiros</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="nat-traversal.html"><strong aria-hidden="true">10.</strong> Travessia de NAT</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="docker.html"><strong aria-hidden="true">11.</strong> Docker</a></span></li></ol>';
- // Set the current, active page, and reveal it if it's hidden
- let current_page = document.location.href.toString().split('#')[0].split('?')[0];
- if (current_page.endsWith('/')) {
- current_page += 'index.html';
- }
- const links = Array.prototype.slice.call(this.querySelectorAll('a'));
- const l = links.length;
- for (let i = 0; i < l; ++i) {
- const link = links[i];
- const href = link.getAttribute('href');
- if (href && !href.startsWith('#') && !/^(?:[a-z+]+:)?\/\//.test(href)) {
- link.href = path_to_root + href;
- }
- // The 'index' page is supposed to alias the first chapter in the book.
- if (link.href === current_page
- || i === 0
- && path_to_root === ''
- && current_page.endsWith('/index.html')) {
- link.classList.add('active');
- let parent = link.parentElement;
- while (parent) {
- if (parent.tagName === 'LI' && parent.classList.contains('chapter-item')) {
- parent.classList.add('expanded');
- }
- parent = parent.parentElement;
- }
- }
- }
- // Track and set sidebar scroll position
- this.addEventListener('click', e => {
- if (e.target.tagName === 'A') {
- const clientRect = e.target.getBoundingClientRect();
- const sidebarRect = this.getBoundingClientRect();
- sessionStorage.setItem('sidebar-scroll-offset', clientRect.top - sidebarRect.top);
- }
- }, { passive: true });
- const sidebarScrollOffset = sessionStorage.getItem('sidebar-scroll-offset');
- sessionStorage.removeItem('sidebar-scroll-offset');
- if (sidebarScrollOffset !== null) {
- // preserve sidebar scroll position when navigating via links within sidebar
- const activeSection = this.querySelector('.active');
- if (activeSection) {
- const clientRect = activeSection.getBoundingClientRect();
- const sidebarRect = this.getBoundingClientRect();
- const currentOffset = clientRect.top - sidebarRect.top;
- this.scrollTop += currentOffset - parseFloat(sidebarScrollOffset);
- }
- } else {
- // scroll sidebar to current active section when navigating via
- // 'next/previous chapter' buttons
- const activeSection = document.querySelector('#mdbook-sidebar .active');
- if (activeSection) {
- activeSection.scrollIntoView({ block: 'center' });
- }
- }
- // Toggle buttons
- const sidebarAnchorToggles = document.querySelectorAll('.chapter-fold-toggle');
- function toggleSection(ev) {
- ev.currentTarget.parentElement.parentElement.classList.toggle('expanded');
- }
- Array.from(sidebarAnchorToggles).forEach(el => {
- el.addEventListener('click', toggleSection);
- });
- }
-}
-window.customElements.define('mdbook-sidebar-scrollbox', MDBookSidebarScrollbox);
-
-
-// ---------------------------------------------------------------------------
-// Support for dynamically adding headers to the sidebar.
-
-(function() {
- // This is used to detect which direction the page has scrolled since the
- // last scroll event.
- let lastKnownScrollPosition = 0;
- // This is the threshold in px from the top of the screen where it will
- // consider a header the "current" header when scrolling down.
- const defaultDownThreshold = 150;
- // Same as defaultDownThreshold, except when scrolling up.
- const defaultUpThreshold = 300;
- // The threshold is a virtual horizontal line on the screen where it
- // considers the "current" header to be above the line. The threshold is
- // modified dynamically to handle headers that are near the bottom of the
- // screen, and to slightly offset the behavior when scrolling up vs down.
- let threshold = defaultDownThreshold;
- // This is used to disable updates while scrolling. This is needed when
- // clicking the header in the sidebar, which triggers a scroll event. It
- // is somewhat finicky to detect when the scroll has finished, so this
- // uses a relatively dumb system of disabling scroll updates for a short
- // time after the click.
- let disableScroll = false;
- // Array of header elements on the page.
- let headers;
- // Array of li elements that are initially collapsed headers in the sidebar.
- // I'm not sure why eslint seems to have a false positive here.
- // eslint-disable-next-line prefer-const
- let headerToggles = [];
- // This is a debugging tool for the threshold which you can enable in the console.
- let thresholdDebug = false;
-
- // Updates the threshold based on the scroll position.
- function updateThreshold() {
- const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
- const windowHeight = window.innerHeight;
- const documentHeight = document.documentElement.scrollHeight;
-
- // The number of pixels below the viewport, at most documentHeight.
- // This is used to push the threshold down to the bottom of the page
- // as the user scrolls towards the bottom.
- const pixelsBelow = Math.max(0, documentHeight - (scrollTop + windowHeight));
- // The number of pixels above the viewport, at least defaultDownThreshold.
- // Similar to pixelsBelow, this is used to push the threshold back towards
- // the top when reaching the top of the page.
- const pixelsAbove = Math.max(0, defaultDownThreshold - scrollTop);
- // How much the threshold should be offset once it gets close to the
- // bottom of the page.
- const bottomAdd = Math.max(0, windowHeight - pixelsBelow - defaultDownThreshold);
- let adjustedBottomAdd = bottomAdd;
-
- // Adjusts bottomAdd for a small document. The calculation above
- // assumes the document is at least twice the windowheight in size. If
- // it is less than that, then bottomAdd needs to be shrunk
- // proportional to the difference in size.
- if (documentHeight < windowHeight * 2) {
- const maxPixelsBelow = documentHeight - windowHeight;
- const t = 1 - pixelsBelow / Math.max(1, maxPixelsBelow);
- const clamp = Math.max(0, Math.min(1, t));
- adjustedBottomAdd *= clamp;
- }
-
- let scrollingDown = true;
- if (scrollTop < lastKnownScrollPosition) {
- scrollingDown = false;
- }
-
- if (scrollingDown) {
- // When scrolling down, move the threshold up towards the default
- // downwards threshold position. If near the bottom of the page,
- // adjustedBottomAdd will offset the threshold towards the bottom
- // of the page.
- const amountScrolledDown = scrollTop - lastKnownScrollPosition;
- const adjustedDefault = defaultDownThreshold + adjustedBottomAdd;
- threshold = Math.max(adjustedDefault, threshold - amountScrolledDown);
- } else {
- // When scrolling up, move the threshold down towards the default
- // upwards threshold position. If near the bottom of the page,
- // quickly transition the threshold back up where it normally
- // belongs.
- const amountScrolledUp = lastKnownScrollPosition - scrollTop;
- const adjustedDefault = defaultUpThreshold - pixelsAbove
- + Math.max(0, adjustedBottomAdd - defaultDownThreshold);
- threshold = Math.min(adjustedDefault, threshold + amountScrolledUp);
- }
-
- if (documentHeight <= windowHeight) {
- threshold = 0;
- }
-
- if (thresholdDebug) {
- const id = 'mdbook-threshold-debug-data';
- let data = document.getElementById(id);
- if (data === null) {
- data = document.createElement('div');
- data.id = id;
- data.style.cssText = `
- position: fixed;
- top: 50px;
- right: 10px;
- background-color: 0xeeeeee;
- z-index: 9999;
- pointer-events: none;
- `;
- document.body.appendChild(data);
- }
- data.innerHTML = `
- <table>
- <tr><td>documentHeight</td><td>${documentHeight.toFixed(1)}</td></tr>
- <tr><td>windowHeight</td><td>${windowHeight.toFixed(1)}</td></tr>
- <tr><td>scrollTop</td><td>${scrollTop.toFixed(1)}</td></tr>
- <tr><td>pixelsAbove</td><td>${pixelsAbove.toFixed(1)}</td></tr>
- <tr><td>pixelsBelow</td><td>${pixelsBelow.toFixed(1)}</td></tr>
- <tr><td>bottomAdd</td><td>${bottomAdd.toFixed(1)}</td></tr>
- <tr><td>adjustedBottomAdd</td><td>${adjustedBottomAdd.toFixed(1)}</td></tr>
- <tr><td>scrollingDown</td><td>${scrollingDown}</td></tr>
- <tr><td>threshold</td><td>${threshold.toFixed(1)}</td></tr>
- </table>
- `;
- drawDebugLine();
- }
-
- lastKnownScrollPosition = scrollTop;
- }
-
- function drawDebugLine() {
- if (!document.body) {
- return;
- }
- const id = 'mdbook-threshold-debug-line';
- const existingLine = document.getElementById(id);
- if (existingLine) {
- existingLine.remove();
- }
- const line = document.createElement('div');
- line.id = id;
- line.style.cssText = `
- position: fixed;
- top: ${threshold}px;
- left: 0;
- width: 100vw;
- height: 2px;
- background-color: red;
- z-index: 9999;
- pointer-events: none;
- `;
- document.body.appendChild(line);
- }
-
- function mdbookEnableThresholdDebug() {
- thresholdDebug = true;
- updateThreshold();
- drawDebugLine();
- }
-
- window.mdbookEnableThresholdDebug = mdbookEnableThresholdDebug;
-
- // Updates which headers in the sidebar should be expanded. If the current
- // header is inside a collapsed group, then it, and all its parents should
- // be expanded.
- function updateHeaderExpanded(currentA) {
- // Add expanded to all header-item li ancestors.
- let current = currentA.parentElement;
- while (current) {
- if (current.tagName === 'LI' && current.classList.contains('header-item')) {
- current.classList.add('expanded');
- }
- current = current.parentElement;
- }
- }
-
- // Updates which header is marked as the "current" header in the sidebar.
- // This is done with a virtual Y threshold, where headers at or below
- // that line will be considered the current one.
- function updateCurrentHeader() {
- if (!headers || !headers.length) {
- return;
- }
-
- // Reset the classes, which will be rebuilt below.
- const els = document.getElementsByClassName('current-header');
- for (const el of els) {
- el.classList.remove('current-header');
- }
- for (const toggle of headerToggles) {
- toggle.classList.remove('expanded');
- }
-
- // Find the last header that is above the threshold.
- let lastHeader = null;
- for (const header of headers) {
- const rect = header.getBoundingClientRect();
- if (rect.top <= threshold) {
- lastHeader = header;
- } else {
- break;
- }
- }
- if (lastHeader === null) {
- lastHeader = headers[0];
- const rect = lastHeader.getBoundingClientRect();
- const windowHeight = window.innerHeight;
- if (rect.top >= windowHeight) {
- return;
- }
- }
-
- // Get the anchor in the summary.
- const href = '#' + lastHeader.id;
- const a = [...document.querySelectorAll('.header-in-summary')]
- .find(element => element.getAttribute('href') === href);
- if (!a) {
- return;
- }
-
- a.classList.add('current-header');
-
- updateHeaderExpanded(a);
- }
-
- // Updates which header is "current" based on the threshold line.
- function reloadCurrentHeader() {
- if (disableScroll) {
- return;
- }
- updateThreshold();
- updateCurrentHeader();
- }
-
-
- // When clicking on a header in the sidebar, this adjusts the threshold so
- // that it is located next to the header. This is so that header becomes
- // "current".
- function headerThresholdClick(event) {
- // See disableScroll description why this is done.
- disableScroll = true;
- setTimeout(() => {
- disableScroll = false;
- }, 100);
- // requestAnimationFrame is used to delay the update of the "current"
- // header until after the scroll is done, and the header is in the new
- // position.
- requestAnimationFrame(() => {
- requestAnimationFrame(() => {
- // Closest is needed because if it has child elements like <code>.
- const a = event.target.closest('a');
- const href = a.getAttribute('href');
- const targetId = href.substring(1);
- const targetElement = document.getElementById(targetId);
- if (targetElement) {
- threshold = targetElement.getBoundingClientRect().bottom;
- updateCurrentHeader();
- }
- });
- });
- }
-
- // Takes the nodes from the given head and copies them over to the
- // destination, along with some filtering.
- function filterHeader(source, dest) {
- const clone = source.cloneNode(true);
- clone.querySelectorAll('mark').forEach(mark => {
- mark.replaceWith(...mark.childNodes);
- });
- dest.append(...clone.childNodes);
- }
-
- // Scans page for headers and adds them to the sidebar.
- document.addEventListener('DOMContentLoaded', function() {
- const activeSection = document.querySelector('#mdbook-sidebar .active');
- if (activeSection === null) {
- return;
- }
-
- const main = document.getElementsByTagName('main')[0];
- headers = Array.from(main.querySelectorAll('h2, h3, h4, h5, h6'))
- .filter(h => h.id !== '' && h.children.length && h.children[0].tagName === 'A');
-
- if (headers.length === 0) {
- return;
- }
-
- // Build a tree of headers in the sidebar.
-
- const stack = [];
-
- const firstLevel = parseInt(headers[0].tagName.charAt(1));
- for (let i = 1; i < firstLevel; i++) {
- const ol = document.createElement('ol');
- ol.classList.add('section');
- if (stack.length > 0) {
- stack[stack.length - 1].ol.appendChild(ol);
- }
- stack.push({level: i + 1, ol: ol});
- }
-
- // The level where it will start folding deeply nested headers.
- const foldLevel = 3;
-
- for (let i = 0; i < headers.length; i++) {
- const header = headers[i];
- const level = parseInt(header.tagName.charAt(1));
-
- const currentLevel = stack[stack.length - 1].level;
- if (level > currentLevel) {
- // Begin nesting to this level.
- for (let nextLevel = currentLevel + 1; nextLevel <= level; nextLevel++) {
- const ol = document.createElement('ol');
- ol.classList.add('section');
- const last = stack[stack.length - 1];
- const lastChild = last.ol.lastChild;
- // Handle the case where jumping more than one nesting
- // level, which doesn't have a list item to place this new
- // list inside of.
- if (lastChild) {
- lastChild.appendChild(ol);
- } else {
- last.ol.appendChild(ol);
- }
- stack.push({level: nextLevel, ol: ol});
- }
- } else if (level < currentLevel) {
- while (stack.length > 1 && stack[stack.length - 1].level > level) {
- stack.pop();
- }
- }
-
- const li = document.createElement('li');
- li.classList.add('header-item');
- li.classList.add('expanded');
- if (level < foldLevel) {
- li.classList.add('expanded');
- }
- const span = document.createElement('span');
- span.classList.add('chapter-link-wrapper');
- const a = document.createElement('a');
- span.appendChild(a);
- a.href = '#' + header.id;
- a.classList.add('header-in-summary');
- filterHeader(header.children[0], a);
- a.addEventListener('click', headerThresholdClick);
- const nextHeader = headers[i + 1];
- if (nextHeader !== undefined) {
- const nextLevel = parseInt(nextHeader.tagName.charAt(1));
- if (nextLevel > level && level >= foldLevel) {
- const toggle = document.createElement('a');
- toggle.classList.add('chapter-fold-toggle');
- toggle.classList.add('header-toggle');
- toggle.addEventListener('click', () => {
- li.classList.toggle('expanded');
- });
- const toggleDiv = document.createElement('div');
- toggleDiv.textContent = '❱';
- toggle.appendChild(toggleDiv);
- span.appendChild(toggle);
- headerToggles.push(li);
- }
- }
- li.appendChild(span);
-
- const currentParent = stack[stack.length - 1];
- currentParent.ol.appendChild(li);
- }
-
- const onThisPage = document.createElement('div');
- onThisPage.classList.add('on-this-page');
- onThisPage.append(stack[0].ol);
- const activeItemSpan = activeSection.parentElement;
- activeItemSpan.after(onThisPage);
- });
-
- document.addEventListener('DOMContentLoaded', reloadCurrentHeader);
- document.addEventListener('scroll', reloadCurrentHeader, { passive: true });
-})();
-
diff --git a/book/pt-br/toc-25102ebc.js.gz b/book/pt-br/toc-25102ebc.js.gz
deleted file mode 100644
index e1813df..0000000
--- a/book/pt-br/toc-25102ebc.js.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/toc.html b/book/pt-br/toc.html
deleted file mode 100644
index 18ffc48..0000000
--- a/book/pt-br/toc.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="pt-BR" class="light" dir="ltr">
- <head>
- <!-- sidebar iframe generated using mdBook
-
- This is a frame, and not included directly in the page, to control the total size of the
- book. The TOC contains an entry for each page, so if each page includes a copy of the TOC,
- the total size of the page becomes O(n**2).
-
- The frame is only used as a fallback when JS is turned off. When it's on, the sidebar is
- instead added to the main page by `toc.js` instead. The JavaScript mode is better
- because, when running in a `file:///` URL, the iframed page would not be Same-Origin as
- the rest of the page, so the sidebar and the main page theme would fall out of sync.
- -->
- <meta charset="UTF-8">
- <meta name="robots" content="noindex">
- <!-- Custom HTML head -->
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="theme-color" content="#ffffff">
- <link rel="stylesheet" href="css/variables-8adf115d.css">
- <link rel="stylesheet" href="css/general-2459343d.css">
- <link rel="stylesheet" href="css/chrome-ae938929.css">
- <link rel="stylesheet" href="css/print-9e4910d8.css" media="print">
- <!-- Fonts -->
- <link rel="stylesheet" href="fonts/fonts-9644e21d.css">
- <!-- Custom theme stylesheets -->
- <link rel="stylesheet" href="theme/custom-eff59930.css">
- </head>
- <body class="sidebar-iframe-inner">
- <ol class="chapter"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="introduction.html" target="_parent">Introdução</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="installation.html" target="_parent"><strong aria-hidden="true">1.</strong> Instalação</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="quick-start.html" target="_parent"><strong aria-hidden="true">2.</strong> Início Rápido</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><span><strong aria-hidden="true">3.</strong> Comandos</span></span><ol class="section"><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/init.html" target="_parent"><strong aria-hidden="true">3.1.</strong> init</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/create.html" target="_parent"><strong aria-hidden="true">3.2.</strong> create</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/verify.html" target="_parent"><strong aria-hidden="true">3.3.</strong> verify</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/export.html" target="_parent"><strong aria-hidden="true">3.4.</strong> export</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="commands/list.html" target="_parent"><strong aria-hidden="true">3.5.</strong> list</a></span></li></ol><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="running-a-node.html" target="_parent"><strong aria-hidden="true">4.</strong> Executando um No</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="configuration.html" target="_parent"><strong aria-hidden="true">5.</strong> Configuracao</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="network-concepts.html" target="_parent"><strong aria-hidden="true">6.</strong> Conceitos de Rede</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="replication.html" target="_parent"><strong aria-hidden="true">7.</strong> Replicação e Reparo</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="encryption.html" target="_parent"><strong aria-hidden="true">8.</strong> Criptografia e Tesseras Seladas</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="heir-recovery.html" target="_parent"><strong aria-hidden="true">9.</strong> Recuperação de Chaves por Herdeiros</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="nat-traversal.html" target="_parent"><strong aria-hidden="true">10.</strong> Travessia de NAT</a></span></li><li class="chapter-item expanded "><span class="chapter-link-wrapper"><a href="docker.html" target="_parent"><strong aria-hidden="true">11.</strong> Docker</a></span></li></ol>
- </body>
-</html>
diff --git a/book/pt-br/toc.html.gz b/book/pt-br/toc.html.gz
deleted file mode 100644
index 58b8339..0000000
--- a/book/pt-br/toc.html.gz
+++ /dev/null
Binary files differ
diff --git a/book/pt-br/tomorrow-night-4c0ae647.css b/book/pt-br/tomorrow-night-4c0ae647.css
deleted file mode 100644
index 11752b8..0000000
--- a/book/pt-br/tomorrow-night-4c0ae647.css
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Tomorrow Night Theme */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-/* Original theme - https://github.com/chriskempson/tomorrow-theme */
-/* https://github.com/jmblog/color-themes-for-highlightjs */
-
-/* Tomorrow Comment */
-.hljs-comment {
- color: #969896;
-}
-
-/* Tomorrow Red */
-.hljs-variable,
-.hljs-attribute,
-.hljs-attr,
-.hljs-tag,
-.hljs-regexp,
-.ruby .hljs-constant,
-.xml .hljs-tag .hljs-title,
-.xml .hljs-pi,
-.xml .hljs-doctype,
-.html .hljs-doctype,
-.css .hljs-id,
-.css .hljs-class,
-.css .hljs-pseudo {
- color: #cc6666;
-}
-
-/* Tomorrow Orange */
-.hljs-number,
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-built_in,
-.hljs-literal,
-.hljs-params,
-.hljs-constant {
- color: #de935f;
-}
-
-/* Tomorrow Yellow */
-.ruby .hljs-class .hljs-title,
-.css .hljs-rule .hljs-attribute {
- color: #f0c674;
-}
-
-/* Tomorrow Green */
-.hljs-string,
-.hljs-value,
-.hljs-inheritance,
-.hljs-header,
-.hljs-name,
-.ruby .hljs-symbol,
-.xml .hljs-cdata {
- color: #b5bd68;
-}
-
-/* Tomorrow Aqua */
-.hljs-title,
-.hljs-section,
-.css .hljs-hexcolor {
- color: #8abeb7;
-}
-
-/* Tomorrow Blue */
-.hljs-function,
-.python .hljs-decorator,
-.python .hljs-title,
-.ruby .hljs-function .hljs-title,
-.ruby .hljs-title .hljs-keyword,
-.perl .hljs-sub,
-.javascript .hljs-title,
-.coffeescript .hljs-title {
- color: #81a2be;
-}
-
-/* Tomorrow Purple */
-.hljs-keyword,
-.javascript .hljs-function {
- color: #b294bb;
-}
-
-.hljs {
- display: block;
- overflow-x: auto;
- background: #1d1f21;
- color: #c5c8c6;
-}
-
-.coffeescript .javascript,
-.javascript .xml,
-.tex .hljs-formula,
-.xml .javascript,
-.xml .vbscript,
-.xml .css,
-.xml .hljs-cdata {
- opacity: 0.5;
-}
-
-.hljs-addition {
- color: #718c00;
-}
-
-.hljs-deletion {
- color: #c82829;
-}
diff --git a/book/pt-br/tomorrow-night-4c0ae647.css.gz b/book/pt-br/tomorrow-night-4c0ae647.css.gz
deleted file mode 100644
index a90784b..0000000
--- a/book/pt-br/tomorrow-night-4c0ae647.css.gz
+++ /dev/null
Binary files differ
diff --git a/contact/index.html b/contact/index.html
deleted file mode 100644
index 2362543..0000000
--- a/contact/index.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Contact — Tesseras</title>
- <meta name="description" content="Contact the Tesseras project">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="Contact">
- <meta property="og:description" content="Contact the Tesseras project">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Contact">
- <meta name="twitter:description" content="Contact the Tesseras project">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;contact&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Contact</h2>
- <h3 id="mailing-lists">Mailing Lists</h3>
-<p>The best way to reach the project is through the
-<a href="/subscriptions/">mailing lists</a>:</p>
-<ul>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-discuss">tesseras-discuss</a> — questions,
-support, general discussion</li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-devel">tesseras-devel</a> — patches and
-development</li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-announce">tesseras-announce</a> — releases
-and milestones</li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-security">tesseras-security</a> —
-vulnerability reports</li>
-</ul>
-<h3 id="irc">IRC</h3>
-<p>Join us on <a rel="external" href="https://libera.chat/">Libera.Chat</a> in the <strong>#tesseras</strong> channel
-(<a rel="external" href="https://web.libera.chat/#tesseras">webchat</a>).</p>
-<h3 id="bug-reports">Bug Reports</h3>
-<p>File bug reports and feature requests on the
-<a rel="external" href="https://todo.sr.ht/~ijanc/tesseras">ticket tracker</a>.</p>
-<h3 id="source-code">Source Code</h3>
-<ul>
-<li><a rel="external" href="https://git.sr.ht/~ijanc/tesseras">SourceHut</a> (primary)</li>
-<li><a rel="external" href="https://github.com/ijanc/tesseras">GitHub</a> (mirror)</li>
-</ul>
-<h3 id="resources">Resources</h3>
-<ul>
-<li><a rel="external" href="https://tesseras.net/book/en/">Book</a> — user documentation (coming soon)</li>
-<li><a href="/atom.xml">Atom feed</a> — project news</li>
-<li><a rel="external" href="https://sr.ht/~ijanc/tesseras/feed.rss">SourceHut feed</a> — commits, tickets,
-and mailing list activity</li>
-</ul>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/contact/index.html.gz b/contact/index.html.gz
deleted file mode 100644
index c4c67e7..0000000
--- a/contact/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/faq/index.html b/faq/index.html
deleted file mode 100644
index eca3ad6..0000000
--- a/faq/index.html
+++ /dev/null
@@ -1,120 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>FAQ — Tesseras</title>
- <meta name="description" content="Frequently asked questions about Tesseras">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="FAQ">
- <meta property="og:description" content="Frequently asked questions about Tesseras">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="FAQ">
- <meta name="twitter:description" content="Frequently asked questions about Tesseras">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;faq&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>FAQ</h2>
- <h3 id="what-is-a-tessera">What is a tessera?</h3>
-<p>A tessera is a self-contained time capsule of memories — photos, audio
-recordings, video, and text — packaged in a format designed to survive
-independently of any software, company, or infrastructure. The name comes from
-the small tiles used in Roman mosaics: each piece is simple, but together they
-form something that endures.</p>
-<h3 id="how-does-my-data-survive-if-my-computer-dies">How does my data survive if my computer dies?</h3>
-<p>Your tessera is replicated across multiple nodes in the Tesseras peer-to-peer
-network. It uses erasure coding (Reed-Solomon) to split your data into redundant
-fragments. Even if several nodes go offline permanently, your tessera can be
-reconstructed from the remaining fragments.</p>
-<h3 id="is-my-data-encrypted">Is my data encrypted?</h3>
-<p>By default, no. Tesseras prioritizes availability over secrecy — the goal is
-that your memories survive, even if the software to decrypt them doesn't. You
-can mark individual memories as private (encrypted with AES-256-GCM) or sealed
-(to be opened after a specific date), but public and circle-visibility memories
-are stored unencrypted to maximize their chances of long-term survival.</p>
-<h3 id="do-i-need-to-pay-anything">Do I need to pay anything?</h3>
-<p>No. The network runs on mutual aid: you store fragments of other people's
-tesseras, and they store yours. There are no tokens, no blockchain, no
-subscription fees. The only cost is the storage space you contribute to the
-network.</p>
-<h3 id="what-platforms-does-it-run-on">What platforms does it run on?</h3>
-<p>Tesseras runs on Linux, macOS, FreeBSD, OpenBSD, Windows, Android, and iOS.
-There's also a browser-based viewer and support for low-power IoT devices
-(ESP32) as passive storage nodes.</p>
-<h3 id="how-is-this-different-from-ipfs-filecoin-or-arweave">How is this different from IPFS, Filecoin, or Arweave?</h3>
-<p>Tesseras is designed specifically for personal memory preservation, not
-general-purpose file storage. Key differences:</p>
-<ul>
-<li><strong>No cryptocurrency or tokens</strong> — incentives are based on bilateral
-reciprocity, not financial markets</li>
-<li><strong>Self-describing format</strong> — each tessera includes instructions for decoding
-itself in multiple languages, so it can be understood centuries from now
-without any special software</li>
-<li><strong>Availability over secrecy</strong> — most data is stored unencrypted to maximize
-long-term survival</li>
-<li><strong>Simplest possible media formats</strong> — JPEG, WAV, WebM, plain text — chosen for
-durability, not features</li>
-</ul>
-<h3 id="what-media-formats-are-supported">What media formats are supported?</h3>
-<ul>
-<li><strong>Photos:</strong> JPEG</li>
-<li><strong>Audio:</strong> WAV PCM</li>
-<li><strong>Video:</strong> WebM</li>
-<li><strong>Text:</strong> UTF-8 plain text</li>
-</ul>
-<p>These formats were chosen for maximum longevity and widespread support.</p>
-<h3 id="can-i-export-my-tessera">Can I export my tessera?</h3>
-<p>Yes. A tessera is a standard directory of files. You can copy it to a USB drive,
-burn it to optical media, or print the text portions. The format is designed to
-be readable without any special software.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/faq/index.html.gz b/faq/index.html.gz
deleted file mode 100644
index 9ada38b..0000000
--- a/faq/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/images/favicon.png b/images/favicon.png
deleted file mode 100644
index 1fb9efa..0000000
--- a/images/favicon.png
+++ /dev/null
Binary files differ
diff --git a/images/logo-128.png b/images/logo-128.png
deleted file mode 100644
index 83c4012..0000000
--- a/images/logo-128.png
+++ /dev/null
Binary files differ
diff --git a/images/logo-64.png b/images/logo-64.png
deleted file mode 100644
index 72b0b3b..0000000
--- a/images/logo-64.png
+++ /dev/null
Binary files differ
diff --git a/images/social.jpg b/images/social.jpg
deleted file mode 100644
index 9762473..0000000
--- a/images/social.jpg
+++ /dev/null
Binary files differ
diff --git a/index.html.gz b/index.html.gz
deleted file mode 100644
index a466bde..0000000
--- a/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/atom.xml b/news/atom.xml
deleted file mode 100644
index 660ecac..0000000
--- a/news/atom.xml
+++ /dev/null
@@ -1,1991 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
- <title>Tesseras - News</title>
- <subtitle>P2P network for preserving human memories across millennia</subtitle>
- <link rel="self" type="application/atom+xml" href="https://tesseras.net/news/atom.xml"/>
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/"/>
- <generator uri="https://www.getzola.org/">Zola</generator>
- <updated>2026-02-16T10:00:00+00:00</updated>
- <id>https://tesseras.net/news/atom.xml</id>
- <entry xml:lang="en">
- <title>Packaging Tesseras for Debian</title>
- <published>2026-02-16T10:00:00+00:00</published>
- <updated>2026-02-16T10:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/packaging-debian/"/>
- <id>https://tesseras.net/news/packaging-debian/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/packaging-debian/">&lt;p&gt;Tesseras now ships a &lt;code&gt;.deb&lt;&#x2F;code&gt; package for Debian and Ubuntu. This post walks
-through building and installing the package from source using &lt;code&gt;cargo-deb&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;&#x2F;h2&gt;
-&lt;p&gt;You need a working Rust toolchain and the required system libraries:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo apt install build-essential pkg-config libsqlite3-dev
-rustup toolchain install stable
-cargo install cargo-deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;building&quot;&gt;Building&lt;&#x2F;h2&gt;
-&lt;p&gt;Clone the repository and run the &lt;code&gt;just deb&lt;&#x2F;code&gt; recipe:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git clone https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras
-cd tesseras
-just deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;This recipe does three things:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Compiles&lt;&#x2F;strong&gt; &lt;code&gt;tesd&lt;&#x2F;code&gt; (the daemon) and &lt;code&gt;tes&lt;&#x2F;code&gt; (the CLI) in release mode with
-&lt;code&gt;cargo build --release&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Generates shell completions&lt;&#x2F;strong&gt; for bash, zsh, and fish from the &lt;code&gt;tes&lt;&#x2F;code&gt; binary&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Packages&lt;&#x2F;strong&gt; everything into a &lt;code&gt;.deb&lt;&#x2F;code&gt; file with
-&lt;code&gt;cargo deb -p tesseras-daemon --no-build&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;The result is a &lt;code&gt;.deb&lt;&#x2F;code&gt; file in &lt;code&gt;target&#x2F;debian&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;installing&quot;&gt;Installing&lt;&#x2F;h2&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo dpkg -i target&#x2F;debian&#x2F;tesseras-daemon_*.deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;If there are missing dependencies, fix them with:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo apt install -f
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;post-install-setup&quot;&gt;Post-install setup&lt;&#x2F;h2&gt;
-&lt;p&gt;The &lt;code&gt;postinst&lt;&#x2F;code&gt; script automatically creates a &lt;code&gt;tesseras&lt;&#x2F;code&gt; system user and the
-data directory &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;. To use the CLI without sudo, add yourself to
-the group:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo usermod -aG tesseras $USER
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Log out and back in, then start the daemon:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo systemctl enable --now tesd
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;what-the-package-includes&quot;&gt;What the package includes&lt;&#x2F;h2&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Path&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tesd&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Full node daemon&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tes&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;CLI client&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;etc&#x2F;tesseras&#x2F;config.toml&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Default configuration (marked as conffile)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;lib&#x2F;systemd&#x2F;system&#x2F;tesd.service&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Systemd unit with security hardening&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Shell completions&lt;&#x2F;td&gt;&lt;td&gt;bash, zsh, and fish&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;h2 id=&quot;how-cargo-deb-works&quot;&gt;How cargo-deb works&lt;&#x2F;h2&gt;
-&lt;p&gt;The packaging metadata lives in &lt;code&gt;crates&#x2F;tesseras-daemon&#x2F;Cargo.toml&lt;&#x2F;code&gt; under
-&lt;code&gt;[package.metadata.deb]&lt;&#x2F;code&gt;. This section defines:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;depends&lt;&#x2F;strong&gt; — runtime dependencies: &lt;code&gt;libc6&lt;&#x2F;code&gt; and &lt;code&gt;libsqlite3-0&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;assets&lt;&#x2F;strong&gt; — files to include in the package (binaries, config, systemd unit,
-shell completions)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;conf-files&lt;&#x2F;strong&gt; — files treated as configuration (preserved on upgrade)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;maintainer-scripts&lt;&#x2F;strong&gt; — &lt;code&gt;postinst&lt;&#x2F;code&gt; and &lt;code&gt;postrm&lt;&#x2F;code&gt; scripts in
-&lt;code&gt;packaging&#x2F;debian&#x2F;scripts&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;systemd-units&lt;&#x2F;strong&gt; — automatic systemd integration&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;The &lt;code&gt;postinst&lt;&#x2F;code&gt; script creates the &lt;code&gt;tesseras&lt;&#x2F;code&gt; system user and data directory on
-install. The &lt;code&gt;postrm&lt;&#x2F;code&gt; script cleans up the user, group, and data directory only
-on &lt;code&gt;purge&lt;&#x2F;code&gt; (not on simple removal).&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;systemd-hardening&quot;&gt;Systemd hardening&lt;&#x2F;h2&gt;
-&lt;p&gt;The &lt;code&gt;tesd.service&lt;&#x2F;code&gt; unit includes security hardening directives:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;ini&quot;&gt;NoNewPrivileges=true
-ProtectSystem=strict
-ProtectHome=true
-ReadWritePaths=&#x2F;var&#x2F;lib&#x2F;tesseras
-PrivateTmp=true
-PrivateDevices=true
-ProtectKernelTunables=true
-ProtectControlGroups=true
-RestrictSUIDSGID=true
-MemoryDenyWriteExecute=true
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;The daemon runs as the unprivileged &lt;code&gt;tesseras&lt;&#x2F;code&gt; user and can only write to
-&lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;deploying-to-a-remote-server&quot;&gt;Deploying to a remote server&lt;&#x2F;h2&gt;
-&lt;p&gt;The justfile includes a &lt;code&gt;deploy&lt;&#x2F;code&gt; recipe for pushing the &lt;code&gt;.deb&lt;&#x2F;code&gt; to a remote host:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;just deploy bootstrap1.tesseras.net
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;This builds the &lt;code&gt;.deb&lt;&#x2F;code&gt;, copies it via &lt;code&gt;scp&lt;&#x2F;code&gt;, installs it with &lt;code&gt;dpkg -i&lt;&#x2F;code&gt;, and
-restarts the &lt;code&gt;tesd&lt;&#x2F;code&gt; service.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;
-&lt;p&gt;After pulling new changes, simply run &lt;code&gt;just deb&lt;&#x2F;code&gt; again and reinstall:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git pull
-just deb
-sudo dpkg -i target&#x2F;debian&#x2F;tesseras-daemon_*.deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Packaging Tesseras for Arch Linux</title>
- <published>2026-02-16T09:00:00+00:00</published>
- <updated>2026-02-16T09:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/packaging-archlinux/"/>
- <id>https://tesseras.net/news/packaging-archlinux/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/packaging-archlinux/">&lt;p&gt;Tesseras now ships a PKGBUILD for Arch Linux. This post walks through building
-and installing the package from source.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;&#x2F;h2&gt;
-&lt;p&gt;You need a working Rust toolchain and the base-devel group:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo pacman -S --needed base-devel sqlite
-rustup toolchain install stable
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;building&quot;&gt;Building&lt;&#x2F;h2&gt;
-&lt;p&gt;Clone the repository and run the &lt;code&gt;just arch&lt;&#x2F;code&gt; recipe:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git clone https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras
-cd tesseras
-just arch
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;This runs &lt;code&gt;makepkg -sf&lt;&#x2F;code&gt; inside &lt;code&gt;packaging&#x2F;archlinux&#x2F;&lt;&#x2F;code&gt;, which:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;prepare&lt;&#x2F;strong&gt; — fetches Cargo dependencies with &lt;code&gt;cargo fetch --locked&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;build&lt;&#x2F;strong&gt; — compiles &lt;code&gt;tesd&lt;&#x2F;code&gt; and &lt;code&gt;tes&lt;&#x2F;code&gt; (the CLI) in release mode&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;package&lt;&#x2F;strong&gt; — installs binaries, systemd service, sysusers&#x2F;tmpfiles configs,
-shell completions (bash, zsh, fish), and a default config file&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;The result is a &lt;code&gt;.pkg.tar.zst&lt;&#x2F;code&gt; file in &lt;code&gt;packaging&#x2F;archlinux&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;installing&quot;&gt;Installing&lt;&#x2F;h2&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo pacman -U packaging&#x2F;archlinux&#x2F;tesseras-*.pkg.tar.zst
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;post-install-setup&quot;&gt;Post-install setup&lt;&#x2F;h2&gt;
-&lt;p&gt;The package creates a &lt;code&gt;tesseras&lt;&#x2F;code&gt; system user and group automatically via
-systemd-sysusers. To use the CLI without sudo, add yourself to the group:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo usermod -aG tesseras $USER
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Log out and back in, then start the daemon:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo systemctl enable --now tesd
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;what-the-package-includes&quot;&gt;What the package includes&lt;&#x2F;h2&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Path&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tesd&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Full node daemon&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tes&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;CLI client&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;etc&#x2F;tesseras&#x2F;config.toml&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Default configuration (marked as backup)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;systemd&#x2F;system&#x2F;tesd.service&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Systemd unit with security hardening&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;sysusers.d&#x2F;tesseras.conf&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;System user definition&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;tmpfiles.d&#x2F;tesseras.conf&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Data directory &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Shell completions&lt;&#x2F;td&gt;&lt;td&gt;bash, zsh, and fish&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;h2 id=&quot;pkgbuild-details&quot;&gt;PKGBUILD details&lt;&#x2F;h2&gt;
-&lt;p&gt;The PKGBUILD builds directly from the local git checkout rather than downloading
-a source tarball. The &lt;code&gt;TESSERAS_ROOT&lt;&#x2F;code&gt; environment variable points makepkg to the
-workspace root. Cargo&#x27;s target directory is set to &lt;code&gt;$srcdir&#x2F;target&lt;&#x2F;code&gt; to keep
-build artifacts inside the makepkg sandbox.&lt;&#x2F;p&gt;
-&lt;p&gt;The package depends only on &lt;code&gt;sqlite&lt;&#x2F;code&gt; at runtime and &lt;code&gt;cargo&lt;&#x2F;code&gt; at build time.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;updating&quot;&gt;Updating&lt;&#x2F;h2&gt;
-&lt;p&gt;After pulling new changes, simply run &lt;code&gt;just arch&lt;&#x2F;code&gt; again and reinstall:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git pull
-just arch
-sudo pacman -U packaging&#x2F;archlinux&#x2F;tesseras-*.pkg.tar.zst
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Storage Deduplication</title>
- <published>2026-02-15T23:00:00+00:00</published>
- <updated>2026-02-15T23:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-storage-deduplication/"/>
- <id>https://tesseras.net/news/phase4-storage-deduplication/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-storage-deduplication/">&lt;p&gt;When multiple tesseras share the same photo, the same audio clip, or the same
-fragment data, the old storage layer kept separate copies of each. On a node
-storing thousands of tesseras for the network, this duplication adds up fast.
-Phase 4 continues with storage deduplication: a content-addressable store (CAS)
-that ensures every unique piece of data is stored exactly once on disk,
-regardless of how many tesseras reference it.&lt;&#x2F;p&gt;
-&lt;p&gt;The design is simple and proven: hash the content with BLAKE3, use the hash as
-the filename, and maintain a reference count in SQLite. When two tesseras
-include the same 5 MB photo, one file exists on disk with a refcount of 2. When
-one tessera is deleted, the refcount drops to 1 and the file stays. When the
-last reference is released, a periodic sweep cleans up the orphan.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;CAS schema migration&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;migrations&#x2F;004_dedup.sql&lt;&#x2F;code&gt;) — Three
-new tables:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;cas_objects&lt;&#x2F;code&gt; — tracks every object in the store: BLAKE3 hash (primary key),
-byte size, reference count, and creation timestamp&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;blob_refs&lt;&#x2F;code&gt; — maps logical blob identifiers (tessera hash + memory hash +
-filename) to CAS hashes, replacing the old filesystem path convention&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;fragment_refs&lt;&#x2F;code&gt; — maps logical fragment identifiers (tessera hash + fragment
-index) to CAS hashes, replacing the old &lt;code&gt;fragments&#x2F;&lt;&#x2F;code&gt; directory layout&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Indexes on the hash columns ensure O(1) lookups during reads and reference
-counting.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CasStore&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;cas.rs&lt;&#x2F;code&gt;) — The core content-addressable
-storage engine. Files are stored under a two-level prefix directory:
-&lt;code&gt;&amp;lt;root&amp;gt;&#x2F;&amp;lt;2-char-hex-prefix&amp;gt;&#x2F;&amp;lt;full-hash&amp;gt;.blob&lt;&#x2F;code&gt;. The store provides five
-operations:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;put(hash, data)&lt;&#x2F;code&gt; — writes data to disk if not already present, increments
-refcount. Returns whether a dedup hit occurred.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;get(hash)&lt;&#x2F;code&gt; — reads data from disk by hash&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;release(hash)&lt;&#x2F;code&gt; — decrements refcount. If it reaches zero, the on-disk file is
-deleted immediately.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;contains(hash)&lt;&#x2F;code&gt; — checks existence without reading&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;ref_count(hash)&lt;&#x2F;code&gt; — returns the current reference count&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;All operations are atomic within a single SQLite transaction. The refcount is
-the source of truth — if the refcount says the object exists, the file must be
-on disk.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CAS-backed FsBlobStore&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;blob.rs&lt;&#x2F;code&gt;) — Rewritten to
-delegate all storage to the CAS. When a blob is written, its BLAKE3 hash is
-computed and passed to &lt;code&gt;cas.put()&lt;&#x2F;code&gt;. A row in &lt;code&gt;blob_refs&lt;&#x2F;code&gt; maps the logical path
-(tessera + memory + filename) to the CAS hash. Reads look up the CAS hash via
-&lt;code&gt;blob_refs&lt;&#x2F;code&gt; and fetch from &lt;code&gt;cas.get()&lt;&#x2F;code&gt;. Deleting a tessera releases all its blob
-references in a single transaction.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CAS-backed FsFragmentStore&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;fragment.rs&lt;&#x2F;code&gt;) — Same
-pattern for erasure-coded fragments. Each fragment&#x27;s BLAKE3 checksum is already
-computed during Reed-Solomon encoding, so it&#x27;s used directly as the CAS key.
-Fragment verification now checks the CAS hash instead of recomputing from
-scratch — if the CAS says the data is intact, it is.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Sweep garbage collector&lt;&#x2F;strong&gt; (&lt;code&gt;cas.rs:sweep()&lt;&#x2F;code&gt;) — A periodic GC pass that handles
-three edge cases the normal refcount path can&#x27;t:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Orphan files&lt;&#x2F;strong&gt; — files on disk with no corresponding row in &lt;code&gt;cas_objects&lt;&#x2F;code&gt;.
-Can happen after a crash mid-write. Files younger than 1 hour are skipped
-(grace period for in-flight writes); older orphans are deleted.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Leaked refcounts&lt;&#x2F;strong&gt; — rows in &lt;code&gt;cas_objects&lt;&#x2F;code&gt; with refcount zero that weren&#x27;t
-cleaned up (e.g., if the process died between decrementing and deleting).
-These rows are removed.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Idempotent&lt;&#x2F;strong&gt; — running sweep twice produces the same result.&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;The sweep is wired into the existing repair loop in &lt;code&gt;tesseras-replication&lt;&#x2F;code&gt;, so
-it runs automatically every 24 hours alongside fragment health checks.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Migration from old layout&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;migration.rs&lt;&#x2F;code&gt;) — A
-copy-first migration strategy that moves data from the old directory-based
-layout (&lt;code&gt;blobs&#x2F;&amp;lt;tessera&amp;gt;&#x2F;&amp;lt;memory&amp;gt;&#x2F;&amp;lt;file&amp;gt;&lt;&#x2F;code&gt; and
-&lt;code&gt;fragments&#x2F;&amp;lt;tessera&amp;gt;&#x2F;&amp;lt;index&amp;gt;.shard&lt;&#x2F;code&gt;) into the CAS. The migration:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;Checks the storage version in &lt;code&gt;storage_meta&lt;&#x2F;code&gt; (version 1 = old layout, version
-2 = CAS)&lt;&#x2F;li&gt;
-&lt;li&gt;Walks the old &lt;code&gt;blobs&#x2F;&lt;&#x2F;code&gt; and &lt;code&gt;fragments&#x2F;&lt;&#x2F;code&gt; directories&lt;&#x2F;li&gt;
-&lt;li&gt;Computes BLAKE3 hashes and inserts into CAS via &lt;code&gt;put()&lt;&#x2F;code&gt; — duplicates are
-automatically deduplicated&lt;&#x2F;li&gt;
-&lt;li&gt;Creates corresponding &lt;code&gt;blob_refs&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;fragment_refs&lt;&#x2F;code&gt; entries&lt;&#x2F;li&gt;
-&lt;li&gt;Removes old directories only after all data is safely in CAS&lt;&#x2F;li&gt;
-&lt;li&gt;Updates the storage version to 2&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;The migration runs on daemon startup, is idempotent (safe to re-run), and
-reports statistics: files migrated, duplicates found, bytes saved.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Prometheus metrics&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — Ten new metrics for
-observability:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metric&lt;&#x2F;th&gt;&lt;th&gt;Description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_objects_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Total unique objects in the CAS&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_bytes_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Total bytes stored&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_dedup_hits_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Number of writes that found an existing object&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_bytes_saved_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bytes saved by deduplication&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_refcount_deletions_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Objects deleted when refcount reached zero&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_orphans_cleaned_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Orphan files removed by sweep&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_leaked_refs_cleaned_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Leaked refcount rows cleaned&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_skipped_young_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Young orphans skipped (grace period)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_duration_seconds&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Time spent in sweep GC&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;&lt;strong&gt;Property-based tests&lt;&#x2F;strong&gt; — Two proptest tests verify CAS invariants under random
-inputs:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;refcount_matches_actual_refs&lt;&#x2F;code&gt; — after N random put&#x2F;release operations, the
-refcount always matches the actual number of outstanding references&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;cas_path_is_deterministic&lt;&#x2F;code&gt; — the same hash always produces the same
-filesystem path&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Integration test updates&lt;&#x2F;strong&gt; — All integration tests across &lt;code&gt;tesseras-core&lt;&#x2F;code&gt;,
-&lt;code&gt;tesseras-replication&lt;&#x2F;code&gt;, &lt;code&gt;tesseras-embedded&lt;&#x2F;code&gt;, and &lt;code&gt;tesseras-cli&lt;&#x2F;code&gt; updated for the
-new CAS-backed constructors. Tamper-detection tests updated to work with the CAS
-directory layout.&lt;&#x2F;p&gt;
-&lt;p&gt;347 tests pass across the workspace. Clippy clean with &lt;code&gt;-D warnings&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 as CAS key&lt;&#x2F;strong&gt;: the content hash we already compute for integrity
-verification doubles as the deduplication key. No additional hashing step —
-the hash computed during &lt;code&gt;create&lt;&#x2F;code&gt; or &lt;code&gt;replicate&lt;&#x2F;code&gt; is reused as the CAS address.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;SQLite refcount over filesystem reflinks&lt;&#x2F;strong&gt;: we considered using
-filesystem-level copy-on-write (reflinks on btrfs&#x2F;XFS), but that would tie
-Tesseras to specific filesystems. SQLite refcounting works on any filesystem,
-including FAT32 on cheap USB drives and ext4 on Raspberry Pis.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Two-level hex prefix directories&lt;&#x2F;strong&gt;: storing all CAS objects in a flat
-directory would slow down filesystems with millions of entries. The
-&lt;code&gt;&amp;lt;2-char prefix&amp;gt;&#x2F;&lt;&#x2F;code&gt; split limits any single directory to ~65k entries before a
-second prefix level is needed. This matches the approach used by Git&#x27;s object
-store.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Grace period for orphan files&lt;&#x2F;strong&gt;: the sweep GC skips files younger than 1
-hour to avoid deleting objects that are being written by a concurrent
-operation. This is a pragmatic choice — it trades a small window of potential
-orphans for crash safety without requiring fsync or two-phase commit.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Copy-first migration&lt;&#x2F;strong&gt;: the migration copies data to CAS before removing old
-directories. If the process is interrupted, the old data is still intact and
-migration can be re-run. This is slower than moving files but guarantees no
-data loss.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Sweep in repair loop&lt;&#x2F;strong&gt;: rather than adding a separate GC timer, the CAS
-sweep piggybacks on the existing 24-hour repair loop. This keeps the daemon
-simple — one background maintenance cycle handles both fragment health and
-storage cleanup.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued&lt;&#x2F;strong&gt; — security audits, OS packaging (Alpine, Arch, Debian,
-OpenBSD, FreeBSD)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration
-(FamilySearch, Ancestry), physical media export (M-DISC, microfilm, acid-free
-paper with QR), AI-assisted context&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Storage deduplication completes the storage efficiency story for Tesseras. A
-node that stores fragments for thousands of users — common for institutional
-nodes and always-on full nodes — now pays the disk cost of unique data only.
-Combined with Reed-Solomon erasure coding (which already minimizes redundancy at
-the network level), the system achieves efficient storage at both the local and
-distributed layers.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Institutional Node Onboarding</title>
- <published>2026-02-15T22:00:00+00:00</published>
- <updated>2026-02-15T22:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-institutional-onboarding/"/>
- <id>https://tesseras.net/news/phase4-institutional-onboarding/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-institutional-onboarding/">&lt;p&gt;A P2P network of individuals is fragile. Hard drives die, phones get lost,
-people lose interest. The long-term survival of humanity&#x27;s memories depends on
-institutions — libraries, archives, museums, universities — that measure their
-lifetimes in centuries. Phase 4 continues with institutional node onboarding:
-verified organizations can now pledge storage, run searchable indexes, and
-participate in the network with a distinct identity.&lt;&#x2F;p&gt;
-&lt;p&gt;The design follows a principle of trust but verify: institutions identify
-themselves via DNS TXT records (the same mechanism used by SPF, DKIM, and DMARC
-for email), pledge a storage budget, and receive reciprocity exemptions so they
-can store fragments for others without expecting anything in return. In
-exchange, the network treats their fragments as higher-quality replicas and
-limits over-reliance on any single institution through diversity constraints.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Capability bits&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;network.rs&lt;&#x2F;code&gt;) — Two new flags added to
-the &lt;code&gt;Capabilities&lt;&#x2F;code&gt; bitfield: &lt;code&gt;INSTITUTIONAL&lt;&#x2F;code&gt; (bit 7) and &lt;code&gt;SEARCH_INDEX&lt;&#x2F;code&gt; (bit 8).
-A new &lt;code&gt;institutional_default()&lt;&#x2F;code&gt; constructor returns the full Phase 2 capability
-set plus these two bits and &lt;code&gt;RELAY&lt;&#x2F;code&gt;. Normal nodes advertise &lt;code&gt;phase2_default()&lt;&#x2F;code&gt;
-which lacks institutional flags. Serialization roundtrip tests verify the new
-bits survive MessagePack encoding.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Search types&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;search.rs&lt;&#x2F;code&gt;) — Three new domain types for
-the search subsystem:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;SearchFilters&lt;&#x2F;code&gt; — query parameters: &lt;code&gt;memory_type&lt;&#x2F;code&gt;, &lt;code&gt;visibility&lt;&#x2F;code&gt;, &lt;code&gt;language&lt;&#x2F;code&gt;,
-&lt;code&gt;date_range&lt;&#x2F;code&gt;, &lt;code&gt;geo&lt;&#x2F;code&gt; (bounding box), &lt;code&gt;page&lt;&#x2F;code&gt;, &lt;code&gt;page_size&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;SearchHit&lt;&#x2F;code&gt; — a single result: content hash plus a &lt;code&gt;MetadataExcerpt&lt;&#x2F;code&gt; (title,
-description, memory type, creation date, visibility, language, tags)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;GeoFilter&lt;&#x2F;code&gt; — bounding box with &lt;code&gt;min_lat&lt;&#x2F;code&gt;, &lt;code&gt;max_lat&lt;&#x2F;code&gt;, &lt;code&gt;min_lon&lt;&#x2F;code&gt;, &lt;code&gt;max_lon&lt;&#x2F;code&gt; for
-spatial queries&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;All types derive &lt;code&gt;Serialize&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Deserialize&lt;&#x2F;code&gt; for wire transport and
-&lt;code&gt;Clone&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Debug&lt;&#x2F;code&gt; for diagnostics.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Institutional daemon config&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;) — A new &lt;code&gt;[institutional]&lt;&#x2F;code&gt;
-TOML section with &lt;code&gt;domain&lt;&#x2F;code&gt; (the DNS domain to verify), &lt;code&gt;pledge_bytes&lt;&#x2F;code&gt; (storage
-commitment in bytes), and &lt;code&gt;search_enabled&lt;&#x2F;code&gt; (toggle for the FTS5 index). The
-&lt;code&gt;to_dht_config()&lt;&#x2F;code&gt; method now sets &lt;code&gt;Capabilities::institutional_default()&lt;&#x2F;code&gt; when
-institutional config is present, so institutional nodes advertise the right
-capability bits in Pong responses.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;DNS TXT verification&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;institutional.rs&lt;&#x2F;code&gt;) — Async DNS resolution
-using &lt;code&gt;hickory-resolver&lt;&#x2F;code&gt; to verify institutional identity. The daemon looks up
-&lt;code&gt;_tesseras.&amp;lt;domain&amp;gt;&lt;&#x2F;code&gt; TXT records and parses key-value fields: &lt;code&gt;v&lt;&#x2F;code&gt; (version),
-&lt;code&gt;node&lt;&#x2F;code&gt; (hex-encoded node ID), and &lt;code&gt;pledge&lt;&#x2F;code&gt; (storage pledge in bytes).
-Verification checks:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;A TXT record exists at &lt;code&gt;_tesseras.&amp;lt;domain&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;The &lt;code&gt;node&lt;&#x2F;code&gt; field matches the daemon&#x27;s own node ID&lt;&#x2F;li&gt;
-&lt;li&gt;The &lt;code&gt;pledge&lt;&#x2F;code&gt; field is present and valid&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;On startup, the daemon attempts DNS verification. If it succeeds, the node runs
-with institutional capabilities. If it fails, the node logs a warning and
-downgrades to a normal full node — no crash, no manual intervention.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CLI setup command&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;institutional.rs&lt;&#x2F;code&gt;) — A new
-&lt;code&gt;institutional setup&lt;&#x2F;code&gt; subcommand that guides operators through onboarding:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;Reads the node&#x27;s identity from the data directory&lt;&#x2F;li&gt;
-&lt;li&gt;Prompts for domain name and pledge size&lt;&#x2F;li&gt;
-&lt;li&gt;Generates the exact DNS TXT record to add:
-&lt;code&gt;v=tesseras1 node=&amp;lt;hex&amp;gt; pledge=&amp;lt;bytes&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;Writes the institutional section to the daemon&#x27;s config file&lt;&#x2F;li&gt;
-&lt;li&gt;Prints next steps: add the TXT record, restart the daemon&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;&lt;strong&gt;SQLite search index&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&lt;&#x2F;code&gt;) — A migration
-(&lt;code&gt;003_institutional.sql&lt;&#x2F;code&gt;) that creates three structures:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;search_content&lt;&#x2F;code&gt; — an FTS5 virtual table for full-text search over tessera
-metadata (title, description, creator, tags, language)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;geo_index&lt;&#x2F;code&gt; — an R-tree virtual table for spatial bounding-box queries over
-latitude&#x2F;longitude&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;geo_map&lt;&#x2F;code&gt; — a mapping table linking R-tree row IDs to content hashes&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;The &lt;code&gt;SqliteSearchIndex&lt;&#x2F;code&gt; adapter implements the &lt;code&gt;SearchIndex&lt;&#x2F;code&gt; port trait with
-&lt;code&gt;index_tessera()&lt;&#x2F;code&gt; (insert&#x2F;update) and &lt;code&gt;search()&lt;&#x2F;code&gt; (query with filters). FTS5
-queries support natural language search; geo queries use R-tree &lt;code&gt;INTERSECT&lt;&#x2F;code&gt; for
-bounding box lookups. Results are ranked by FTS5 relevance score.&lt;&#x2F;p&gt;
-&lt;p&gt;The migration also adds an &lt;code&gt;is_institutional&lt;&#x2F;code&gt; column to the &lt;code&gt;reciprocity&lt;&#x2F;code&gt; table,
-handled idempotently via &lt;code&gt;pragma_table_info&lt;&#x2F;code&gt; checks (SQLite&#x27;s
-&lt;code&gt;ALTER TABLE ADD COLUMN&lt;&#x2F;code&gt; lacks &lt;code&gt;IF NOT EXISTS&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Reciprocity bypass&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-replication&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) — Institutional
-nodes are exempt from reciprocity checks. When &lt;code&gt;receive_fragment()&lt;&#x2F;code&gt; is called,
-if the sender&#x27;s node ID is marked as institutional in the reciprocity ledger,
-the balance check is skipped entirely. This means institutions can store
-fragments for the entire network without needing to &quot;earn&quot; credits first — their
-DNS-verified identity and storage pledge serve as their credential.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Node-type diversity constraint&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-replication&#x2F;src&#x2F;distributor.rs&lt;&#x2F;code&gt;) —
-A new &lt;code&gt;apply_institutional_diversity()&lt;&#x2F;code&gt; function limits how many replicas of a
-single tessera can land on institutional nodes. The cap is
-&lt;code&gt;ceil(replication_factor &#x2F; 3.5)&lt;&#x2F;code&gt; — with the default &lt;code&gt;r=7&lt;&#x2F;code&gt;, at most 2 of 7
-replicas go to institutions. This prevents the network from becoming dependent
-on a small number of large institutions: if a university&#x27;s servers go down, at
-least 5 replicas remain on independent nodes.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;DHT message extensions&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;message.rs&lt;&#x2F;code&gt;) — Two new message
-variants:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Message&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;Search&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Client sends query string, filters, and page number&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;SearchResult&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Institutional node responds with hits and total count&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;The &lt;code&gt;encode()&lt;&#x2F;code&gt; function was switched from positional to named MessagePack
-serialization (&lt;code&gt;rmp_serde::to_vec_named&lt;&#x2F;code&gt;) to handle &lt;code&gt;SearchFilters&lt;&#x2F;code&gt;&#x27; optional
-fields correctly — positional encoding breaks when &lt;code&gt;skip_serializing_if&lt;&#x2F;code&gt; omits
-fields.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Prometheus metrics&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — Eight institutional-specific
-metrics:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_pledge_bytes&lt;&#x2F;code&gt; — configured storage pledge&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_stored_bytes&lt;&#x2F;code&gt; — actual bytes stored&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_pledge_utilization_ratio&lt;&#x2F;code&gt; — stored&#x2F;pledged ratio&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_peers_served&lt;&#x2F;code&gt; — unique peers served fragments&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_search_index_total&lt;&#x2F;code&gt; — tesseras in the search index&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_search_queries_total&lt;&#x2F;code&gt; — search queries received&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_dns_verification_status&lt;&#x2F;code&gt; — 1 if DNS verified, 0
-otherwise&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_dns_verification_last&lt;&#x2F;code&gt; — Unix timestamp of last
-verification&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Integration tests&lt;&#x2F;strong&gt; — Two tests in
-&lt;code&gt;tesseras-replication&#x2F;tests&#x2F;integration.rs&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;institutional_peer_bypasses_reciprocity&lt;&#x2F;code&gt; — verifies that an institutional
-peer with a massive deficit (-999,999 balance) is still allowed to store
-fragments, while a non-institutional peer with the same deficit is rejected&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;institutional_node_accepts_fragment_despite_deficit&lt;&#x2F;code&gt; — full async test using
-&lt;code&gt;ReplicationService&lt;&#x2F;code&gt; with mocked DHT, fragment store, reciprocity ledger, and
-blob store: sends a fragment from an institutional sender and verifies it&#x27;s
-accepted&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;322 tests pass across the workspace. Clippy clean with &lt;code&gt;-D warnings&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;DNS TXT over PKI or blockchain&lt;&#x2F;strong&gt;: DNS is universally deployed, universally
-understood, and already used for domain verification (SPF, DKIM, Let&#x27;s
-Encrypt). Institutions already manage DNS. No certificate authority, no token,
-no on-chain transaction — just a TXT record. If an institution loses control
-of their domain, the verification naturally fails on the next check.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Graceful degradation on DNS failure&lt;&#x2F;strong&gt;: if DNS verification fails at startup,
-the daemon downgrades to a normal full node instead of refusing to start. This
-prevents operational incidents — a DNS misconfiguration shouldn&#x27;t take a node
-offline.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Diversity cap at &lt;code&gt;ceil(r &#x2F; 3.5)&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: with &lt;code&gt;r=7&lt;&#x2F;code&gt;, at most 2 replicas go to
-institutions. This is conservative — it ensures the network never depends on
-institutions for majority quorum, while still benefiting from their storage
-capacity and uptime.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Named MessagePack encoding&lt;&#x2F;strong&gt;: switching from positional to named encoding
-adds ~15% overhead per message but eliminates a class of serialization bugs
-when optional fields are present. The DHT is not bandwidth-constrained at the
-message level, so the tradeoff is worth it.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reciprocity exemption over credit grants&lt;&#x2F;strong&gt;: rather than giving institutions
-a large initial credit balance (which is arbitrary and needs tuning), we
-exempt them entirely. Their DNS-verified identity and public storage pledge
-replace the bilateral reciprocity mechanism.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;FTS5 + R-tree in SQLite&lt;&#x2F;strong&gt;: full-text search and spatial indexing are built
-into SQLite as loadable extensions. No external search engine (Elasticsearch,
-Meilisearch) needed. This keeps the deployment a single binary with a single
-database file — critical for institutional operators who may not have a DevOps
-team.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued&lt;&#x2F;strong&gt; — storage deduplication (content-addressable store with
-BLAKE3 keying), security audits, OS packaging (Alpine, Arch, Debian, OpenBSD,
-FreeBSD)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration
-(FamilySearch, Ancestry), physical media export (M-DISC, microfilm, acid-free
-paper with QR), AI-assisted context&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Institutional onboarding closes a critical gap in Tesseras&#x27; preservation model.
-Individual nodes provide grassroots resilience — thousands of devices across the
-globe, each storing a few fragments. Institutional nodes provide anchoring —
-organizations with professional infrastructure, redundant storage, and
-multi-decade operational horizons. Together, they form a network where memories
-can outlast both individual devices and individual institutions.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Performance Tuning</title>
- <published>2026-02-15T20:00:00+00:00</published>
- <updated>2026-02-15T20:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-performance-tuning/"/>
- <id>https://tesseras.net/news/phase4-performance-tuning/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-performance-tuning/">&lt;p&gt;A P2P network that can traverse NATs but chokes on its own I&#x2F;O is not much use.
-Phase 4 continues with performance tuning: centralizing database configuration,
-caching fragment blobs in memory, managing QUIC connection lifecycles, and
-eliminating unnecessary disk reads from the attestation hot path.&lt;&#x2F;p&gt;
-&lt;p&gt;The guiding principle was the same as the rest of Tesseras: do the simplest
-thing that actually works. No custom allocators, no lock-free data structures,
-no premature complexity. A centralized &lt;code&gt;StorageConfig&lt;&#x2F;code&gt;, an LRU cache, a
-connection reaper, and a targeted fix to avoid re-reading blobs that were
-already checksummed.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Centralized SQLite configuration&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;database.rs&lt;&#x2F;code&gt;) — A
-new &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; struct and &lt;code&gt;open_database()&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;open_in_memory()&lt;&#x2F;code&gt; functions
-that apply all SQLite pragmas in one place: WAL journal mode, foreign keys,
-synchronous mode (NORMAL by default, FULL for unstable hardware like RPi + SD
-card), busy timeout, page cache size, and WAL autocheckpoint interval.
-Previously, each call site opened a connection and applied pragmas ad hoc. Now
-the daemon, CLI, and tests all go through the same path. 7 tests covering
-foreign keys, busy timeout, journal mode, migrations, synchronous modes, and
-on-disk WAL file creation.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;LRU fragment cache&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;cache.rs&lt;&#x2F;code&gt;) — A
-&lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt; that wraps any &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; with a byte-aware LRU
-cache. Fragment blobs are cached on read and invalidated on write or delete.
-When the cache exceeds its configured byte limit, the least recently used
-entries are evicted. The cache is transparent: it implements &lt;code&gt;FragmentStore&lt;&#x2F;code&gt;
-itself, so the rest of the stack doesn&#x27;t know it&#x27;s there. Optional Prometheus
-metrics track hits, misses, and current byte usage. 3 tests: cache hit avoids
-inner read, store invalidates cache, eviction when over max bytes.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Prometheus storage metrics&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — A
-&lt;code&gt;StorageMetrics&lt;&#x2F;code&gt; struct with three counters&#x2F;gauges: &lt;code&gt;fragment_cache_hits&lt;&#x2F;code&gt;,
-&lt;code&gt;fragment_cache_misses&lt;&#x2F;code&gt;, and &lt;code&gt;fragment_cache_bytes&lt;&#x2F;code&gt;. Registered with the
-Prometheus registry and wired into the fragment cache via &lt;code&gt;with_metrics()&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Attestation hot path fix&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-replication&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) — The
-attestation flow previously read every fragment blob from disk and recomputed
-its BLAKE3 checksum. Since &lt;code&gt;list_fragments()&lt;&#x2F;code&gt; already returns &lt;code&gt;FragmentId&lt;&#x2F;code&gt; with
-a stored checksum, the fix is trivial: use &lt;code&gt;frag.checksum&lt;&#x2F;code&gt; instead of
-&lt;code&gt;blake3::hash(&amp;amp;data)&lt;&#x2F;code&gt;. This eliminates one disk read per fragment during
-attestation — for a tessera with 100 fragments, that&#x27;s 100 fewer reads. A test
-with &lt;code&gt;expect_read_fragment().never()&lt;&#x2F;code&gt; verifies no blob reads happen during
-attestation.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;QUIC connection pool lifecycle&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;quinn_transport.rs&lt;&#x2F;code&gt;) — A
-&lt;code&gt;PoolConfig&lt;&#x2F;code&gt; struct controlling max connections, idle timeout, and reaper
-interval. &lt;code&gt;PooledConnection&lt;&#x2F;code&gt; wraps each &lt;code&gt;quinn::Connection&lt;&#x2F;code&gt; with a &lt;code&gt;last_used&lt;&#x2F;code&gt;
-timestamp. When the pool reaches capacity, the oldest idle connection is evicted
-before opening a new one. A background reaper task (Tokio spawn) periodically
-closes connections that have been idle beyond the timeout. 4 new pool metrics:
-&lt;code&gt;tesseras_conn_pool_size&lt;&#x2F;code&gt;, &lt;code&gt;pool_hits_total&lt;&#x2F;code&gt;, &lt;code&gt;pool_misses_total&lt;&#x2F;code&gt;,
-&lt;code&gt;pool_evictions_total&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Daemon integration&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;, &lt;code&gt;main.rs&lt;&#x2F;code&gt;) — A new &lt;code&gt;[performance]&lt;&#x2F;code&gt;
-section in the TOML config with fields for SQLite cache size, synchronous mode,
-busy timeout, fragment cache size, max connections, idle timeout, and reaper
-interval. The daemon&#x27;s &lt;code&gt;main()&lt;&#x2F;code&gt; now calls &lt;code&gt;open_database()&lt;&#x2F;code&gt; with the configured
-&lt;code&gt;StorageConfig&lt;&#x2F;code&gt;, wraps &lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt; with &lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt;, and binds
-QUIC with the configured &lt;code&gt;PoolConfig&lt;&#x2F;code&gt;. The direct &lt;code&gt;rusqlite&lt;&#x2F;code&gt; dependency was
-removed from the daemon crate.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CLI migration&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;commands&#x2F;init.rs&lt;&#x2F;code&gt;, &lt;code&gt;create.rs&lt;&#x2F;code&gt;) — Both
-&lt;code&gt;init&lt;&#x2F;code&gt; and &lt;code&gt;create&lt;&#x2F;code&gt; commands now use &lt;code&gt;tesseras_storage::open_database()&lt;&#x2F;code&gt; with
-the default &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; instead of opening raw &lt;code&gt;rusqlite&lt;&#x2F;code&gt; connections. The
-&lt;code&gt;rusqlite&lt;&#x2F;code&gt; dependency was removed from the CLI crate.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Decorator pattern for caching&lt;&#x2F;strong&gt;: &lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt; wraps
-&lt;code&gt;Box&amp;lt;dyn FragmentStore&amp;gt;&lt;&#x2F;code&gt; and implements &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; itself. This means
-caching is opt-in, composable, and invisible to consumers. The daemon enables
-it; tests can skip it.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Byte-aware eviction&lt;&#x2F;strong&gt;: the LRU cache tracks total bytes, not entry count.
-Fragment blobs vary wildly in size (a 4KB text fragment vs a 2MB photo shard),
-so counting entries would give a misleading picture of memory usage.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;No connection pool crate&lt;&#x2F;strong&gt;: instead of pulling in a generic pool library,
-the connection pool is a thin wrapper around
-&lt;code&gt;DashMap&amp;lt;SocketAddr, PooledConnection&amp;gt;&lt;&#x2F;code&gt; with a Tokio reaper. QUIC connections
-are multiplexed, so the &quot;pool&quot; is really about lifecycle management (idle
-cleanup, max connections) rather than borrowing&#x2F;returning.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Stored checksums over re-reads&lt;&#x2F;strong&gt;: the attestation fix is intentionally
-minimal — one line changed, one disk read removed per fragment. The checksums
-were already stored in SQLite by &lt;code&gt;store_fragment()&lt;&#x2F;code&gt;, they just weren&#x27;t being
-used.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Centralized pragma configuration&lt;&#x2F;strong&gt;: a single &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; struct replaces
-scattered &lt;code&gt;PRAGMA&lt;&#x2F;code&gt; calls. The &lt;code&gt;sqlite_synchronous_full&lt;&#x2F;code&gt; flag exists
-specifically for Raspberry Pi deployments where the kernel can crash and lose
-un-checkpointed WAL transactions.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued&lt;&#x2F;strong&gt; — Shamir&#x27;s Secret Sharing for heirs, sealed tesseras
-(time-lock encryption), security audits, institutional node onboarding,
-storage deduplication, OS packaging&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;With performance tuning in place, Tesseras handles the common case efficiently:
-fragment reads hit the LRU cache, attestation skips disk I&#x2F;O, idle QUIC
-connections are reaped automatically, and SQLite is configured consistently
-across the entire stack. The next steps focus on cryptographic features (Shamir,
-time-lock) and hardening for production deployment.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Verify Without Installing Anything</title>
- <published>2026-02-15T20:00:00+00:00</published>
- <updated>2026-02-15T20:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-wasm-browser-verification/"/>
- <id>https://tesseras.net/news/phase4-wasm-browser-verification/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-wasm-browser-verification/">&lt;p&gt;Trust shouldn&#x27;t require installing software. If someone sends you a tessera — a
-bundle of preserved memories — you should be able to verify it&#x27;s genuine and
-unmodified without downloading an app, creating an account, or trusting a
-server. That&#x27;s what &lt;code&gt;tesseras-wasm&lt;&#x2F;code&gt; delivers: drag a tessera archive into a web
-page, and cryptographic verification happens entirely in your browser.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-wasm&lt;&#x2F;strong&gt; — A Rust crate that compiles to WebAssembly via wasm-pack,
-exposing four stateless functions to JavaScript. The crate depends on
-&lt;code&gt;tesseras-core&lt;&#x2F;code&gt; for manifest parsing and calls cryptographic primitives directly
-(blake3, ed25519-dalek) rather than depending on &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt;, which pulls
-in C-based post-quantum libraries that don&#x27;t compile to
-&lt;code&gt;wasm32-unknown-unknown&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;parse_manifest&lt;&#x2F;code&gt; takes raw MANIFEST bytes (UTF-8 plain text, not MessagePack),
-delegates to &lt;code&gt;tesseras_core::manifest::Manifest::parse()&lt;&#x2F;code&gt;, and returns a JSON
-string with the creator&#x27;s Ed25519 public key, signature file paths, and a list
-of files with their expected BLAKE3 hashes, sizes, and MIME types. Internal
-structs (&lt;code&gt;ManifestJson&lt;&#x2F;code&gt;, &lt;code&gt;CreatorPubkey&lt;&#x2F;code&gt;, &lt;code&gt;SignatureFiles&lt;&#x2F;code&gt;, &lt;code&gt;FileEntry&lt;&#x2F;code&gt;) are
-serialized with serde_json. The ML-DSA public key and signature file fields are
-present in the JSON contract but set to &lt;code&gt;null&lt;&#x2F;code&gt; — ready for when post-quantum
-signing is implemented on the native side.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;hash_blake3&lt;&#x2F;code&gt; computes a BLAKE3 hash of arbitrary bytes and returns a
-64-character hex string. It&#x27;s called once per file in the tessera to verify
-integrity against the MANIFEST.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;verify_ed25519&lt;&#x2F;code&gt; takes a message, a 64-byte signature, and a 32-byte public key,
-constructs an &lt;code&gt;ed25519_dalek::VerifyingKey&lt;&#x2F;code&gt;, and returns whether the signature
-is valid. Length validation returns descriptive errors (&quot;Ed25519 public key must
-be 32 bytes&quot;) rather than panicking.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;verify_ml_dsa&lt;&#x2F;code&gt; is a stub that returns an error explaining ML-DSA verification
-is not yet available. This is deliberate: the &lt;code&gt;ml-dsa&lt;&#x2F;code&gt; crate on crates.io is
-v0.1.0-rc.7 (pre-release), and &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt; uses &lt;code&gt;pqcrypto-dilithium&lt;&#x2F;code&gt;
-(C-based CRYSTALS-Dilithium) which is byte-incompatible with FIPS 204 ML-DSA.
-Both sides need to use the same pure Rust implementation before
-cross-verification works. Ed25519 verification is sufficient — every tessera is
-Ed25519-signed.&lt;&#x2F;p&gt;
-&lt;p&gt;All four functions use a two-layer pattern for testability: inner functions
-return &lt;code&gt;Result&amp;lt;T, String&amp;gt;&lt;&#x2F;code&gt; and are tested natively, while thin &lt;code&gt;#[wasm_bindgen]&lt;&#x2F;code&gt;
-wrappers convert errors to &lt;code&gt;JsError&lt;&#x2F;code&gt;. This avoids &lt;code&gt;JsError::new()&lt;&#x2F;code&gt; panicking on
-non-WASM targets during testing.&lt;&#x2F;p&gt;
-&lt;p&gt;The compiled WASM binary is 109 KB raw and 44 KB gzipped — well under the 200 KB
-budget. wasm-opt applies &lt;code&gt;-Oz&lt;&#x2F;code&gt; optimization after wasm-pack builds with
-&lt;code&gt;opt-level = &quot;z&quot;&lt;&#x2F;code&gt;, LTO, and single codegen unit.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;@tesseras&#x2F;verify&lt;&#x2F;strong&gt; — A TypeScript npm package (&lt;code&gt;crates&#x2F;tesseras-wasm&#x2F;js&#x2F;&lt;&#x2F;code&gt;)
-that orchestrates browser-side verification. The public API is a single
-function:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;typescript&quot;&gt;async function verifyTessera(
- archive: Uint8Array,
- onProgress?: (current: number, total: number, file: string) =&amp;gt; void
-): Promise&amp;lt;VerificationResult&amp;gt;
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;The &lt;code&gt;VerificationResult&lt;&#x2F;code&gt; type provides everything a UI needs: overall validity,
-tessera hash, creator public keys, signature status (valid&#x2F;invalid&#x2F;missing for
-both Ed25519 and ML-DSA), per-file integrity results with expected and actual
-hashes, a list of unexpected files not in the MANIFEST, and an errors array.&lt;&#x2F;p&gt;
-&lt;p&gt;Archive unpacking (&lt;code&gt;unpack.ts&lt;&#x2F;code&gt;) handles three formats: gzip-compressed tar
-(detected by &lt;code&gt;\x1f\x8b&lt;&#x2F;code&gt; magic bytes, decompressed with fflate then parsed as
-tar), ZIP (&lt;code&gt;PK\x03\x04&lt;&#x2F;code&gt; magic, unpacked with fflate&#x27;s &lt;code&gt;unzipSync&lt;&#x2F;code&gt;), and raw tar
-(&lt;code&gt;ustar&lt;&#x2F;code&gt; at offset 257). A &lt;code&gt;normalizePath&lt;&#x2F;code&gt; function strips the leading
-&lt;code&gt;tessera-&amp;lt;hash&amp;gt;&#x2F;&lt;&#x2F;code&gt; prefix so internal paths match MANIFEST entries.&lt;&#x2F;p&gt;
-&lt;p&gt;Verification runs in a Web Worker (&lt;code&gt;worker.ts&lt;&#x2F;code&gt;) to keep the UI thread
-responsive. The worker initializes the WASM module, unpacks the archive, parses
-the MANIFEST, verifies the Ed25519 signature against the creator&#x27;s public key,
-then hashes each file with BLAKE3 and compares against expected values. Progress
-messages stream back to the main thread after each file. If any signature is
-invalid, verification stops early without hashing files — failing fast on the
-most critical check.&lt;&#x2F;p&gt;
-&lt;p&gt;The archive is transferred to the worker with zero-copy
-(&lt;code&gt;worker.postMessage({ type: &quot;verify&quot;, archive }, [archive.buffer])&lt;&#x2F;code&gt;) to avoid
-duplicating potentially large tessera files in memory.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Build pipeline&lt;&#x2F;strong&gt; — Three new justfile targets: &lt;code&gt;wasm-build&lt;&#x2F;code&gt; runs wasm-pack
-with &lt;code&gt;--target web --release&lt;&#x2F;code&gt; and optimizes with wasm-opt; &lt;code&gt;wasm-size&lt;&#x2F;code&gt; reports
-raw and gzipped binary size; &lt;code&gt;test-wasm&lt;&#x2F;code&gt; runs the native test suite.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Tests&lt;&#x2F;strong&gt; — 9 native unit tests cover BLAKE3 hashing (empty input, known value),
-Ed25519 verification (valid signature, invalid signature, wrong key, bad key
-length), and MANIFEST parsing (valid manifest, invalid UTF-8, garbage input). 3
-WASM integration tests run in headless Chrome via
-&lt;code&gt;wasm-pack test --headless --chrome&lt;&#x2F;code&gt;, verifying that &lt;code&gt;hash_blake3&lt;&#x2F;code&gt;,
-&lt;code&gt;verify_ed25519&lt;&#x2F;code&gt;, and &lt;code&gt;parse_manifest&lt;&#x2F;code&gt; work correctly when compiled to
-&lt;code&gt;wasm32-unknown-unknown&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;No tesseras-crypto dependency&lt;&#x2F;strong&gt;: the WASM crate calls blake3 and
-ed25519-dalek directly. &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt; depends on &lt;code&gt;pqcrypto-kyber&lt;&#x2F;code&gt; (C-based
-ML-KEM via pqcrypto-traits) which requires a C compiler toolchain and doesn&#x27;t
-target wasm32. By depending only on pure Rust crates, the WASM build has zero
-C dependencies and compiles cleanly to WebAssembly.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ML-DSA deferred, not faked&lt;&#x2F;strong&gt;: rather than silently skipping post-quantum
-verification, the stub returns an explicit error. This ensures that if a
-tessera contains an ML-DSA signature, the verification result will report
-&lt;code&gt;ml_dsa: &quot;missing&quot;&lt;&#x2F;code&gt; rather than pretending it was checked. The JS orchestrator
-handles this gracefully — a tessera is valid if Ed25519 passes and ML-DSA is
-missing (not yet implemented on either side).&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Inner function pattern&lt;&#x2F;strong&gt;: &lt;code&gt;JsError&lt;&#x2F;code&gt; cannot be constructed on non-WASM
-targets (it panics). Splitting each function into
-&lt;code&gt;foo_inner() -&amp;gt; Result&amp;lt;T, String&amp;gt;&lt;&#x2F;code&gt; and &lt;code&gt;foo() -&amp;gt; Result&amp;lt;T, JsError&amp;gt;&lt;&#x2F;code&gt; lets the
-native test suite exercise all logic without touching JavaScript types. The
-WASM integration tests in headless Chrome test the full &lt;code&gt;#[wasm_bindgen]&lt;&#x2F;code&gt;
-surface.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Web Worker isolation&lt;&#x2F;strong&gt;: cryptographic operations (especially BLAKE3 over
-large media files) can take hundreds of milliseconds. Running in a Worker
-prevents UI jank. The streaming progress protocol
-(&lt;code&gt;{ type: &quot;progress&quot;, current, total, file }&lt;&#x2F;code&gt;) lets the UI show a progress bar
-during verification of tesseras with many files.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Zero-copy transfer&lt;&#x2F;strong&gt;: &lt;code&gt;archive.buffer&lt;&#x2F;code&gt; is transferred to the Worker, not
-copied. For a 50 MB tessera archive, this avoids doubling memory usage during
-verification.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Plain text MANIFEST, not MessagePack&lt;&#x2F;strong&gt;: the WASM crate parses the same
-plain-text MANIFEST format as the CLI. This is by design — the MANIFEST is the
-tessera&#x27;s Rosetta Stone, readable by anyone with a text editor. The
-&lt;code&gt;rmp-serde&lt;&#x2F;code&gt; dependency in the Cargo.toml is not used and will be removed.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4: Resilience and Scale&lt;&#x2F;strong&gt; — OS packaging (Alpine, Arch, Debian,
-FreeBSD, OpenBSD), CI on SourceHut and GitHub Actions, security audits,
-browser-based tessera explorer at tesseras.net using @tesseras&#x2F;verify&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — Public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Verification no longer requires trust in software. A tessera archive dropped
-into a browser is verified with the same cryptographic rigor as the CLI — same
-BLAKE3 hashes, same Ed25519 signatures, same MANIFEST parser. The difference is
-that now anyone can do it.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Punching Through NATs</title>
- <published>2026-02-15T18:00:00+00:00</published>
- <updated>2026-02-15T18:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-nat-traversal/"/>
- <id>https://tesseras.net/news/phase4-nat-traversal/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-nat-traversal/">&lt;p&gt;Most people&#x27;s devices sit behind a NAT — a network address translator that lets
-them reach the internet but prevents incoming connections. For a P2P network,
-this is an existential problem: if two nodes behind NATs can&#x27;t talk to each
-other, the network fragments. Phase 4 continues with a full NAT traversal stack:
-STUN-based discovery, coordinated hole punching, and relay fallback.&lt;&#x2F;p&gt;
-&lt;p&gt;The approach follows the same pattern as most battle-tested P2P systems (WebRTC,
-BitTorrent, IPFS): try the cheapest option first, escalate only when necessary.
-Direct connectivity costs nothing. Hole punching costs a few coordinated
-packets. Relaying costs sustained bandwidth from a third party. Tesseras tries
-them in that order.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;NatType classification&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;network.rs&lt;&#x2F;code&gt;) — A new &lt;code&gt;NatType&lt;&#x2F;code&gt;
-enum (Public, Cone, Symmetric, Unknown) added to the core domain layer. This
-type is shared across the entire stack: the STUN client writes it, the DHT
-advertises it in Pong messages, and the punch coordinator reads it to decide
-whether hole punching is even worth attempting (Cone-to-Cone works ~80% of the
-time; Symmetric-to-Symmetric almost never works).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;STUN client&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;stun.rs&lt;&#x2F;code&gt;) — A minimal STUN implementation
-(RFC 5389 Binding Request&#x2F;Response) that discovers a node&#x27;s external address.
-The codec encodes 20-byte binding requests with a random transaction ID and
-decodes XOR-MAPPED-ADDRESS responses. The &lt;code&gt;discover_nat()&lt;&#x2F;code&gt; function queries
-multiple STUN servers in parallel (Google, Cloudflare by default), compares the
-mapped addresses, and classifies the NAT type:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Same IP and port from all servers → &lt;strong&gt;Public&lt;&#x2F;strong&gt; (no NAT)&lt;&#x2F;li&gt;
-&lt;li&gt;Same mapped address from all servers → &lt;strong&gt;Cone&lt;&#x2F;strong&gt; (hole punching works)&lt;&#x2F;li&gt;
-&lt;li&gt;Different mapped addresses → &lt;strong&gt;Symmetric&lt;&#x2F;strong&gt; (hole punching unreliable)&lt;&#x2F;li&gt;
-&lt;li&gt;No responses → &lt;strong&gt;Unknown&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Retries with exponential backoff and configurable timeouts. 12 tests covering
-codec roundtrips, all classification paths, and async loopback queries.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Signed punch coordination&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;punch.rs&lt;&#x2F;code&gt;) — Ed25519 signing
-and verification for &lt;code&gt;PunchIntro&lt;&#x2F;code&gt;, &lt;code&gt;RelayRequest&lt;&#x2F;code&gt;, and &lt;code&gt;RelayMigrate&lt;&#x2F;code&gt; messages.
-Every introduction is signed by the initiator with a 30-second timestamp window,
-preventing reflection attacks (where an attacker replays an old introduction to
-redirect traffic). The payload format is &lt;code&gt;target || external_addr || timestamp&lt;&#x2F;code&gt;
-— changing any field invalidates the signature. 6 unit tests plus 3
-property-based tests with proptest (arbitrary node IDs, ports, and session
-tokens).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Relay session manager&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;relay.rs&lt;&#x2F;code&gt;) — Manages transparent
-UDP relay sessions between NATed peers. Each session has a random 16-byte token;
-peers prefix their packets with the token, the relay strips it and forwards.
-Features:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Bidirectional forwarding (A→R→B and B→R→A)&lt;&#x2F;li&gt;
-&lt;li&gt;Rate limiting: 256 KB&#x2F;s for reciprocal peers, 64 KB&#x2F;s for non-reciprocal&lt;&#x2F;li&gt;
-&lt;li&gt;10-minute maximum duration for bootstrap (non-reciprocal) sessions&lt;&#x2F;li&gt;
-&lt;li&gt;Address migration: when a peer&#x27;s IP changes (Wi-Fi to cellular), a signed
-&lt;code&gt;RelayMigrate&lt;&#x2F;code&gt; updates the session without tearing it down&lt;&#x2F;li&gt;
-&lt;li&gt;Idle cleanup with configurable timeout&lt;&#x2F;li&gt;
-&lt;li&gt;8 unit tests plus 2 property-based tests&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;DHT message extensions&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;message.rs&lt;&#x2F;code&gt;) — Seven new message
-variants added to the DHT protocol:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Message&lt;&#x2F;th&gt;&lt;th&gt;Purpose&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchIntro&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&quot;I want to connect to node X, here&#x27;s my signed external address&quot;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchRequest&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Introducer forwards the request to the target&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchReady&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Target confirms readiness, sends its external address&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayRequest&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&quot;Create a relay session to node X&quot;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayOffer&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Relay responds with its address and session token&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayClose&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Tear down a relay session&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayMigrate&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Update session after network change&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;The &lt;code&gt;Pong&lt;&#x2F;code&gt; message was extended with NAT metadata: &lt;code&gt;nat_type&lt;&#x2F;code&gt;,
-&lt;code&gt;relay_slots_available&lt;&#x2F;code&gt;, and &lt;code&gt;relay_bandwidth_used_kbps&lt;&#x2F;code&gt;. All new fields use
-&lt;code&gt;#[serde(default)]&lt;&#x2F;code&gt; for backward compatibility — old nodes ignore what they
-don&#x27;t recognize, new nodes fall back to defaults. 9 new serialization roundtrip
-tests.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;NatHandler trait and dispatch&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;engine.rs&lt;&#x2F;code&gt;) — A new
-&lt;code&gt;NatHandler&lt;&#x2F;code&gt; async trait (5 methods) injected into the DHT engine, following the
-same dependency injection pattern as the existing &lt;code&gt;ReplicationHandler&lt;&#x2F;code&gt;. The
-engine&#x27;s message dispatch loop now routes all punch&#x2F;relay messages to the
-handler. This keeps the DHT engine protocol-agnostic while allowing the NAT
-traversal logic to live in &lt;code&gt;tesseras-net&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Mobile reconnection types&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-embedded&#x2F;src&#x2F;reconnect.rs&lt;&#x2F;code&gt;) — A
-three-phase reconnection state machine for mobile devices:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;QuicMigration&lt;&#x2F;strong&gt; (0-2s) — try QUIC connection migration for all active peers&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ReStun&lt;&#x2F;strong&gt; (2-5s) — re-discover external address via STUN&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ReEstablish&lt;&#x2F;strong&gt; (5-10s) — reconnect peers that migration couldn&#x27;t save&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;Peers are reconnected in priority order: bootstrap nodes first, then nodes
-holding our fragments, then nodes whose fragments we hold, then general DHT
-neighbors. A new &lt;code&gt;NetworkChanged&lt;&#x2F;code&gt; event variant was added to the FFI event
-stream so the Flutter app can show reconnection progress.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Daemon NAT configuration&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;) — A new &lt;code&gt;[nat]&lt;&#x2F;code&gt; section in
-the TOML config with STUN server list, relay toggle, max relay sessions,
-bandwidth limits (reciprocal vs bootstrap), and idle timeout. All fields have
-sensible defaults; relay is disabled by default.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Prometheus metrics&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — 16 metrics across four
-subsystems:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;STUN&lt;&#x2F;strong&gt;: requests, failures, latency histogram&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Punch&lt;&#x2F;strong&gt;: attempts&#x2F;successes&#x2F;failures (by NAT type pair), latency histogram&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Relay&lt;&#x2F;strong&gt;: active sessions, total sessions, bytes forwarded, idle timeouts,
-rate limit hits&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reconnect&lt;&#x2F;strong&gt;: network changes, attempts&#x2F;successes by phase, duration
-histogram&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;6 tests verifying registration, increment, label cardinality, and
-double-registration detection.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Integration tests&lt;&#x2F;strong&gt; — Two end-to-end tests using &lt;code&gt;MemTransport&lt;&#x2F;code&gt; (in-memory
-simulated network):&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;punch_integration.rs&lt;&#x2F;code&gt; — Full 3-node hole-punch flow: A sends signed
-&lt;code&gt;PunchIntro&lt;&#x2F;code&gt; to introducer I, I verifies and forwards &lt;code&gt;PunchRequest&lt;&#x2F;code&gt; to B, B
-verifies the original signature and sends &lt;code&gt;PunchReady&lt;&#x2F;code&gt; back, A and B exchange
-messages directly. Also tests that a bad signature is correctly rejected.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;relay_integration.rs&lt;&#x2F;code&gt; — Full 3-node relay flow: A requests relay from R, R
-creates session and sends &lt;code&gt;RelayOffer&lt;&#x2F;code&gt; to both peers, A and B exchange
-token-prefixed packets through R, A migrates to a new address mid-session, A
-closes the session, and the test verifies the session is torn down and further
-forwarding fails.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Property tests&lt;&#x2F;strong&gt; — 7 proptest-based tests covering: signature round-trips for
-all three signed message types (arbitrary node IDs, ports, tokens), NAT
-classification determinism (same inputs always produce same output), STUN
-binding request validity, session token uniqueness, and relay rejection of
-too-short packets.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Justfile targets&lt;&#x2F;strong&gt; — &lt;code&gt;just test-nat&lt;&#x2F;code&gt; runs all NAT traversal tests across
-&lt;code&gt;tesseras-net&lt;&#x2F;code&gt; and &lt;code&gt;tesseras-dht&lt;&#x2F;code&gt;. &lt;code&gt;just test-chaos&lt;&#x2F;code&gt; is a placeholder for future
-Docker Compose chaos tests with &lt;code&gt;tc netem&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;STUN over TURN&lt;&#x2F;strong&gt;: we implement STUN (discovery) and custom relay rather than
-full TURN. TURN requires authenticated allocation and is designed for media
-relay; our relay is simpler — token-prefixed UDP forwarding with rate limits.
-This keeps the protocol minimal and avoids depending on external TURN servers.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Signatures on introductions&lt;&#x2F;strong&gt;: every &lt;code&gt;PunchIntro&lt;&#x2F;code&gt; is signed by the
-initiator. Without this, an attacker could send forged introductions to
-redirect a node&#x27;s hole-punch attempts to an attacker-controlled address (a
-reflection attack). The 30-second timestamp window limits replay.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reciprocal bandwidth tiers&lt;&#x2F;strong&gt;: relay nodes give 4x more bandwidth (256 vs 64
-KB&#x2F;s) to peers with good reciprocity scores. This incentivizes nodes to store
-fragments for others — if you contribute, you get better relay service when
-you need it.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Backward-compatible Pong extension&lt;&#x2F;strong&gt;: new NAT fields in &lt;code&gt;Pong&lt;&#x2F;code&gt; use
-&lt;code&gt;#[serde(default)]&lt;&#x2F;code&gt; and &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;. Old nodes that don&#x27;t understand these
-fields simply skip them during deserialization. No protocol version bump
-needed.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;NatHandler as async trait&lt;&#x2F;strong&gt;: the NAT traversal logic is injected into the
-DHT engine via a trait, just like &lt;code&gt;ReplicationHandler&lt;&#x2F;code&gt;. This keeps the DHT
-engine focused on routing and peer management, and allows the NAT
-implementation to be swapped or disabled without touching core DHT code.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued&lt;&#x2F;strong&gt; — performance tuning (connection pooling, fragment
-caching, SQLite WAL), security audits, institutional node onboarding, OS
-packaging&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;With NAT traversal, Tesseras can connect nodes regardless of their network
-topology. Public nodes talk directly. Cone-NATed nodes punch through with an
-introducer&#x27;s help. Symmetric-NATed or firewalled nodes relay through willing
-peers. The network adapts to the real world, where most devices are behind a NAT
-and network conditions change constantly.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>CLI Meets Network: Publish, Fetch, and Status Commands</title>
- <published>2026-02-15T00:00:00+00:00</published>
- <updated>2026-02-15T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/cli-daemon-rpc/"/>
- <id>https://tesseras.net/news/cli-daemon-rpc/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/cli-daemon-rpc/">&lt;p&gt;Until now the CLI operated in isolation: create a tessera, verify it, export it,
-list what you have. Everything stayed on your machine. With this release, &lt;code&gt;tes&lt;&#x2F;code&gt;
-gains three commands that bridge the gap between local storage and the P2P
-network — &lt;code&gt;publish&lt;&#x2F;code&gt;, &lt;code&gt;fetch&lt;&#x2F;code&gt;, and &lt;code&gt;status&lt;&#x2F;code&gt; — by talking to a running &lt;code&gt;tesd&lt;&#x2F;code&gt; over
-a Unix socket.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tesseras-rpc&lt;&#x2F;code&gt; crate&lt;&#x2F;strong&gt; — A new shared crate that both the CLI and daemon
-depend on. It defines the RPC protocol using MessagePack serialization with
-length-prefixed framing (4-byte big-endian size header, 64 MiB max). Three
-request types (&lt;code&gt;Publish&lt;&#x2F;code&gt;, &lt;code&gt;Fetch&lt;&#x2F;code&gt;, &lt;code&gt;Status&lt;&#x2F;code&gt;) and their corresponding responses.
-A sync &lt;code&gt;DaemonClient&lt;&#x2F;code&gt; handles the Unix socket connection with configurable
-timeouts. The protocol is deliberately simple — one request, one response,
-connection closed — to keep the implementation auditable.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes publish &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Publishes a tessera to the network. Accepts full
-hashes or short prefixes (e.g., &lt;code&gt;tes publish a1b2&lt;&#x2F;code&gt;), which are resolved against
-the local database. The daemon reads all tessera files from storage, packs them
-into a single MessagePack buffer, and hands them to the replication engine.
-Small tesseras (&amp;lt; 4 MB) are replicated as a single fragment; larger ones go
-through Reed-Solomon erasure coding. Output shows the short hash and fragment
-count:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;Published tessera 9f2c4a1b (24 fragments created)
-Distribution in progress — use `tes status 9f2c4a1b` to track.
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes fetch &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Retrieves a tessera from the network using its full
-content hash. The daemon collects locally available fragments, reconstructs the
-original data via erasure decoding if needed, unpacks the files, and stores them
-in the content-addressable store. Returns the number of memories and total size
-fetched.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes status &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Displays the replication health of a tessera. The
-output maps directly to the replication engine&#x27;s internal health model:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;State&lt;&#x2F;th&gt;&lt;th&gt;Meaning&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;Local&lt;&#x2F;td&gt;&lt;td&gt;Not yet published — exists only on your machine&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Publishing&lt;&#x2F;td&gt;&lt;td&gt;Fragments being distributed, critical redundancy&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Replicated&lt;&#x2F;td&gt;&lt;td&gt;Distributed but below target redundancy&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Healthy&lt;&#x2F;td&gt;&lt;td&gt;Full redundancy achieved&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;&lt;strong&gt;Daemon RPC listener&lt;&#x2F;strong&gt; — The daemon now binds a Unix socket (default:
-&lt;code&gt;$XDG_RUNTIME_DIR&#x2F;tesseras&#x2F;daemon.sock&lt;&#x2F;code&gt;) with proper directory permissions
-(0700), stale socket cleanup, and graceful shutdown. Each connection is handled
-in a Tokio task — the listener converts the async stream to sync I&#x2F;O for the
-framing layer, dispatches to the RPC handler, and writes the response back.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Pack&#x2F;unpack in &lt;code&gt;tesseras-core&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — A small module that serializes a list of
-file entries (path + data) into a single MessagePack buffer and back. This is
-the bridge between the tessera&#x27;s directory structure and the replication
-engine&#x27;s opaque byte blobs.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Unix socket over TCP&lt;&#x2F;strong&gt;: RPC between CLI and daemon happens on the same
-machine. Unix sockets are faster, don&#x27;t need port allocation, and filesystem
-permissions provide access control without TLS.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;MessagePack over JSON&lt;&#x2F;strong&gt;: the same wire format used everywhere else in
-Tesseras. Compact, schema-less, and already a workspace dependency. A typical
-publish request&#x2F;response round-trip is under 200 bytes.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Sync client, async daemon&lt;&#x2F;strong&gt;: the &lt;code&gt;DaemonClient&lt;&#x2F;code&gt; uses blocking I&#x2F;O because
-the CLI doesn&#x27;t need concurrency — it sends one request and waits. The daemon
-listener is async (Tokio) to handle multiple connections. The framing layer
-works with any &lt;code&gt;Read&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Write&lt;&#x2F;code&gt; impl, bridging both worlds.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Hash prefix resolution on the client side&lt;&#x2F;strong&gt;: &lt;code&gt;publish&lt;&#x2F;code&gt; and &lt;code&gt;status&lt;&#x2F;code&gt; resolve
-short prefixes locally before sending the full hash to the daemon. This keeps
-the daemon stateless — it doesn&#x27;t need access to the CLI&#x27;s database.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Default data directory alignment&lt;&#x2F;strong&gt;: the CLI default changed from
-&lt;code&gt;~&#x2F;.tesseras&lt;&#x2F;code&gt; to &lt;code&gt;~&#x2F;.local&#x2F;share&#x2F;tesseras&lt;&#x2F;code&gt; (via &lt;code&gt;dirs::data_dir()&lt;&#x2F;code&gt;) to match
-the daemon. A migration hint is printed when legacy data is detected.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;DHT peer count&lt;&#x2F;strong&gt;: the &lt;code&gt;status&lt;&#x2F;code&gt; command currently reports 0 peers — wiring
-the actual peer count from the DHT is the next step&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;&lt;code&gt;tes show&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: display the contents of a tessera (memories, metadata) without
-exporting&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Streaming fetch&lt;&#x2F;strong&gt;: for large tesseras, stream fragments as they arrive
-rather than waiting for all of them&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Heir Key Recovery with Shamir&#x27;s Secret Sharing</title>
- <published>2026-02-15T00:00:00+00:00</published>
- <updated>2026-02-15T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-shamir-heir-recovery/"/>
- <id>https://tesseras.net/news/phase4-shamir-heir-recovery/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-shamir-heir-recovery/">&lt;p&gt;What happens to your memories when you die? Until now, Tesseras could preserve
-content across millennia — but the private and sealed keys died with their
-owner. Phase 4 continues with a solution: Shamir&#x27;s Secret Sharing, a
-cryptographic scheme that lets you split your identity into shares and
-distribute them to the people you trust most.&lt;&#x2F;p&gt;
-&lt;p&gt;The math is elegant: you choose a threshold T and a total N. Any T shares
-reconstruct the full secret; T-1 shares reveal absolutely nothing. This is not
-&quot;almost nothing&quot; — it is information-theoretically secure. An attacker with one
-fewer share than the threshold has exactly zero bits of information about the
-secret, no matter how much computing power they have.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;GF(256) finite field arithmetic&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;shamir&#x2F;gf256.rs&lt;&#x2F;code&gt;) —
-Shamir&#x27;s Secret Sharing requires arithmetic in a finite field. We implement
-GF(256) using the same irreducible polynomial as AES (x^8 + x^4 + x^3 + x + 1),
-with compile-time lookup tables for logarithm and exponentiation. All operations
-are constant-time via table lookups — no branches on secret data. The module
-includes Horner&#x27;s method for polynomial evaluation and Lagrange interpolation at
-x=0 for secret recovery. 233 lines, exhaustively tested: all 256 elements for
-identity&#x2F;inverse properties, commutativity, and associativity.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;ShamirSplitter&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;shamir&#x2F;mod.rs&lt;&#x2F;code&gt;) — The core
-split&#x2F;reconstruct API. &lt;code&gt;split()&lt;&#x2F;code&gt; takes a secret byte slice, a configuration
-(threshold T, total N), and the owner&#x27;s Ed25519 public key. For each byte of the
-secret, it constructs a random polynomial of degree T-1 over GF(256) with the
-secret byte as the constant term, then evaluates it at N distinct points.
-&lt;code&gt;reconstruct()&lt;&#x2F;code&gt; takes T or more shares and recovers the secret via Lagrange
-interpolation. Both operations include extensive validation: threshold bounds,
-session consistency, owner fingerprint matching, and BLAKE3 checksum
-verification.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;HeirShare format&lt;&#x2F;strong&gt; — Each share is a self-contained, serializable artifact
-with:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Format version (v1) for forward compatibility&lt;&#x2F;li&gt;
-&lt;li&gt;Share index (1..N) and threshold&#x2F;total metadata&lt;&#x2F;li&gt;
-&lt;li&gt;Session ID (random 8 bytes) — prevents mixing shares from different split
-sessions&lt;&#x2F;li&gt;
-&lt;li&gt;Owner fingerprint (first 8 bytes of BLAKE3 hash of the Ed25519 public key)&lt;&#x2F;li&gt;
-&lt;li&gt;Share data (the Shamir y-values, same length as the secret)&lt;&#x2F;li&gt;
-&lt;li&gt;BLAKE3 checksum over all preceding fields&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Shares are serialized in two formats: &lt;strong&gt;MessagePack&lt;&#x2F;strong&gt; (compact binary, for
-programmatic use) and &lt;strong&gt;base64 text&lt;&#x2F;strong&gt; (human-readable, for printing and physical
-storage). The text format includes a header with metadata and delimiters:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;--- TESSERAS HEIR SHARE ---
-Format: v1
-Owner: a1b2c3d4e5f6a7b8 (fingerprint)
-Share: 1 of 3 (threshold: 2)
-Session: 9f8e7d6c5b4a3210
-Created: 2026-02-15
-
-&amp;lt;base64-encoded MessagePack data&amp;gt;
---- END HEIR SHARE ---
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;This format is designed to be printed on paper, stored in a safe deposit box, or
-engraved on metal. The header is informational — only the base64 payload is
-parsed during reconstruction.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CLI integration&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;commands&#x2F;heir.rs&lt;&#x2F;code&gt;) — Three new
-subcommands:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;tes heir create&lt;&#x2F;code&gt; — splits your Ed25519 identity into heir shares. Prompts for
-confirmation (your full identity is at stake), generates both &lt;code&gt;.bin&lt;&#x2F;code&gt; and
-&lt;code&gt;.txt&lt;&#x2F;code&gt; files for each share, and writes &lt;code&gt;heir_meta.json&lt;&#x2F;code&gt; to your identity
-directory.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tes heir reconstruct&lt;&#x2F;code&gt; — loads share files (auto-detects binary vs text
-format), validates consistency, reconstructs the secret, derives the Ed25519
-keypair, and optionally installs it to &lt;code&gt;~&#x2F;.tesseras&#x2F;identity&#x2F;&lt;&#x2F;code&gt; (with automatic
-backup of the existing identity).&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tes heir info&lt;&#x2F;code&gt; — displays share metadata and verifies the checksum without
-exposing any secret material.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Secret blob format&lt;&#x2F;strong&gt; — Identity keys are serialized into a versioned blob
-before splitting: a version byte (0x01), a flags byte (0x00 for Ed25519-only),
-followed by the 32-byte Ed25519 secret key. This leaves room for future
-expansion when X25519 and ML-KEM-768 private keys are integrated into the heir
-share system.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 20 unit tests for ShamirSplitter (roundtrip, all share
-combinations, insufficient shares, wrong owner, wrong session, threshold-1
-boundary, large secrets up to ML-KEM-768 key size). 7 unit tests for GF(256)
-arithmetic (exhaustive field properties). 3 property-based tests with proptest
-(arbitrary secrets up to 5000 bytes, arbitrary T-of-N configurations,
-information-theoretic security verification). Serialization roundtrip tests for
-both MessagePack and base64 text formats. 2 integration tests covering the
-complete heir lifecycle: generate identity, split into shares, serialize,
-deserialize, reconstruct, verify keypair, and sign&#x2F;verify with reconstructed
-keys.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;GF(256) over GF(prime)&lt;&#x2F;strong&gt;: we use GF(256) rather than a prime field because
-it maps naturally to bytes — each element is a single byte, each share is the
-same length as the secret. No big-integer arithmetic, no modular reduction, no
-padding. This is the same approach used by most real-world Shamir
-implementations including SSSS and Hashicorp Vault.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Compile-time lookup tables&lt;&#x2F;strong&gt;: the LOG and EXP tables for GF(256) are
-computed at compile time using &lt;code&gt;const fn&lt;&#x2F;code&gt;. This means zero runtime
-initialization cost and constant-time operations via table lookups rather than
-loops.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Session ID prevents cross-session mixing&lt;&#x2F;strong&gt;: each call to &lt;code&gt;split()&lt;&#x2F;code&gt; generates
-a fresh random session ID. If an heir accidentally uses shares from two
-different split sessions (e.g., before and after a key rotation),
-reconstruction fails cleanly with a validation error rather than producing
-garbage output.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 checksums detect corruption&lt;&#x2F;strong&gt;: each share includes a BLAKE3 checksum
-over its contents. This catches bit rot, transmission errors, and accidental
-truncation before any reconstruction attempt. A share printed on paper and
-scanned back via OCR will fail the checksum if a single character is wrong.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Owner fingerprint for identification&lt;&#x2F;strong&gt;: shares include the first 8 bytes of
-BLAKE3(Ed25519 public key) as a fingerprint. This lets heirs verify which
-identity a share belongs to without revealing the full public key. During
-reconstruction, the fingerprint is cross-checked against the recovered key.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Dual format for resilience&lt;&#x2F;strong&gt;: both binary (MessagePack) and text (base64)
-formats are generated because physical media has different failure modes than
-digital storage. A USB drive might fail; paper survives. A QR code might be
-unreadable; base64 text can be manually typed.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Blob versioning&lt;&#x2F;strong&gt;: the secret is wrapped in a versioned blob (version +
-flags + key material) so future versions can include additional keys (X25519,
-ML-KEM-768) without breaking backward compatibility with existing shares.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued: Resilience and Scale&lt;&#x2F;strong&gt; — advanced NAT traversal
-(STUN&#x2F;TURN), performance tuning (connection pooling, fragment caching, SQLite
-WAL), security audits, institutional node onboarding, OS packaging&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;With Shamir&#x27;s Secret Sharing, Tesseras closes the last critical gap in long-term
-preservation. Your memories survive infrastructure failures through erasure
-coding. Your privacy survives quantum computers through hybrid encryption. And
-now, your identity survives you — passed on to the people you chose, requiring
-their cooperation to unlock what you left behind.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 4: Encryption and Sealed Tesseras</title>
- <published>2026-02-14T16:00:00+00:00</published>
- <updated>2026-02-14T16:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase4-encryption-sealed/"/>
- <id>https://tesseras.net/news/phase4-encryption-sealed/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase4-encryption-sealed/">&lt;p&gt;Some memories are not meant for everyone. A private journal, a letter to be
-opened in 2050, a family secret sealed until the grandchildren are old enough.
-Until now, every tessera on the network was open. Phase 4 changes that: Tesseras
-now encrypts private and sealed content with a hybrid cryptographic scheme
-designed to resist both classical and quantum attacks.&lt;&#x2F;p&gt;
-&lt;p&gt;The principle remains the same — encrypt as little as possible. Public memories
-need availability, not secrecy. But when someone creates a private or sealed
-tessera, the content is now locked behind AES-256-GCM encryption with keys
-protected by a hybrid key encapsulation mechanism combining X25519 and
-ML-KEM-768. Both algorithms must be broken to access the content.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;AES-256-GCM encryptor&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;encryption.rs&lt;&#x2F;code&gt;) — Symmetric
-content encryption with random 12-byte nonces and authenticated associated data
-(AAD). The AAD binds ciphertext to its context: for private tesseras, the
-content hash is included; for sealed tesseras, both the content hash and the
-&lt;code&gt;open_after&lt;&#x2F;code&gt; timestamp are bound into the AAD. This means moving ciphertext
-between tesseras with different open dates causes decryption failure — you
-cannot trick the system into opening a sealed memory early by swapping its
-ciphertext into a tessera with an earlier seal date.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Hybrid Key Encapsulation Mechanism&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;kem.rs&lt;&#x2F;code&gt;) — Key
-exchange using X25519 (classical elliptic curve Diffie-Hellman) combined with
-ML-KEM-768 (the NIST-standardized post-quantum lattice-based KEM, formerly
-Kyber). Both shared secrets are combined via &lt;code&gt;blake3::derive_key&lt;&#x2F;code&gt; with a fixed
-context string (&quot;tesseras hybrid kem v1&quot;) to produce a single 256-bit content
-encryption key. This follows the same &quot;dual from day one&quot; philosophy as the
-project&#x27;s dual signing (Ed25519 + ML-DSA): if either algorithm is broken in the
-future, the other still protects the content.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Sealed Key Envelope&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;sealed.rs&lt;&#x2F;code&gt;) — Wraps a content
-encryption key using the hybrid KEM, so only the tessera owner can recover it.
-The KEM produces a transport key, which is XORed with the content key to produce
-a wrapped key stored alongside the KEM ciphertext. On unsealing, the owner
-decapsulates the KEM ciphertext to recover the transport key, then XORs again to
-recover the content key.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Key Publication&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;sealed.rs&lt;&#x2F;code&gt;) — A standalone signed
-artifact for publishing a sealed tessera&#x27;s content key after its &lt;code&gt;open_after&lt;&#x2F;code&gt;
-date has passed. The owner signs the content key, tessera hash, and publication
-timestamp with their dual keys (Ed25519, with ML-DSA placeholder). The manifest
-stays immutable — the key publication is a separate document. Other nodes verify
-the signature against the owner&#x27;s public key before using the published key to
-decrypt the content.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;EncryptionContext&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;enums.rs&lt;&#x2F;code&gt;) — A domain type that
-represents the AAD context for encryption. It lives in tesseras-core rather than
-tesseras-crypto because it&#x27;s a domain concept (not a crypto implementation
-detail). The &lt;code&gt;to_aad_bytes()&lt;&#x2F;code&gt; method produces deterministic serialization: a tag
-byte (0x00 for Private, 0x01 for Sealed), followed by the content hash, and for
-Sealed, the &lt;code&gt;open_after&lt;&#x2F;code&gt; timestamp as little-endian i64.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Domain validation&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) —
-&lt;code&gt;TesseraService::create()&lt;&#x2F;code&gt; now rejects Sealed and Private tesseras that don&#x27;t
-provide encryption keys. This is a domain-level validation: the service layer
-enforces that you cannot create a sealed memory without the cryptographic
-machinery to protect it. The error message is clear: &quot;missing encryption keys
-for visibility sealed until 2050-01-01.&quot;&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Core type updates&lt;&#x2F;strong&gt; — &lt;code&gt;TesseraIdentity&lt;&#x2F;code&gt; now includes an optional
-&lt;code&gt;encryption_public: Option&amp;lt;HybridEncryptionPublic&amp;gt;&lt;&#x2F;code&gt; field containing both the
-X25519 and ML-KEM-768 public keys. &lt;code&gt;KeyAlgorithm&lt;&#x2F;code&gt; gained &lt;code&gt;X25519&lt;&#x2F;code&gt; and &lt;code&gt;MlKem768&lt;&#x2F;code&gt;
-variants. The identity filesystem layout now supports &lt;code&gt;node.x25519.key&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.pub&lt;&#x2F;code&gt;
-and &lt;code&gt;node.mlkem768.key&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.pub&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 8 unit tests for AES-256-GCM (roundtrip, wrong key, tampered
-ciphertext, wrong AAD, cross-context decryption failure, unique nonces, plus 2
-property-based tests for arbitrary payloads and nonce uniqueness). 5 unit tests
-for HybridKem (roundtrip, wrong keypair, tampered X25519, KDF determinism, plus
-1 property-based test). 4 unit tests for SealedKeyEnvelope and KeyPublication. 2
-integration tests covering the complete sealed and private tessera lifecycle:
-generate keys, create content key, encrypt, seal, unseal, decrypt, publish key,
-and verify — the full cycle.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Hybrid KEM from day one&lt;&#x2F;strong&gt;: X25519 + ML-KEM-768 follows the same philosophy
-as dual signing. We don&#x27;t know which cryptographic assumptions will hold over
-millennia, so we combine classical and post-quantum algorithms. The cost is
-~1.2 KB of additional key material per identity — trivial compared to the
-photos and videos in a tessera.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 for KDF&lt;&#x2F;strong&gt;: rather than adding &lt;code&gt;hkdf&lt;&#x2F;code&gt; + &lt;code&gt;sha2&lt;&#x2F;code&gt; as new dependencies, we
-use &lt;code&gt;blake3::derive_key&lt;&#x2F;code&gt; with a fixed context string. BLAKE3&#x27;s key derivation
-mode is specifically designed for this use case, and the project already
-depends on BLAKE3 for content hashing.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Immutable manifests&lt;&#x2F;strong&gt;: when a sealed tessera&#x27;s &lt;code&gt;open_after&lt;&#x2F;code&gt; date passes, the
-content key is published as a separate signed artifact (&lt;code&gt;KeyPublication&lt;&#x2F;code&gt;), not
-by modifying the manifest. This preserves the append-only, content-addressed
-nature of tesseras. The manifest was signed at creation time and never
-changes.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;AAD binding prevents ciphertext swapping&lt;&#x2F;strong&gt;: the &lt;code&gt;EncryptionContext&lt;&#x2F;code&gt; binds
-both the content hash and (for sealed tesseras) the &lt;code&gt;open_after&lt;&#x2F;code&gt; timestamp
-into the AES-GCM authenticated data. An attacker who copies encrypted content
-from a &quot;sealed until 2050&quot; tessera into a &quot;sealed until 2025&quot; tessera will
-find that decryption fails — the AAD no longer matches.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;XOR key wrapping&lt;&#x2F;strong&gt;: the sealed key envelope uses a simple XOR of the content
-key with the KEM-derived transport key, rather than an additional layer of
-AES-GCM. Since the transport key is a fresh random value from the KEM and is
-used exactly once, XOR is information-theoretically secure for this specific
-use case and avoids unnecessary complexity.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Domain validation, not storage validation&lt;&#x2F;strong&gt;: the &quot;missing encryption keys&quot;
-check lives in &lt;code&gt;TesseraService::create()&lt;&#x2F;code&gt;, not in the storage layer. This
-follows the hexagonal architecture pattern: domain rules are enforced at the
-service boundary, not scattered across adapters.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4 continued: Resilience and Scale&lt;&#x2F;strong&gt; — Shamir&#x27;s Secret Sharing for heir
-key distribution, advanced NAT traversal (STUN&#x2F;TURN), performance tuning,
-security audits, OS packaging&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — Public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Sealed tesseras make Tesseras a true time capsule. A father can now record a
-message for his unborn grandchild, seal it until 2060, and know that the
-cryptographic envelope will hold — even if the quantum computers of the future
-try to break it open early.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 3: Memories in Your Hands</title>
- <published>2026-02-14T14:00:00+00:00</published>
- <updated>2026-02-14T14:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase3-api-and-apps/"/>
- <id>https://tesseras.net/news/phase3-api-and-apps/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase3-api-and-apps/">&lt;p&gt;People can now hold their memories in their hands. Phase 3 delivers what the
-previous phases built toward: a mobile app where someone downloads Tesseras,
-creates an identity, takes a photo, and that memory enters the preservation
-network. No cloud accounts, no subscriptions, no company between you and your
-memories.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-embedded&lt;&#x2F;strong&gt; — A full P2P node that runs inside a mobile app. The
-&lt;code&gt;EmbeddedNode&lt;&#x2F;code&gt; struct owns a Tokio runtime, SQLite database, QUIC transport,
-Kademlia DHT engine, replication service, and tessera service — the same stack
-as the desktop daemon, compiled into a shared library. A global singleton
-pattern (&lt;code&gt;Mutex&amp;lt;Option&amp;lt;EmbeddedNode&amp;gt;&amp;gt;&lt;&#x2F;code&gt;) ensures one node per app lifecycle. On
-start, it opens the database, runs migrations, loads or generates an Ed25519
-identity with proof-of-work node ID, binds QUIC on an ephemeral port, wires up
-DHT and replication, and spawns the repair loop. On stop, it sends a shutdown
-signal and drains gracefully.&lt;&#x2F;p&gt;
-&lt;p&gt;Eleven FFI functions are exposed to Dart via flutter_rust_bridge: lifecycle
-(&lt;code&gt;node_start&lt;&#x2F;code&gt;, &lt;code&gt;node_stop&lt;&#x2F;code&gt;, &lt;code&gt;node_is_running&lt;&#x2F;code&gt;), identity (&lt;code&gt;create_identity&lt;&#x2F;code&gt;,
-&lt;code&gt;get_identity&lt;&#x2F;code&gt;), memories (&lt;code&gt;create_memory&lt;&#x2F;code&gt;, &lt;code&gt;get_timeline&lt;&#x2F;code&gt;, &lt;code&gt;get_memory&lt;&#x2F;code&gt;), and
-network status (&lt;code&gt;get_network_stats&lt;&#x2F;code&gt;, &lt;code&gt;get_replication_status&lt;&#x2F;code&gt;). All types
-crossing the FFI boundary are flat structs with only &lt;code&gt;String&lt;&#x2F;code&gt;, &lt;code&gt;Option&amp;lt;String&amp;gt;&lt;&#x2F;code&gt;,
-&lt;code&gt;Vec&amp;lt;String&amp;gt;&lt;&#x2F;code&gt;, and primitives — no trait objects, no generics, no lifetimes.&lt;&#x2F;p&gt;
-&lt;p&gt;Four adapter modules bridge core ports to concrete implementations:
-&lt;code&gt;Blake3HasherAdapter&lt;&#x2F;code&gt;, &lt;code&gt;Ed25519SignerAdapter&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Ed25519VerifierAdapter&lt;&#x2F;code&gt; for
-cryptography, &lt;code&gt;DhtPortAdapter&lt;&#x2F;code&gt; for DHT operations, and
-&lt;code&gt;ReplicationHandlerAdapter&lt;&#x2F;code&gt; for incoming fragment and attestation RPCs.&lt;&#x2F;p&gt;
-&lt;p&gt;The &lt;code&gt;bundled-sqlite&lt;&#x2F;code&gt; feature flag compiles SQLite from source, required for
-Android and iOS where the system library may not be available. Cargokit
-configuration passes this flag automatically in both debug and release builds.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Flutter app&lt;&#x2F;strong&gt; — A Material Design 3 application with Riverpod state
-management, targeting Android, iOS, Linux, macOS, and Windows from a single
-codebase.&lt;&#x2F;p&gt;
-&lt;p&gt;The &lt;em&gt;onboarding flow&lt;&#x2F;em&gt; is three screens: a welcome screen explaining the project
-in one sentence (&quot;Preserve your memories across millennia. No cloud. No
-company.&quot;), an identity creation screen that triggers Ed25519 keypair generation
-in Rust, and a confirmation screen showing the user&#x27;s name and cryptographic
-identity.&lt;&#x2F;p&gt;
-&lt;p&gt;The &lt;em&gt;timeline screen&lt;&#x2F;em&gt; displays memories in reverse chronological order with
-image previews, context text, and chips for memory type and visibility.
-Pull-to-refresh reloads from the Rust node. A floating action button opens the
-&lt;em&gt;memory creation screen&lt;&#x2F;em&gt;, which supports photo selection from gallery or camera
-via &lt;code&gt;image_picker&lt;&#x2F;code&gt;, optional context text, memory type and visibility dropdowns,
-and comma-separated tags. Creating a memory calls the Rust FFI synchronously,
-then returns to the timeline.&lt;&#x2F;p&gt;
-&lt;p&gt;The &lt;em&gt;network screen&lt;&#x2F;em&gt; shows two cards: node status (peer count, DHT size,
-bootstrap state, uptime) and replication health (total fragments, healthy
-fragments, repairing fragments, replication factor). The &lt;em&gt;settings screen&lt;&#x2F;em&gt;
-displays the user&#x27;s identity — name, truncated node ID, truncated public key,
-and creation date.&lt;&#x2F;p&gt;
-&lt;p&gt;Three Riverpod providers manage state: &lt;code&gt;nodeProvider&lt;&#x2F;code&gt; starts the embedded node
-on app launch using the app documents directory and stops it on dispose;
-&lt;code&gt;identityProvider&lt;&#x2F;code&gt; loads the existing profile or creates a new one;
-&lt;code&gt;timelineProvider&lt;&#x2F;code&gt; fetches the memory list with pagination.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 9 Rust unit tests in tesseras-embedded covering node lifecycle
-(start&#x2F;stop without panic), identity persistence across restarts, restart cycles
-without SQLite corruption, network event streaming, stats retrieval, memory
-creation and timeline retrieval, and single memory lookup by hash. 2 Flutter
-tests: an integration test verifying Rust initialization and app startup, and a
-widget smoke test.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Embedded node, not client-server&lt;&#x2F;strong&gt;: the phone runs the full P2P stack, not a
-thin client talking to a remote daemon. This means memories are preserved even
-without internet. Users with a Raspberry Pi or VPS can optionally connect the
-app to their daemon via GraphQL for higher availability, but it&#x27;s not
-required.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Synchronous FFI&lt;&#x2F;strong&gt;: all flutter_rust_bridge functions are marked
-&lt;code&gt;#[frb(sync)]&lt;&#x2F;code&gt; and block on the internal Tokio runtime. This simplifies the
-Dart side (no async bridge complexity) while the Rust side handles concurrency
-internally. Flutter&#x27;s UI thread stays responsive because Riverpod wraps calls
-in async providers.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Global singleton&lt;&#x2F;strong&gt;: a &lt;code&gt;Mutex&amp;lt;Option&amp;lt;EmbeddedNode&amp;gt;&amp;gt;&lt;&#x2F;code&gt; global ensures the node
-lifecycle is predictable — one start, one stop, no races. Mobile platforms
-kill processes aggressively, so simplicity in lifecycle management is a
-feature.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Flat FFI types&lt;&#x2F;strong&gt;: no Rust abstractions leak across the FFI boundary. Every
-type is a plain struct with strings and numbers. This makes the auto-generated
-Dart bindings reliable and easy to debug.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Three-screen onboarding&lt;&#x2F;strong&gt;: identity creation is the only required step. No
-email, no password, no server registration. The app generates a cryptographic
-identity locally and is ready to use.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4: Resilience and Scale&lt;&#x2F;strong&gt; — Advanced NAT traversal (STUN&#x2F;TURN),
-Shamir&#x27;s Secret Sharing for heirs, sealed tesseras with time-lock encryption,
-performance tuning, security audits, OS packaging for
-Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — Public tessera browser by
-era&#x2F;location&#x2F;theme&#x2F;language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;The infrastructure is complete. The network exists, replication works, and now
-anyone with a phone can participate. What remains is hardening what we have and
-opening it to the world.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Reed-Solomon: How Tesseras Survives Data Loss</title>
- <published>2026-02-14T14:00:00+00:00</published>
- <updated>2026-02-14T14:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/reed-solomon/"/>
- <id>https://tesseras.net/news/reed-solomon/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/reed-solomon/">&lt;p&gt;Your hard drive will die. Your cloud provider will pivot. The RAID array in your
-closet will outlive its controller but not its owner. If a memory is stored in
-exactly one place, it has exactly one way to be lost forever.&lt;&#x2F;p&gt;
-&lt;p&gt;Tesseras is a network that keeps human memories alive through mutual aid. The
-core survival mechanism is &lt;strong&gt;Reed-Solomon erasure coding&lt;&#x2F;strong&gt; — a technique
-borrowed from deep-space communication that lets us reconstruct data even when
-pieces go missing.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-is-reed-solomon&quot;&gt;What is Reed-Solomon?&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon is a family of error-correcting codes invented by Irving Reed and
-Gustave Solomon in 1960. The original use case was correcting errors in data
-transmitted over noisy channels — think Voyager sending photos from Jupiter, or
-a CD playing despite scratches.&lt;&#x2F;p&gt;
-&lt;p&gt;The key insight: if you add carefully computed redundancy to your data &lt;em&gt;before&lt;&#x2F;em&gt;
-something goes wrong, you can recover the original even after losing some
-pieces.&lt;&#x2F;p&gt;
-&lt;p&gt;Here&#x27;s the intuition. Suppose you have a polynomial of degree 2 — a parabola.
-You need 3 points to define it uniquely. But if you evaluate it at 5 points, you
-can lose any 2 of those 5 and still reconstruct the polynomial from the
-remaining 3. Reed-Solomon generalizes this idea to work over finite fields
-(Galois fields), where the &quot;polynomial&quot; is your data and the &quot;evaluation points&quot;
-are your fragments.&lt;&#x2F;p&gt;
-&lt;p&gt;In concrete terms:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Split&lt;&#x2F;strong&gt; your data into &lt;em&gt;k&lt;&#x2F;em&gt; data shards&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Compute&lt;&#x2F;strong&gt; &lt;em&gt;m&lt;&#x2F;em&gt; parity shards from the data shards&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Distribute&lt;&#x2F;strong&gt; all &lt;em&gt;k + m&lt;&#x2F;em&gt; shards across different locations&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reconstruct&lt;&#x2F;strong&gt; the original data from any &lt;em&gt;k&lt;&#x2F;em&gt; of the &lt;em&gt;k + m&lt;&#x2F;em&gt; shards&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;You can lose up to &lt;em&gt;m&lt;&#x2F;em&gt; shards — any &lt;em&gt;m&lt;&#x2F;em&gt;, data or parity, in any combination —
-and still recover everything.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;why-not-just-make-copies&quot;&gt;Why not just make copies?&lt;&#x2F;h2&gt;
-&lt;p&gt;The naive approach to redundancy is replication: make 3 copies, store them in 3
-places. This gives you tolerance for 2 failures at the cost of 3x your storage.&lt;&#x2F;p&gt;
-&lt;p&gt;Reed-Solomon is dramatically more efficient:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Strategy&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Storage overhead&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Failures tolerated&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;3x replication&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;200%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2 out of 3&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Reed-Solomon (16,8)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;50%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;8 out of 24&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Reed-Solomon (48,24)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;50%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24 out of 72&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;With 16 data shards and 8 parity shards, you use 50% extra storage but can
-survive losing a third of all fragments. To achieve the same fault tolerance
-with replication alone, you&#x27;d need 3x the storage.&lt;&#x2F;p&gt;
-&lt;p&gt;For a network that aims to preserve memories across decades and centuries, this
-efficiency isn&#x27;t a nice-to-have — it&#x27;s the difference between a viable system
-and one that drowns in its own overhead.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;how-tesseras-uses-reed-solomon&quot;&gt;How Tesseras uses Reed-Solomon&lt;&#x2F;h2&gt;
-&lt;p&gt;Not all data deserves the same treatment. A 500-byte text memory and a 100 MB
-video have very different redundancy needs. Tesseras uses a three-tier
-fragmentation strategy:&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Small (&amp;lt; 4 MB)&lt;&#x2F;strong&gt; — Whole-file replication to 7 peers. For small tesseras, the
-overhead of erasure coding (encoding time, fragment management, reconstruction
-logic) outweighs its benefits. Simple copies are faster and simpler.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Medium (4–256 MB)&lt;&#x2F;strong&gt; — 16 data shards + 8 parity shards = 24 total fragments.
-Each fragment is roughly 1&#x2F;16th of the original size. Any 16 of the 24 fragments
-reconstruct the original. Distributed across 7 peers.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Large (≥ 256 MB)&lt;&#x2F;strong&gt; — 48 data shards + 24 parity shards = 72 total fragments.
-Higher shard count means smaller individual fragments (easier to transfer and
-store) and higher absolute fault tolerance. Also distributed across 7 peers.&lt;&#x2F;p&gt;
-&lt;p&gt;The implementation uses the &lt;code&gt;reed-solomon-erasure&lt;&#x2F;code&gt; crate operating over GF(2⁸) —
-the same Galois field used in QR codes and CDs. Each fragment carries a BLAKE3
-checksum so corruption is detected immediately, not silently propagated.&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;Tessera (120 MB photo album)
- ↓ encode
-16 data shards (7.5 MB each) + 8 parity shards (7.5 MB each)
- ↓ distribute
-24 fragments across 7 peers (subnet-diverse)
- ↓ any 16 fragments
-Original tessera recovered
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;the-challenges&quot;&gt;The challenges&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon solves the mathematical problem of redundancy. The engineering
-challenges are everything around it.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;fragment-tracking&quot;&gt;Fragment tracking&lt;&#x2F;h3&gt;
-&lt;p&gt;Every fragment needs to be findable. Tesseras uses a Kademlia DHT for peer
-discovery and fragment-to-peer mapping. When a node goes offline, its fragments
-need to be re-created and distributed to new peers. This means tracking which
-fragments exist, where they are, and whether they&#x27;re still intact — across a
-network with no central authority.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;silent-corruption&quot;&gt;Silent corruption&lt;&#x2F;h3&gt;
-&lt;p&gt;A fragment that returns wrong data is worse than one that&#x27;s missing — at least a
-missing fragment is honestly absent. Tesseras addresses this with
-attestation-based health checks: the repair loop periodically asks fragment
-holders to prove possession by returning BLAKE3 checksums. If a checksum doesn&#x27;t
-match, the fragment is treated as lost.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;correlated-failures&quot;&gt;Correlated failures&lt;&#x2F;h3&gt;
-&lt;p&gt;If all 24 fragments of a tessera land on machines in the same datacenter, a
-single power outage kills them all. Reed-Solomon&#x27;s math assumes independent
-failures. Tesseras enforces &lt;strong&gt;subnet diversity&lt;&#x2F;strong&gt; during distribution: no more
-than 2 fragments per &#x2F;24 IPv4 subnet (or &#x2F;48 IPv6 prefix). This spreads
-fragments across different physical infrastructure.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;repair-speed-vs-network-load&quot;&gt;Repair speed vs. network load&lt;&#x2F;h3&gt;
-&lt;p&gt;When a peer goes offline, the clock starts ticking. Lost fragments need to be
-re-created before more failures accumulate. But aggressive repair floods the
-network. Tesseras balances this with a configurable repair loop (default: every
-24 hours with 2-hour jitter) and concurrent transfer limits (default: 4
-simultaneous transfers). The jitter prevents repair storms where every node
-checks its fragments at the same moment.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;long-term-key-management&quot;&gt;Long-term key management&lt;&#x2F;h3&gt;
-&lt;p&gt;Reed-Solomon protects against data loss, not against losing access. If a tessera
-is encrypted (private or sealed visibility), you need the decryption key to make
-the recovered data useful. Tesseras separates these concerns: erasure coding
-handles availability, while Shamir&#x27;s Secret Sharing (a future phase) will handle
-key distribution among heirs. The project&#x27;s design philosophy — encrypt as
-little as possible — keeps the key management problem small.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;galois-field-limitations&quot;&gt;Galois field limitations&lt;&#x2F;h3&gt;
-&lt;p&gt;The GF(2⁸) field limits the total number of shards to 255 (data + parity
-combined). For Tesseras, this is not a practical constraint — even the Large
-tier uses only 72 shards. But it does mean that extremely large files with
-thousands of fragments would require either a different field or a layered
-encoding scheme.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;evolving-codec-compatibility&quot;&gt;Evolving codec compatibility&lt;&#x2F;h3&gt;
-&lt;p&gt;A tessera encoded today must be decodable in 50 years. Reed-Solomon over GF(2⁸)
-is one of the most widely implemented algorithms in computing — it&#x27;s in every CD
-player, every QR code scanner, every deep-space probe. This ubiquity is itself a
-survival strategy. The algorithm won&#x27;t be forgotten because half the world&#x27;s
-infrastructure depends on it.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;the-bigger-picture&quot;&gt;The bigger picture&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon is a piece of a larger puzzle. It works in concert with:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Kademlia DHT&lt;&#x2F;strong&gt; for finding peers and routing fragments&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 checksums&lt;&#x2F;strong&gt; for integrity verification&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Bilateral reciprocity&lt;&#x2F;strong&gt; for fair storage exchange (no blockchain needed)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Subnet diversity&lt;&#x2F;strong&gt; for failure independence&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Automatic repair&lt;&#x2F;strong&gt; for maintaining redundancy over time&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;No single technique makes memories survive. Reed-Solomon ensures that data &lt;em&gt;can&lt;&#x2F;em&gt;
-be recovered. The DHT ensures fragments &lt;em&gt;can be found&lt;&#x2F;em&gt;. Reciprocity ensures
-peers &lt;em&gt;want to help&lt;&#x2F;em&gt;. Repair ensures none of this degrades over time.&lt;&#x2F;p&gt;
-&lt;p&gt;A tessera is a bet that the sum of these mechanisms, running across many
-independent machines operated by many independent people, is more durable than
-any single institution. Reed-Solomon is the mathematical foundation of that bet.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 2: Memories Survive</title>
- <published>2026-02-14T12:00:00+00:00</published>
- <updated>2026-02-14T12:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase2-replication/"/>
- <id>https://tesseras.net/news/phase2-replication/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase2-replication/">&lt;p&gt;A tessera is no longer tied to a single machine. Phase 2 delivers the
-replication layer: data is split into erasure-coded fragments, distributed
-across multiple peers, and automatically repaired when nodes go offline. A
-bilateral reciprocity ledger ensures fair storage exchange — no blockchain, no
-tokens.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; (updated) — New replication domain types: &lt;code&gt;FragmentPlan&lt;&#x2F;code&gt;
-(selects fragmentation tier based on tessera size), &lt;code&gt;FragmentId&lt;&#x2F;code&gt; (tessera hash +
-index + shard count + checksum), &lt;code&gt;FragmentEnvelope&lt;&#x2F;code&gt; (fragment with its metadata
-for wire transport), &lt;code&gt;FragmentationTier&lt;&#x2F;code&gt; (Small&#x2F;Medium&#x2F;Large), &lt;code&gt;Attestation&lt;&#x2F;code&gt;
-(proof that a node holds a fragment at a given time), and &lt;code&gt;ReplicateAck&lt;&#x2F;code&gt;
-(acknowledgement of fragment receipt). Three new port traits define the
-hexagonal boundaries: &lt;code&gt;DhtPort&lt;&#x2F;code&gt; (find peers, replicate fragments, request
-attestations, ping), &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; (store&#x2F;read&#x2F;delete&#x2F;list&#x2F;verify fragments),
-and &lt;code&gt;ReciprocityLedger&lt;&#x2F;code&gt; (record storage exchanges, query balances, find best
-peers). Maximum tessera size is 1 GB.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-crypto&lt;&#x2F;strong&gt; (updated) — The existing &lt;code&gt;ReedSolomonCoder&lt;&#x2F;code&gt; now powers
-fragment encoding. Data is split into shards, parity shards are computed, and
-any combination of data shards can reconstruct the original — as long as the
-number of missing shards does not exceed the parity count.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-storage&lt;&#x2F;strong&gt; (updated) — Two new adapters:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt; — stores fragment data as files on disk
-(&lt;code&gt;{root}&#x2F;{tessera_hash}&#x2F;{index:03}.shard&lt;&#x2F;code&gt;) with a SQLite metadata index
-tracking tessera hash, shard index, shard count, checksum, and byte size.
-Verification recomputes the BLAKE3 hash and compares it to the stored
-checksum.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;SqliteReciprocityLedger&lt;&#x2F;code&gt; — bilateral storage accounting in SQLite. Each peer
-has a row tracking bytes stored for them and bytes they store for us. The
-&lt;code&gt;balance&lt;&#x2F;code&gt; column is a generated column
-(&lt;code&gt;bytes_they_store_for_us - bytes_stored_for_them&lt;&#x2F;code&gt;). UPSERT ensures atomic
-increment of counters.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;New migration (&lt;code&gt;002_replication.sql&lt;&#x2F;code&gt;) adds tables for fragments, fragment plans,
-holders, holder-fragment mappings, and reciprocity balances.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-dht&lt;&#x2F;strong&gt; (updated) — Four new message variants: &lt;code&gt;Replicate&lt;&#x2F;code&gt; (send a
-fragment envelope), &lt;code&gt;ReplicateAck&lt;&#x2F;code&gt; (confirm receipt), &lt;code&gt;AttestRequest&lt;&#x2F;code&gt; (ask a
-node to prove it holds a tessera&#x27;s fragments), and &lt;code&gt;AttestResponse&lt;&#x2F;code&gt; (return
-attestation with checksums and timestamp). The engine handles these in its
-message dispatch loop.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-replication&lt;&#x2F;strong&gt; — The new crate, with five modules:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Fragment encoding&lt;&#x2F;em&gt; (&lt;code&gt;fragment.rs&lt;&#x2F;code&gt;): &lt;code&gt;encode_tessera()&lt;&#x2F;code&gt; selects the
-fragmentation tier based on size, then calls Reed-Solomon encoding for Medium
-and Large tiers. Three tiers:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Small&lt;&#x2F;strong&gt; (&amp;lt; 4 MB): whole-file replication to r=7 peers, no erasure coding&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Medium&lt;&#x2F;strong&gt; (4–256 MB): 16 data + 8 parity shards, distributed across r=7
-peers&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Large&lt;&#x2F;strong&gt; (≥ 256 MB): 48 data + 24 parity shards, distributed across r=7
-peers&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Distribution&lt;&#x2F;em&gt; (&lt;code&gt;distributor.rs&lt;&#x2F;code&gt;): subnet diversity filtering limits peers per
-&#x2F;24 IPv4 subnet (or &#x2F;48 IPv6 prefix) to avoid correlated failures. If all your
-fragments land on the same rack, a single power outage kills them all.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Service&lt;&#x2F;em&gt; (&lt;code&gt;service.rs&lt;&#x2F;code&gt;): &lt;code&gt;ReplicationService&lt;&#x2F;code&gt; is the orchestrator.
-&lt;code&gt;replicate_tessera()&lt;&#x2F;code&gt; encodes the data, finds the closest peers via DHT,
-applies subnet diversity, and distributes fragments round-robin.
-&lt;code&gt;receive_fragment()&lt;&#x2F;code&gt; validates the BLAKE3 checksum, checks reciprocity balance
-(rejects if the sender&#x27;s deficit exceeds the configured threshold), stores the
-fragment, and updates the ledger. &lt;code&gt;handle_attestation_request()&lt;&#x2F;code&gt; lists local
-fragments and computes their checksums as proof of possession.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Repair&lt;&#x2F;em&gt; (&lt;code&gt;repair.rs&lt;&#x2F;code&gt;): &lt;code&gt;check_tessera_health()&lt;&#x2F;code&gt; requests attestations from
-known holders, falls back to ping for unresponsive nodes, verifies local
-fragment integrity, and returns one of three actions: &lt;code&gt;Healthy&lt;&#x2F;code&gt;,
-&lt;code&gt;NeedsReplication { deficit }&lt;&#x2F;code&gt;, or &lt;code&gt;CorruptLocal { fragment_index }&lt;&#x2F;code&gt;. The
-repair loop runs every 24 hours (with 2-hour jitter) via &lt;code&gt;tokio::select!&lt;&#x2F;code&gt; with
-shutdown integration.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Configuration&lt;&#x2F;em&gt; (&lt;code&gt;config.rs&lt;&#x2F;code&gt;): &lt;code&gt;ReplicationConfig&lt;&#x2F;code&gt; with defaults for repair
-interval (24h), jitter (2h), concurrent transfers (4), minimum free space (1
-GB), deficit allowance (256 MB), and per-peer storage limit (1 GB).&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;tesd&lt;&#x2F;strong&gt; (updated) — The daemon now opens a SQLite database (&lt;code&gt;db&#x2F;tesseras.db&lt;&#x2F;code&gt;),
-runs migrations, creates &lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt;, &lt;code&gt;SqliteReciprocityLedger&lt;&#x2F;code&gt;, and
-&lt;code&gt;FsBlobStore&lt;&#x2F;code&gt; instances, wraps the DHT engine in a &lt;code&gt;DhtPortAdapter&lt;&#x2F;code&gt;, builds a
-&lt;code&gt;ReplicationService&lt;&#x2F;code&gt;, and spawns the repair loop as a background task with
-graceful shutdown.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 193 tests across the workspace:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;15 unit tests in tesseras-replication (fragment encoding tiers, checksum
-validation, subnet diversity, repair health checks, service receive&#x2F;replicate
-flows)&lt;&#x2F;li&gt;
-&lt;li&gt;3 integration tests with real storage (full encode→distribute→receive cycle
-for medium tessera, small whole-file replication, tampered fragment rejection)&lt;&#x2F;li&gt;
-&lt;li&gt;Tests use in-memory SQLite + tempdir fragments with mockall mocks for DHT and
-BlobStore&lt;&#x2F;li&gt;
-&lt;li&gt;Zero clippy warnings, clean formatting&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Three-tier fragmentation&lt;&#x2F;strong&gt;: small files don&#x27;t need erasure coding — the
-overhead isn&#x27;t worth it. Medium and large files get progressively more parity
-shards. This avoids wasting storage on small tesseras while providing strong
-redundancy for large ones.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Owner-push distribution&lt;&#x2F;strong&gt;: the tessera owner encodes fragments and pushes
-them to peers, rather than peers pulling. This simplifies the protocol (no
-negotiation phase) and ensures fragments are distributed immediately.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Bilateral reciprocity without consensus&lt;&#x2F;strong&gt;: each node tracks its own balance
-with each peer locally. No global ledger, no token, no blockchain. If peer A
-stores 500 MB for peer B, peer B should store roughly 500 MB for peer A. Free
-riders lose redundancy gradually — their fragments are deprioritized for
-repair, but never deleted.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Subnet diversity&lt;&#x2F;strong&gt;: fragments are spread across different network subnets to
-survive correlated failures. A datacenter outage shouldn&#x27;t take out all copies
-of a tessera.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Attestation-first health checks&lt;&#x2F;strong&gt;: the repair loop asks holders to prove
-possession (attestation with checksums) before declaring a tessera degraded.
-Only when attestation fails does it fall back to a simple ping. This catches
-silent data corruption, not just node departure.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 3: API and Apps&lt;&#x2F;strong&gt; — Flutter mobile&#x2F;desktop app via
-flutter_rust_bridge, GraphQL API (async-graphql), WASM browser node&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4: Resilience and Scale&lt;&#x2F;strong&gt; — ML-DSA post-quantum signatures, advanced
-NAT traversal, Shamir&#x27;s Secret Sharing for heirs, packaging for
-Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI on SourceHut&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser, institutional
-curation, genealogy integration, physical media export&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Nodes can find each other and keep each other&#x27;s memories alive. Next, we give
-people a way to hold their memories in their hands.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 1: Nodes Find Each Other</title>
- <published>2026-02-14T11:00:00+00:00</published>
- <updated>2026-02-14T11:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase1-basic-network/"/>
- <id>https://tesseras.net/news/phase1-basic-network/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase1-basic-network/">&lt;p&gt;Tesseras is no longer a local-only tool. Phase 1 delivers the networking layer:
-nodes discover each other through a Kademlia DHT, communicate over QUIC, and
-publish tessera pointers that any peer on the network can find. A tessera
-created on node A is now findable from node C.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; (updated) — New network domain types: &lt;code&gt;TesseraPointer&lt;&#x2F;code&gt;
-(lightweight reference to a tessera&#x27;s holders and fragment locations),
-&lt;code&gt;NodeIdentity&lt;&#x2F;code&gt; (node ID + public key + proof-of-work nonce), &lt;code&gt;NodeInfo&lt;&#x2F;code&gt;
-(identity + address + capabilities), and &lt;code&gt;Capabilities&lt;&#x2F;code&gt; (bitflags for what a
-node supports: DHT, storage, relay, replication).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-net&lt;&#x2F;strong&gt; — The transport layer, built on QUIC via quinn. The &lt;code&gt;Transport&lt;&#x2F;code&gt;
-trait defines the port: &lt;code&gt;send&lt;&#x2F;code&gt;, &lt;code&gt;recv&lt;&#x2F;code&gt;, &lt;code&gt;disconnect&lt;&#x2F;code&gt;, &lt;code&gt;local_addr&lt;&#x2F;code&gt;. Two adapters
-implement it:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;QuinnTransport&lt;&#x2F;code&gt; — real QUIC with self-signed TLS, ALPN negotiation
-(&lt;code&gt;tesseras&#x2F;1&lt;&#x2F;code&gt;), connection pooling via DashMap, and a background accept loop
-that handles incoming streams.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;MemTransport&lt;&#x2F;code&gt; + &lt;code&gt;SimNetwork&lt;&#x2F;code&gt; — in-memory channels for deterministic testing
-without network I&#x2F;O. Every integration test in the DHT crate runs against
-this.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;The wire protocol uses length-prefixed MessagePack: a 4-byte big-endian length
-header followed by an rmp-serde payload. &lt;code&gt;WireMessage&lt;&#x2F;code&gt; carries a version byte,
-request ID, and a body that can be a request, response, or protocol-level error.
-Maximum message size is 64 KiB.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-dht&lt;&#x2F;strong&gt; — A complete Kademlia implementation:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;em&gt;Routing table&lt;&#x2F;em&gt;: 160 k-buckets with k=20. Least-recently-seen eviction,
-move-to-back on update, ping-check before replacing a full bucket&#x27;s oldest
-entry.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;XOR distance&lt;&#x2F;em&gt;: 160-bit XOR metric with bucket indexing by highest differing
-bit.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Proof-of-work&lt;&#x2F;em&gt;: nodes grind a nonce until &lt;code&gt;BLAKE3(pubkey || nonce)[..20]&lt;&#x2F;code&gt; has
-8 leading zero bits (~256 hash attempts on average). Cheap enough for any
-device, expensive enough to make Sybil attacks impractical at scale.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Protocol messages&lt;&#x2F;em&gt;: Ping&#x2F;Pong, FindNode&#x2F;FindNodeResponse,
-FindValue&#x2F;FindValueResult, Store — all serialized with MessagePack via serde.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Pointer store&lt;&#x2F;em&gt;: bounded in-memory store with configurable TTL (24 hours
-default) and max entries (10,000 default). When full, evicts pointers furthest
-from the local node ID, following Kademlia&#x27;s distance-based responsibility
-model.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;DhtEngine&lt;&#x2F;em&gt;: the main orchestrator. Handles incoming RPCs, runs iterative
-lookups (alpha=3 parallelism), bootstrap, publish, and find. The &lt;code&gt;run()&lt;&#x2F;code&gt;
-method drives a &lt;code&gt;tokio::select!&lt;&#x2F;code&gt; loop with maintenance timers: routing table
-refresh every 60 seconds, pointer expiry every 5 minutes.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;tesd&lt;&#x2F;strong&gt; — A full-node binary. Parses CLI args (bind address, bootstrap peers,
-data directory), generates a PoW-valid node identity, binds a QUIC endpoint,
-bootstraps into the network, and runs the DHT engine. Graceful shutdown on
-Ctrl+C via tokio signal handling.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Infrastructure&lt;&#x2F;strong&gt; — OpenTofu configuration for two Hetzner Cloud bootstrap
-nodes (cx22 instances in Falkenstein, Germany and Helsinki, Finland). Cloud-init
-provisioning script creates a dedicated &lt;code&gt;tesseras&lt;&#x2F;code&gt; user, writes a config file,
-and sets up a systemd service. Firewall rules open UDP 4433 (QUIC) and restrict
-metrics to internal access.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 139 tests across the workspace:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;47 unit tests in tesseras-dht (routing table, distance, PoW, pointer store,
-message serialization, engine RPCs)&lt;&#x2F;li&gt;
-&lt;li&gt;5 multi-node integration tests (3-node bootstrap, 10-node lookup convergence,
-publish-and-find, node departure detection, PoW rejection)&lt;&#x2F;li&gt;
-&lt;li&gt;14 tests in tesseras-net (codec roundtrips, transport send&#x2F;recv, backpressure,
-disconnect)&lt;&#x2F;li&gt;
-&lt;li&gt;Docker Compose smoke tests with 3 containerized nodes communicating over real
-QUIC&lt;&#x2F;li&gt;
-&lt;li&gt;Zero clippy warnings, clean formatting&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Transport as a port&lt;&#x2F;strong&gt;: the &lt;code&gt;Transport&lt;&#x2F;code&gt; trait is the only interface between
-the DHT engine and the network. Swapping QUIC for any other protocol means
-implementing four methods. All DHT tests use the in-memory adapter, making
-them fast and deterministic.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;One stream per RPC&lt;&#x2F;strong&gt;: each DHT request-response pair uses a fresh
-bidirectional QUIC stream. No multiplexing complexity, no head-of-line
-blocking between independent operations. QUIC handles the multiplexing at the
-connection level.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;MessagePack over Protobuf&lt;&#x2F;strong&gt;: compact binary encoding without code generation
-or schema files. Serde integration means adding a field to a message is a
-one-line change. Trade-off: no built-in schema evolution guarantees, but at
-this stage velocity matters more.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;PoW instead of stake or reputation&lt;&#x2F;strong&gt;: a node identity costs ~256 BLAKE3
-hashes. This runs in under a second on any hardware, including a Raspberry Pi,
-but generating thousands of identities for a Sybil attack becomes expensive.
-No tokens, no blockchain, no external dependencies.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Iterative lookup with routing table updates&lt;&#x2F;strong&gt;: discovered nodes are added to
-the routing table as they&#x27;re encountered during iterative lookups, following
-standard Kademlia behavior. This ensures the routing table improves
-organically as nodes interact.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 2: Replication&lt;&#x2F;strong&gt; — Reed-Solomon erasure coding over the network,
-fragment distribution, automatic repair loops, bilateral reciprocity ledger
-(no blockchain, no tokens)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 3: API and Apps&lt;&#x2F;strong&gt; — Flutter mobile&#x2F;desktop app via
-flutter_rust_bridge, GraphQL API (async-graphql), WASM browser node&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4: Resilience and Scale&lt;&#x2F;strong&gt; — ML-DSA post-quantum signatures, advanced
-NAT traversal, Shamir&#x27;s Secret Sharing for heirs, packaging for
-Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI on SourceHut&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 5: Exploration and Culture&lt;&#x2F;strong&gt; — public tessera browser, institutional
-curation, genealogy integration, physical media export&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Nodes can find each other. Next, they learn to keep each other&#x27;s memories alive.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Phase 0: Foundation Laid</title>
- <published>2026-02-14T10:00:00+00:00</published>
- <updated>2026-02-14T10:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/phase0-foundation/"/>
- <id>https://tesseras.net/news/phase0-foundation/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/phase0-foundation/">&lt;p&gt;The first milestone of the Tesseras project is complete. Phase 0 establishes the
-foundation that every future component will build on: domain types,
-cryptography, storage, and a usable command-line interface.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;what-was-built&quot;&gt;What was built&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; — The domain layer defines the tessera format: &lt;code&gt;ContentHash&lt;&#x2F;code&gt;
-(BLAKE3, 32 bytes), &lt;code&gt;NodeId&lt;&#x2F;code&gt; (Kademlia, 20 bytes), memory types (Moment,
-Reflection, Daily, Relation, Object), visibility modes (Private, Circle, Public,
-PublicAfterDeath, Sealed), and a plain-text manifest format that can be parsed
-by any programming language for the next thousand years. The application service
-layer (&lt;code&gt;TesseraService&lt;&#x2F;code&gt;) handles create, verify, export, and list operations
-through port traits, following hexagonal architecture.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-crypto&lt;&#x2F;strong&gt; — Ed25519 key generation, signing, and verification. A
-dual-signature framework (Ed25519 + ML-DSA placeholder) ready for post-quantum
-migration. BLAKE3 content hashing. Reed-Solomon erasure coding behind a feature
-flag for future replication.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-storage&lt;&#x2F;strong&gt; — SQLite index via rusqlite with plain-SQL migrations.
-Filesystem blob store with content-addressable layout
-(&lt;code&gt;blobs&#x2F;&amp;lt;tessera_hash&amp;gt;&#x2F;&amp;lt;memory_hash&amp;gt;&#x2F;&amp;lt;filename&amp;gt;&lt;&#x2F;code&gt;). Identity key persistence on
-disk.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-cli&lt;&#x2F;strong&gt; — A working &lt;code&gt;tesseras&lt;&#x2F;code&gt; binary with five commands:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;init&lt;&#x2F;code&gt; — generates Ed25519 identity, creates SQLite database&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;create &amp;lt;dir&amp;gt;&lt;&#x2F;code&gt; — scans a directory for media files, creates a signed tessera&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;verify &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt; — checks signature and file integrity&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;export &amp;lt;hash&amp;gt; &amp;lt;dest&amp;gt;&lt;&#x2F;code&gt; — writes a self-contained tessera directory&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;list&lt;&#x2F;code&gt; — shows a table of stored tesseras&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Testing&lt;&#x2F;strong&gt; — 67+ tests across the workspace: unit tests in every module,
-property-based tests (proptest) for hex roundtrips and manifest serialization,
-integration tests covering the full create-verify-export cycle including
-tampered file and invalid signature detection. Zero clippy warnings.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;architecture-decisions&quot;&gt;Architecture decisions&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Hexagonal architecture&lt;&#x2F;strong&gt;: crypto operations are injected via trait objects
-(&lt;code&gt;Box&amp;lt;dyn Hasher&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;Box&amp;lt;dyn ManifestSigner&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;Box&amp;lt;dyn ManifestVerifier&amp;gt;&lt;&#x2F;code&gt;),
-keeping the core crate free of concrete crypto dependencies.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Feature flags&lt;&#x2F;strong&gt;: the &lt;code&gt;service&lt;&#x2F;code&gt; feature on tesseras-core gates the async
-application layer. The &lt;code&gt;classical&lt;&#x2F;code&gt; and &lt;code&gt;erasure&lt;&#x2F;code&gt; features on tesseras-crypto
-control which algorithms are compiled in.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Plain-text manifest&lt;&#x2F;strong&gt;: parseable without any binary format library, with
-explicit &lt;code&gt;blake3:&lt;&#x2F;code&gt; hash prefixes and human-readable layout.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;&#x2F;h2&gt;
-&lt;p&gt;Phase 0 is the local-only foundation. The road ahead:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Phase 1: Networking&lt;&#x2F;strong&gt; — QUIC transport (quinn), Kademlia DHT for peer
-discovery, NAT traversal&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 2: Replication&lt;&#x2F;strong&gt; — Reed-Solomon erasure coding over the network,
-repair loops, bilateral reciprocity (no blockchain, no tokens)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 3: Clients&lt;&#x2F;strong&gt; — Flutter mobile&#x2F;desktop app via flutter_rust_bridge,
-GraphQL API, WASM browser node&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Phase 4: Hardening&lt;&#x2F;strong&gt; — ML-DSA post-quantum signatures, packaging for
-Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI on SourceHut&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;The tessera format is stable. Everything built from here connects to and extends
-what exists today.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="en">
- <title>Hello, World</title>
- <published>2026-02-13T00:00:00+00:00</published>
- <updated>2026-02-13T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/news/hello-world/"/>
- <id>https://tesseras.net/news/hello-world/</id>
-
- <content type="html" xml:base="https://tesseras.net/news/hello-world/">&lt;p&gt;Today we&#x27;re announcing the Tesseras project: a peer-to-peer network for
-preserving human memories across millennia.&lt;&#x2F;p&gt;
-&lt;p&gt;Tesseras is built on a simple idea — your photos, recordings, and writings
-deserve to outlast any company, platform, or file format. Each person creates a
-tessera, a self-contained time capsule that the network keeps alive through
-mutual aid and redundancy.&lt;&#x2F;p&gt;
-&lt;p&gt;The project is in its earliest stage. We&#x27;re building the foundation: tools to
-create, verify, and export tesseras offline. The network layer, replication, and
-apps will follow.&lt;&#x2F;p&gt;
-&lt;p&gt;If this mission resonates with you, &lt;a href=&quot;&#x2F;subscriptions&#x2F;&quot;&gt;join the mailing list&lt;&#x2F;a&gt; or
-browse the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras&quot;&gt;source code&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
-</feed>
diff --git a/news/atom.xml.gz b/news/atom.xml.gz
deleted file mode 100644
index e04e2c9..0000000
--- a/news/atom.xml.gz
+++ /dev/null
Binary files differ
diff --git a/news/cli-daemon-rpc/index.html b/news/cli-daemon-rpc/index.html
deleted file mode 100644
index a1ca0c1..0000000
--- a/news/cli-daemon-rpc/index.html
+++ /dev/null
@@ -1,142 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>CLI Meets Network: Publish, Fetch, and Status Commands — Tesseras</title>
- <meta name="description" content="The tesseras CLI can now publish tesseras to the network, fetch them from peers, and monitor replication status — all through a new Unix socket RPC bridge to the daemon.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="CLI Meets Network: Publish, Fetch, and Status Commands">
- <meta property="og:description" content="The tesseras CLI can now publish tesseras to the network, fetch them from peers, and monitor replication status — all through a new Unix socket RPC bridge to the daemon.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="CLI Meets Network: Publish, Fetch, and Status Commands">
- <meta name="twitter:description" content="The tesseras CLI can now publish tesseras to the network, fetch them from peers, and monitor replication status — all through a new Unix socket RPC bridge to the daemon.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;cli-daemon-rpc&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>CLI Meets Network: Publish, Fetch, and Status Commands</h2>
- <p class="news-date">2026-02-15</p>
- <p>Until now the CLI operated in isolation: create a tessera, verify it, export it,
-list what you have. Everything stayed on your machine. With this release, <code>tes</code>
-gains three commands that bridge the gap between local storage and the P2P
-network — <code>publish</code>, <code>fetch</code>, and <code>status</code> — by talking to a running <code>tesd</code> over
-a Unix socket.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong><code>tesseras-rpc</code> crate</strong> — A new shared crate that both the CLI and daemon
-depend on. It defines the RPC protocol using MessagePack serialization with
-length-prefixed framing (4-byte big-endian size header, 64 MiB max). Three
-request types (<code>Publish</code>, <code>Fetch</code>, <code>Status</code>) and their corresponding responses.
-A sync <code>DaemonClient</code> handles the Unix socket connection with configurable
-timeouts. The protocol is deliberately simple — one request, one response,
-connection closed — to keep the implementation auditable.</p>
-<p><strong><code>tes publish &lt;hash&gt;</code></strong> — Publishes a tessera to the network. Accepts full
-hashes or short prefixes (e.g., <code>tes publish a1b2</code>), which are resolved against
-the local database. The daemon reads all tessera files from storage, packs them
-into a single MessagePack buffer, and hands them to the replication engine.
-Small tesseras (&lt; 4 MB) are replicated as a single fragment; larger ones go
-through Reed-Solomon erasure coding. Output shows the short hash and fragment
-count:</p>
-<pre><code>Published tessera 9f2c4a1b (24 fragments created)
-Distribution in progress — use `tes status 9f2c4a1b` to track.
-</code></pre>
-<p><strong><code>tes fetch &lt;hash&gt;</code></strong> — Retrieves a tessera from the network using its full
-content hash. The daemon collects locally available fragments, reconstructs the
-original data via erasure decoding if needed, unpacks the files, and stores them
-in the content-addressable store. Returns the number of memories and total size
-fetched.</p>
-<p><strong><code>tes status &lt;hash&gt;</code></strong> — Displays the replication health of a tessera. The
-output maps directly to the replication engine's internal health model:</p>
-<table><thead><tr><th>State</th><th>Meaning</th></tr></thead><tbody>
-<tr><td>Local</td><td>Not yet published — exists only on your machine</td></tr>
-<tr><td>Publishing</td><td>Fragments being distributed, critical redundancy</td></tr>
-<tr><td>Replicated</td><td>Distributed but below target redundancy</td></tr>
-<tr><td>Healthy</td><td>Full redundancy achieved</td></tr>
-</tbody></table>
-<p><strong>Daemon RPC listener</strong> — The daemon now binds a Unix socket (default:
-<code>$XDG_RUNTIME_DIR/tesseras/daemon.sock</code>) with proper directory permissions
-(0700), stale socket cleanup, and graceful shutdown. Each connection is handled
-in a Tokio task — the listener converts the async stream to sync I/O for the
-framing layer, dispatches to the RPC handler, and writes the response back.</p>
-<p><strong>Pack/unpack in <code>tesseras-core</code></strong> — A small module that serializes a list of
-file entries (path + data) into a single MessagePack buffer and back. This is
-the bridge between the tessera's directory structure and the replication
-engine's opaque byte blobs.</p>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>Unix socket over TCP</strong>: RPC between CLI and daemon happens on the same
-machine. Unix sockets are faster, don't need port allocation, and filesystem
-permissions provide access control without TLS.</li>
-<li><strong>MessagePack over JSON</strong>: the same wire format used everywhere else in
-Tesseras. Compact, schema-less, and already a workspace dependency. A typical
-publish request/response round-trip is under 200 bytes.</li>
-<li><strong>Sync client, async daemon</strong>: the <code>DaemonClient</code> uses blocking I/O because
-the CLI doesn't need concurrency — it sends one request and waits. The daemon
-listener is async (Tokio) to handle multiple connections. The framing layer
-works with any <code>Read</code>/<code>Write</code> impl, bridging both worlds.</li>
-<li><strong>Hash prefix resolution on the client side</strong>: <code>publish</code> and <code>status</code> resolve
-short prefixes locally before sending the full hash to the daemon. This keeps
-the daemon stateless — it doesn't need access to the CLI's database.</li>
-<li><strong>Default data directory alignment</strong>: the CLI default changed from
-<code>~/.tesseras</code> to <code>~/.local/share/tesseras</code> (via <code>dirs::data_dir()</code>) to match
-the daemon. A migration hint is printed when legacy data is detected.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<ul>
-<li><strong>DHT peer count</strong>: the <code>status</code> command currently reports 0 peers — wiring
-the actual peer count from the DHT is the next step</li>
-<li><strong><code>tes show</code></strong>: display the contents of a tessera (memories, metadata) without
-exporting</li>
-<li><strong>Streaming fetch</strong>: for large tesseras, stream fragments as they arrive
-rather than waiting for all of them</li>
-</ul>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/cli-daemon-rpc/index.html.gz b/news/cli-daemon-rpc/index.html.gz
deleted file mode 100644
index 72f916f..0000000
--- a/news/cli-daemon-rpc/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/hello-world/index.html b/news/hello-world/index.html
deleted file mode 100644
index 5d3da15..0000000
--- a/news/hello-world/index.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Hello, World — Tesseras</title>
- <meta name="description" content="Introducing the Tesseras project — a P2P network for preserving human memories.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Hello, World">
- <meta property="og:description" content="Introducing the Tesseras project — a P2P network for preserving human memories.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Hello, World">
- <meta name="twitter:description" content="Introducing the Tesseras project — a P2P network for preserving human memories.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;hello-world&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Hello, World</h2>
- <p class="news-date">2026-02-13</p>
- <p>Today we're announcing the Tesseras project: a peer-to-peer network for
-preserving human memories across millennia.</p>
-<p>Tesseras is built on a simple idea — your photos, recordings, and writings
-deserve to outlast any company, platform, or file format. Each person creates a
-tessera, a self-contained time capsule that the network keeps alive through
-mutual aid and redundancy.</p>
-<p>The project is in its earliest stage. We're building the foundation: tools to
-create, verify, and export tesseras offline. The network layer, replication, and
-apps will follow.</p>
-<p>If this mission resonates with you, <a href="/subscriptions/">join the mailing list</a> or
-browse the <a rel="external" href="https://git.sr.ht/~ijanc/tesseras">source code</a>.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/hello-world/index.html.gz b/news/hello-world/index.html.gz
deleted file mode 100644
index daf5840..0000000
--- a/news/hello-world/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/index.html b/news/index.html
deleted file mode 100644
index 2417937..0000000
--- a/news/index.html
+++ /dev/null
@@ -1,198 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>News — Tesseras</title>
- <meta name="description" content="Tesseras project news and announcements">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="Tesseras">
- <meta property="og:description" content="P2P network for preserving human memories across millennia">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Tesseras">
- <meta name="twitter:description" content="P2P network for preserving human memories across millennia">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<h2>News</h2>
-
-<ul class="news-list">
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;packaging-debian&#x2F;">Packaging Tesseras for Debian</a>
- <span class="news-date">2026-02-16</span>
-
- <p>How to build and install the Tesseras .deb package on Debian&#x2F;Ubuntu using cargo-deb.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;packaging-archlinux&#x2F;">Packaging Tesseras for Arch Linux</a>
- <span class="news-date">2026-02-16</span>
-
- <p>How to build and install the Tesseras package on Arch Linux from source using makepkg.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-storage-deduplication&#x2F;">Phase 4: Storage Deduplication</a>
- <span class="news-date">2026-02-15</span>
-
- <p>A new content-addressable storage layer eliminates duplicate data across tesseras, reducing disk usage and enabling automatic garbage collection.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-institutional-onboarding&#x2F;">Phase 4: Institutional Node Onboarding</a>
- <span class="news-date">2026-02-15</span>
-
- <p>Libraries, archives, and museums can now join the Tesseras network as verified institutional nodes with DNS-based identity, full-text search indexes, and configurable storage pledges.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-performance-tuning&#x2F;">Phase 4: Performance Tuning</a>
- <span class="news-date">2026-02-15</span>
-
- <p>SQLite WAL mode with centralized pragma configuration, LRU fragment caching, QUIC connection pool lifecycle management, and attestation hot path optimization.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-wasm-browser-verification&#x2F;">Phase 4: Verify Without Installing Anything</a>
- <span class="news-date">2026-02-15</span>
-
- <p>Tesseras now compiles to WebAssembly — anyone can verify a tessera&#x27;s integrity and authenticity directly in the browser, with no software to install.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-nat-traversal&#x2F;">Phase 4: Punching Through NATs</a>
- <span class="news-date">2026-02-15</span>
-
- <p>Tesseras nodes can now discover their NAT type via STUN, coordinate UDP hole punching through introducers, and fall back to transparent relay forwarding when direct connectivity fails.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;cli-daemon-rpc&#x2F;">CLI Meets Network: Publish, Fetch, and Status Commands</a>
- <span class="news-date">2026-02-15</span>
-
- <p>The tesseras CLI can now publish tesseras to the network, fetch them from peers, and monitor replication status — all through a new Unix socket RPC bridge to the daemon.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-shamir-heir-recovery&#x2F;">Phase 4: Heir Key Recovery with Shamir&#x27;s Secret Sharing</a>
- <span class="news-date">2026-02-15</span>
-
- <p>Tesseras now lets you split your cryptographic identity into shares distributed to trusted heirs — any threshold of them can reconstruct your keys, but fewer reveal nothing.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-encryption-sealed&#x2F;">Phase 4: Encryption and Sealed Tesseras</a>
- <span class="news-date">2026-02-14</span>
-
- <p>Tesseras now supports private and sealed memories with hybrid post-quantum encryption — AES-256-GCM, X25519 + ML-KEM-768, and time-lock key publication.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase3-api-and-apps&#x2F;">Phase 3: Memories in Your Hands</a>
- <span class="news-date">2026-02-14</span>
-
- <p>Tesseras now has a Flutter app and an embedded Rust node — anyone can create and preserve memories from their phone.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;reed-solomon&#x2F;">Reed-Solomon: How Tesseras Survives Data Loss</a>
- <span class="news-date">2026-02-14</span>
-
- <p>A deep dive into Reed-Solomon erasure coding — what it is, why Tesseras uses it, and the challenges of keeping memories alive across centuries.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase2-replication&#x2F;">Phase 2: Memories Survive</a>
- <span class="news-date">2026-02-14</span>
-
- <p>Tesseras now fragments, distributes, and automatically repairs data across the network using Reed-Solomon erasure coding and a bilateral reciprocity ledger.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase1-basic-network&#x2F;">Phase 1: Nodes Find Each Other</a>
- <span class="news-date">2026-02-14</span>
-
- <p>Tesseras nodes can now discover peers, form a Kademlia DHT over QUIC, and publish and find tessera pointers across the network.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase0-foundation&#x2F;">Phase 0: Foundation Laid</a>
- <span class="news-date">2026-02-14</span>
-
- <p>The foundation crates for Tesseras are now in place — core domain types, cryptographic primitives, SQLite storage, and a working CLI.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;hello-world&#x2F;">Hello, World</a>
- <span class="news-date">2026-02-13</span>
-
- <p>Introducing the Tesseras project — a P2P network for preserving human memories.</p>
-
- </li>
-
-</ul>
-
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/index.html.gz b/news/index.html.gz
deleted file mode 100644
index d156023..0000000
--- a/news/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/packaging-archlinux/index.html b/news/packaging-archlinux/index.html
deleted file mode 100644
index 043464f..0000000
--- a/news/packaging-archlinux/index.html
+++ /dev/null
@@ -1,123 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Packaging Tesseras for Arch Linux — Tesseras</title>
- <meta name="description" content="How to build and install the Tesseras package on Arch Linux from source using makepkg.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Packaging Tesseras for Arch Linux">
- <meta property="og:description" content="How to build and install the Tesseras package on Arch Linux from source using makepkg.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Packaging Tesseras for Arch Linux">
- <meta name="twitter:description" content="How to build and install the Tesseras package on Arch Linux from source using makepkg.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;packaging-archlinux&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Packaging Tesseras for Arch Linux</h2>
- <p class="news-date">2026-02-16</p>
- <p>Tesseras now ships a PKGBUILD for Arch Linux. This post walks through building
-and installing the package from source.</p>
-<h2 id="prerequisites">Prerequisites</h2>
-<p>You need a working Rust toolchain and the base-devel group:</p>
-<pre><code data-lang="sh">sudo pacman -S --needed base-devel sqlite
-rustup toolchain install stable
-</code></pre>
-<h2 id="building">Building</h2>
-<p>Clone the repository and run the <code>just arch</code> recipe:</p>
-<pre><code data-lang="sh">git clone https://git.sr.ht/~ijanc/tesseras
-cd tesseras
-just arch
-</code></pre>
-<p>This runs <code>makepkg -sf</code> inside <code>packaging/archlinux/</code>, which:</p>
-<ol>
-<li><strong>prepare</strong> — fetches Cargo dependencies with <code>cargo fetch --locked</code></li>
-<li><strong>build</strong> — compiles <code>tesd</code> and <code>tes</code> (the CLI) in release mode</li>
-<li><strong>package</strong> — installs binaries, systemd service, sysusers/tmpfiles configs,
-shell completions (bash, zsh, fish), and a default config file</li>
-</ol>
-<p>The result is a <code>.pkg.tar.zst</code> file in <code>packaging/archlinux/</code>.</p>
-<h2 id="installing">Installing</h2>
-<pre><code data-lang="sh">sudo pacman -U packaging/archlinux/tesseras-*.pkg.tar.zst
-</code></pre>
-<h2 id="post-install-setup">Post-install setup</h2>
-<p>The package creates a <code>tesseras</code> system user and group automatically via
-systemd-sysusers. To use the CLI without sudo, add yourself to the group:</p>
-<pre><code data-lang="sh">sudo usermod -aG tesseras $USER
-</code></pre>
-<p>Log out and back in, then start the daemon:</p>
-<pre><code data-lang="sh">sudo systemctl enable --now tesd
-</code></pre>
-<h2 id="what-the-package-includes">What the package includes</h2>
-<table><thead><tr><th>Path</th><th>Description</th></tr></thead><tbody>
-<tr><td><code>/usr/bin/tesd</code></td><td>Full node daemon</td></tr>
-<tr><td><code>/usr/bin/tes</code></td><td>CLI client</td></tr>
-<tr><td><code>/etc/tesseras/config.toml</code></td><td>Default configuration (marked as backup)</td></tr>
-<tr><td><code>/usr/lib/systemd/system/tesd.service</code></td><td>Systemd unit with security hardening</td></tr>
-<tr><td><code>/usr/lib/sysusers.d/tesseras.conf</code></td><td>System user definition</td></tr>
-<tr><td><code>/usr/lib/tmpfiles.d/tesseras.conf</code></td><td>Data directory <code>/var/lib/tesseras</code></td></tr>
-<tr><td>Shell completions</td><td>bash, zsh, and fish</td></tr>
-</tbody></table>
-<h2 id="pkgbuild-details">PKGBUILD details</h2>
-<p>The PKGBUILD builds directly from the local git checkout rather than downloading
-a source tarball. The <code>TESSERAS_ROOT</code> environment variable points makepkg to the
-workspace root. Cargo's target directory is set to <code>$srcdir/target</code> to keep
-build artifacts inside the makepkg sandbox.</p>
-<p>The package depends only on <code>sqlite</code> at runtime and <code>cargo</code> at build time.</p>
-<h2 id="updating">Updating</h2>
-<p>After pulling new changes, simply run <code>just arch</code> again and reinstall:</p>
-<pre><code data-lang="sh">git pull
-just arch
-sudo pacman -U packaging/archlinux/tesseras-*.pkg.tar.zst
-</code></pre>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/packaging-archlinux/index.html.gz b/news/packaging-archlinux/index.html.gz
deleted file mode 100644
index 781dcda..0000000
--- a/news/packaging-archlinux/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/packaging-debian/index.html b/news/packaging-debian/index.html
deleted file mode 100644
index bfe7563..0000000
--- a/news/packaging-debian/index.html
+++ /dev/null
@@ -1,157 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Packaging Tesseras for Debian — Tesseras</title>
- <meta name="description" content="How to build and install the Tesseras .deb package on Debian&#x2F;Ubuntu using cargo-deb.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Packaging Tesseras for Debian">
- <meta property="og:description" content="How to build and install the Tesseras .deb package on Debian&#x2F;Ubuntu using cargo-deb.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Packaging Tesseras for Debian">
- <meta name="twitter:description" content="How to build and install the Tesseras .deb package on Debian&#x2F;Ubuntu using cargo-deb.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;packaging-debian&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Packaging Tesseras for Debian</h2>
- <p class="news-date">2026-02-16</p>
- <p>Tesseras now ships a <code>.deb</code> package for Debian and Ubuntu. This post walks
-through building and installing the package from source using <code>cargo-deb</code>.</p>
-<h2 id="prerequisites">Prerequisites</h2>
-<p>You need a working Rust toolchain and the required system libraries:</p>
-<pre><code data-lang="sh">sudo apt install build-essential pkg-config libsqlite3-dev
-rustup toolchain install stable
-cargo install cargo-deb
-</code></pre>
-<h2 id="building">Building</h2>
-<p>Clone the repository and run the <code>just deb</code> recipe:</p>
-<pre><code data-lang="sh">git clone https://git.sr.ht/~ijanc/tesseras
-cd tesseras
-just deb
-</code></pre>
-<p>This recipe does three things:</p>
-<ol>
-<li><strong>Compiles</strong> <code>tesd</code> (the daemon) and <code>tes</code> (the CLI) in release mode with
-<code>cargo build --release</code></li>
-<li><strong>Generates shell completions</strong> for bash, zsh, and fish from the <code>tes</code> binary</li>
-<li><strong>Packages</strong> everything into a <code>.deb</code> file with
-<code>cargo deb -p tesseras-daemon --no-build</code></li>
-</ol>
-<p>The result is a <code>.deb</code> file in <code>target/debian/</code>.</p>
-<h2 id="installing">Installing</h2>
-<pre><code data-lang="sh">sudo dpkg -i target/debian/tesseras-daemon_*.deb
-</code></pre>
-<p>If there are missing dependencies, fix them with:</p>
-<pre><code data-lang="sh">sudo apt install -f
-</code></pre>
-<h2 id="post-install-setup">Post-install setup</h2>
-<p>The <code>postinst</code> script automatically creates a <code>tesseras</code> system user and the
-data directory <code>/var/lib/tesseras</code>. To use the CLI without sudo, add yourself to
-the group:</p>
-<pre><code data-lang="sh">sudo usermod -aG tesseras $USER
-</code></pre>
-<p>Log out and back in, then start the daemon:</p>
-<pre><code data-lang="sh">sudo systemctl enable --now tesd
-</code></pre>
-<h2 id="what-the-package-includes">What the package includes</h2>
-<table><thead><tr><th>Path</th><th>Description</th></tr></thead><tbody>
-<tr><td><code>/usr/bin/tesd</code></td><td>Full node daemon</td></tr>
-<tr><td><code>/usr/bin/tes</code></td><td>CLI client</td></tr>
-<tr><td><code>/etc/tesseras/config.toml</code></td><td>Default configuration (marked as conffile)</td></tr>
-<tr><td><code>/lib/systemd/system/tesd.service</code></td><td>Systemd unit with security hardening</td></tr>
-<tr><td>Shell completions</td><td>bash, zsh, and fish</td></tr>
-</tbody></table>
-<h2 id="how-cargo-deb-works">How cargo-deb works</h2>
-<p>The packaging metadata lives in <code>crates/tesseras-daemon/Cargo.toml</code> under
-<code>[package.metadata.deb]</code>. This section defines:</p>
-<ul>
-<li><strong>depends</strong> — runtime dependencies: <code>libc6</code> and <code>libsqlite3-0</code></li>
-<li><strong>assets</strong> — files to include in the package (binaries, config, systemd unit,
-shell completions)</li>
-<li><strong>conf-files</strong> — files treated as configuration (preserved on upgrade)</li>
-<li><strong>maintainer-scripts</strong> — <code>postinst</code> and <code>postrm</code> scripts in
-<code>packaging/debian/scripts/</code></li>
-<li><strong>systemd-units</strong> — automatic systemd integration</li>
-</ul>
-<p>The <code>postinst</code> script creates the <code>tesseras</code> system user and data directory on
-install. The <code>postrm</code> script cleans up the user, group, and data directory only
-on <code>purge</code> (not on simple removal).</p>
-<h2 id="systemd-hardening">Systemd hardening</h2>
-<p>The <code>tesd.service</code> unit includes security hardening directives:</p>
-<pre><code data-lang="ini">NoNewPrivileges=true
-ProtectSystem=strict
-ProtectHome=true
-ReadWritePaths=/var/lib/tesseras
-PrivateTmp=true
-PrivateDevices=true
-ProtectKernelTunables=true
-ProtectControlGroups=true
-RestrictSUIDSGID=true
-MemoryDenyWriteExecute=true
-</code></pre>
-<p>The daemon runs as the unprivileged <code>tesseras</code> user and can only write to
-<code>/var/lib/tesseras</code>.</p>
-<h2 id="deploying-to-a-remote-server">Deploying to a remote server</h2>
-<p>The justfile includes a <code>deploy</code> recipe for pushing the <code>.deb</code> to a remote host:</p>
-<pre><code data-lang="sh">just deploy bootstrap1.tesseras.net
-</code></pre>
-<p>This builds the <code>.deb</code>, copies it via <code>scp</code>, installs it with <code>dpkg -i</code>, and
-restarts the <code>tesd</code> service.</p>
-<h2 id="updating">Updating</h2>
-<p>After pulling new changes, simply run <code>just deb</code> again and reinstall:</p>
-<pre><code data-lang="sh">git pull
-just deb
-sudo dpkg -i target/debian/tesseras-daemon_*.deb
-</code></pre>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/packaging-debian/index.html.gz b/news/packaging-debian/index.html.gz
deleted file mode 100644
index 69ee540..0000000
--- a/news/packaging-debian/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/phase0-foundation/index.html b/news/phase0-foundation/index.html
deleted file mode 100644
index 783c9e6..0000000
--- a/news/phase0-foundation/index.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Phase 0: Foundation Laid — Tesseras</title>
- <meta name="description" content="The foundation crates for Tesseras are now in place — core domain types, cryptographic primitives, SQLite storage, and a working CLI.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Phase 0: Foundation Laid">
- <meta property="og:description" content="The foundation crates for Tesseras are now in place — core domain types, cryptographic primitives, SQLite storage, and a working CLI.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Phase 0: Foundation Laid">
- <meta name="twitter:description" content="The foundation crates for Tesseras are now in place — core domain types, cryptographic primitives, SQLite storage, and a working CLI.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;phase0-foundation&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Phase 0: Foundation Laid</h2>
- <p class="news-date">2026-02-14</p>
- <p>The first milestone of the Tesseras project is complete. Phase 0 establishes the
-foundation that every future component will build on: domain types,
-cryptography, storage, and a usable command-line interface.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong>tesseras-core</strong> — The domain layer defines the tessera format: <code>ContentHash</code>
-(BLAKE3, 32 bytes), <code>NodeId</code> (Kademlia, 20 bytes), memory types (Moment,
-Reflection, Daily, Relation, Object), visibility modes (Private, Circle, Public,
-PublicAfterDeath, Sealed), and a plain-text manifest format that can be parsed
-by any programming language for the next thousand years. The application service
-layer (<code>TesseraService</code>) handles create, verify, export, and list operations
-through port traits, following hexagonal architecture.</p>
-<p><strong>tesseras-crypto</strong> — Ed25519 key generation, signing, and verification. A
-dual-signature framework (Ed25519 + ML-DSA placeholder) ready for post-quantum
-migration. BLAKE3 content hashing. Reed-Solomon erasure coding behind a feature
-flag for future replication.</p>
-<p><strong>tesseras-storage</strong> — SQLite index via rusqlite with plain-SQL migrations.
-Filesystem blob store with content-addressable layout
-(<code>blobs/&lt;tessera_hash&gt;/&lt;memory_hash&gt;/&lt;filename&gt;</code>). Identity key persistence on
-disk.</p>
-<p><strong>tesseras-cli</strong> — A working <code>tesseras</code> binary with five commands:</p>
-<ul>
-<li><code>init</code> — generates Ed25519 identity, creates SQLite database</li>
-<li><code>create &lt;dir&gt;</code> — scans a directory for media files, creates a signed tessera</li>
-<li><code>verify &lt;hash&gt;</code> — checks signature and file integrity</li>
-<li><code>export &lt;hash&gt; &lt;dest&gt;</code> — writes a self-contained tessera directory</li>
-<li><code>list</code> — shows a table of stored tesseras</li>
-</ul>
-<p><strong>Testing</strong> — 67+ tests across the workspace: unit tests in every module,
-property-based tests (proptest) for hex roundtrips and manifest serialization,
-integration tests covering the full create-verify-export cycle including
-tampered file and invalid signature detection. Zero clippy warnings.</p>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>Hexagonal architecture</strong>: crypto operations are injected via trait objects
-(<code>Box&lt;dyn Hasher&gt;</code>, <code>Box&lt;dyn ManifestSigner&gt;</code>, <code>Box&lt;dyn ManifestVerifier&gt;</code>),
-keeping the core crate free of concrete crypto dependencies.</li>
-<li><strong>Feature flags</strong>: the <code>service</code> feature on tesseras-core gates the async
-application layer. The <code>classical</code> and <code>erasure</code> features on tesseras-crypto
-control which algorithms are compiled in.</li>
-<li><strong>Plain-text manifest</strong>: parseable without any binary format library, with
-explicit <code>blake3:</code> hash prefixes and human-readable layout.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<p>Phase 0 is the local-only foundation. The road ahead:</p>
-<ul>
-<li><strong>Phase 1: Networking</strong> — QUIC transport (quinn), Kademlia DHT for peer
-discovery, NAT traversal</li>
-<li><strong>Phase 2: Replication</strong> — Reed-Solomon erasure coding over the network,
-repair loops, bilateral reciprocity (no blockchain, no tokens)</li>
-<li><strong>Phase 3: Clients</strong> — Flutter mobile/desktop app via flutter_rust_bridge,
-GraphQL API, WASM browser node</li>
-<li><strong>Phase 4: Hardening</strong> — ML-DSA post-quantum signatures, packaging for
-Alpine/Arch/Debian/FreeBSD/OpenBSD, CI on SourceHut</li>
-</ul>
-<p>The tessera format is stable. Everything built from here connects to and extends
-what exists today.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/phase0-foundation/index.html.gz b/news/phase0-foundation/index.html.gz
deleted file mode 100644
index 31efa2d..0000000
--- a/news/phase0-foundation/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/phase1-basic-network/index.html b/news/phase1-basic-network/index.html
deleted file mode 100644
index 4852505..0000000
--- a/news/phase1-basic-network/index.html
+++ /dev/null
@@ -1,173 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Phase 1: Nodes Find Each Other — Tesseras</title>
- <meta name="description" content="Tesseras nodes can now discover peers, form a Kademlia DHT over QUIC, and publish and find tessera pointers across the network.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Phase 1: Nodes Find Each Other">
- <meta property="og:description" content="Tesseras nodes can now discover peers, form a Kademlia DHT over QUIC, and publish and find tessera pointers across the network.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Phase 1: Nodes Find Each Other">
- <meta name="twitter:description" content="Tesseras nodes can now discover peers, form a Kademlia DHT over QUIC, and publish and find tessera pointers across the network.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;phase1-basic-network&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Phase 1: Nodes Find Each Other</h2>
- <p class="news-date">2026-02-14</p>
- <p>Tesseras is no longer a local-only tool. Phase 1 delivers the networking layer:
-nodes discover each other through a Kademlia DHT, communicate over QUIC, and
-publish tessera pointers that any peer on the network can find. A tessera
-created on node A is now findable from node C.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong>tesseras-core</strong> (updated) — New network domain types: <code>TesseraPointer</code>
-(lightweight reference to a tessera's holders and fragment locations),
-<code>NodeIdentity</code> (node ID + public key + proof-of-work nonce), <code>NodeInfo</code>
-(identity + address + capabilities), and <code>Capabilities</code> (bitflags for what a
-node supports: DHT, storage, relay, replication).</p>
-<p><strong>tesseras-net</strong> — The transport layer, built on QUIC via quinn. The <code>Transport</code>
-trait defines the port: <code>send</code>, <code>recv</code>, <code>disconnect</code>, <code>local_addr</code>. Two adapters
-implement it:</p>
-<ul>
-<li><code>QuinnTransport</code> — real QUIC with self-signed TLS, ALPN negotiation
-(<code>tesseras/1</code>), connection pooling via DashMap, and a background accept loop
-that handles incoming streams.</li>
-<li><code>MemTransport</code> + <code>SimNetwork</code> — in-memory channels for deterministic testing
-without network I/O. Every integration test in the DHT crate runs against
-this.</li>
-</ul>
-<p>The wire protocol uses length-prefixed MessagePack: a 4-byte big-endian length
-header followed by an rmp-serde payload. <code>WireMessage</code> carries a version byte,
-request ID, and a body that can be a request, response, or protocol-level error.
-Maximum message size is 64 KiB.</p>
-<p><strong>tesseras-dht</strong> — A complete Kademlia implementation:</p>
-<ul>
-<li><em>Routing table</em>: 160 k-buckets with k=20. Least-recently-seen eviction,
-move-to-back on update, ping-check before replacing a full bucket's oldest
-entry.</li>
-<li><em>XOR distance</em>: 160-bit XOR metric with bucket indexing by highest differing
-bit.</li>
-<li><em>Proof-of-work</em>: nodes grind a nonce until <code>BLAKE3(pubkey || nonce)[..20]</code> has
-8 leading zero bits (~256 hash attempts on average). Cheap enough for any
-device, expensive enough to make Sybil attacks impractical at scale.</li>
-<li><em>Protocol messages</em>: Ping/Pong, FindNode/FindNodeResponse,
-FindValue/FindValueResult, Store — all serialized with MessagePack via serde.</li>
-<li><em>Pointer store</em>: bounded in-memory store with configurable TTL (24 hours
-default) and max entries (10,000 default). When full, evicts pointers furthest
-from the local node ID, following Kademlia's distance-based responsibility
-model.</li>
-<li><em>DhtEngine</em>: the main orchestrator. Handles incoming RPCs, runs iterative
-lookups (alpha=3 parallelism), bootstrap, publish, and find. The <code>run()</code>
-method drives a <code>tokio::select!</code> loop with maintenance timers: routing table
-refresh every 60 seconds, pointer expiry every 5 minutes.</li>
-</ul>
-<p><strong>tesd</strong> — A full-node binary. Parses CLI args (bind address, bootstrap peers,
-data directory), generates a PoW-valid node identity, binds a QUIC endpoint,
-bootstraps into the network, and runs the DHT engine. Graceful shutdown on
-Ctrl+C via tokio signal handling.</p>
-<p><strong>Infrastructure</strong> — OpenTofu configuration for two Hetzner Cloud bootstrap
-nodes (cx22 instances in Falkenstein, Germany and Helsinki, Finland). Cloud-init
-provisioning script creates a dedicated <code>tesseras</code> user, writes a config file,
-and sets up a systemd service. Firewall rules open UDP 4433 (QUIC) and restrict
-metrics to internal access.</p>
-<p><strong>Testing</strong> — 139 tests across the workspace:</p>
-<ul>
-<li>47 unit tests in tesseras-dht (routing table, distance, PoW, pointer store,
-message serialization, engine RPCs)</li>
-<li>5 multi-node integration tests (3-node bootstrap, 10-node lookup convergence,
-publish-and-find, node departure detection, PoW rejection)</li>
-<li>14 tests in tesseras-net (codec roundtrips, transport send/recv, backpressure,
-disconnect)</li>
-<li>Docker Compose smoke tests with 3 containerized nodes communicating over real
-QUIC</li>
-<li>Zero clippy warnings, clean formatting</li>
-</ul>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>Transport as a port</strong>: the <code>Transport</code> trait is the only interface between
-the DHT engine and the network. Swapping QUIC for any other protocol means
-implementing four methods. All DHT tests use the in-memory adapter, making
-them fast and deterministic.</li>
-<li><strong>One stream per RPC</strong>: each DHT request-response pair uses a fresh
-bidirectional QUIC stream. No multiplexing complexity, no head-of-line
-blocking between independent operations. QUIC handles the multiplexing at the
-connection level.</li>
-<li><strong>MessagePack over Protobuf</strong>: compact binary encoding without code generation
-or schema files. Serde integration means adding a field to a message is a
-one-line change. Trade-off: no built-in schema evolution guarantees, but at
-this stage velocity matters more.</li>
-<li><strong>PoW instead of stake or reputation</strong>: a node identity costs ~256 BLAKE3
-hashes. This runs in under a second on any hardware, including a Raspberry Pi,
-but generating thousands of identities for a Sybil attack becomes expensive.
-No tokens, no blockchain, no external dependencies.</li>
-<li><strong>Iterative lookup with routing table updates</strong>: discovered nodes are added to
-the routing table as they're encountered during iterative lookups, following
-standard Kademlia behavior. This ensures the routing table improves
-organically as nodes interact.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<ul>
-<li><strong>Phase 2: Replication</strong> — Reed-Solomon erasure coding over the network,
-fragment distribution, automatic repair loops, bilateral reciprocity ledger
-(no blockchain, no tokens)</li>
-<li><strong>Phase 3: API and Apps</strong> — Flutter mobile/desktop app via
-flutter_rust_bridge, GraphQL API (async-graphql), WASM browser node</li>
-<li><strong>Phase 4: Resilience and Scale</strong> — ML-DSA post-quantum signatures, advanced
-NAT traversal, Shamir's Secret Sharing for heirs, packaging for
-Alpine/Arch/Debian/FreeBSD/OpenBSD, CI on SourceHut</li>
-<li><strong>Phase 5: Exploration and Culture</strong> — public tessera browser, institutional
-curation, genealogy integration, physical media export</li>
-</ul>
-<p>Nodes can find each other. Next, they learn to keep each other's memories alive.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/phase1-basic-network/index.html.gz b/news/phase1-basic-network/index.html.gz
deleted file mode 100644
index fe517f3..0000000
--- a/news/phase1-basic-network/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/phase2-replication/index.html b/news/phase2-replication/index.html
deleted file mode 100644
index 777bf42..0000000
--- a/news/phase2-replication/index.html
+++ /dev/null
@@ -1,201 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Phase 2: Memories Survive — Tesseras</title>
- <meta name="description" content="Tesseras now fragments, distributes, and automatically repairs data across the network using Reed-Solomon erasure coding and a bilateral reciprocity ledger.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Phase 2: Memories Survive">
- <meta property="og:description" content="Tesseras now fragments, distributes, and automatically repairs data across the network using Reed-Solomon erasure coding and a bilateral reciprocity ledger.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Phase 2: Memories Survive">
- <meta name="twitter:description" content="Tesseras now fragments, distributes, and automatically repairs data across the network using Reed-Solomon erasure coding and a bilateral reciprocity ledger.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;phase2-replication&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Phase 2: Memories Survive</h2>
- <p class="news-date">2026-02-14</p>
- <p>A tessera is no longer tied to a single machine. Phase 2 delivers the
-replication layer: data is split into erasure-coded fragments, distributed
-across multiple peers, and automatically repaired when nodes go offline. A
-bilateral reciprocity ledger ensures fair storage exchange — no blockchain, no
-tokens.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong>tesseras-core</strong> (updated) — New replication domain types: <code>FragmentPlan</code>
-(selects fragmentation tier based on tessera size), <code>FragmentId</code> (tessera hash +
-index + shard count + checksum), <code>FragmentEnvelope</code> (fragment with its metadata
-for wire transport), <code>FragmentationTier</code> (Small/Medium/Large), <code>Attestation</code>
-(proof that a node holds a fragment at a given time), and <code>ReplicateAck</code>
-(acknowledgement of fragment receipt). Three new port traits define the
-hexagonal boundaries: <code>DhtPort</code> (find peers, replicate fragments, request
-attestations, ping), <code>FragmentStore</code> (store/read/delete/list/verify fragments),
-and <code>ReciprocityLedger</code> (record storage exchanges, query balances, find best
-peers). Maximum tessera size is 1 GB.</p>
-<p><strong>tesseras-crypto</strong> (updated) — The existing <code>ReedSolomonCoder</code> now powers
-fragment encoding. Data is split into shards, parity shards are computed, and
-any combination of data shards can reconstruct the original — as long as the
-number of missing shards does not exceed the parity count.</p>
-<p><strong>tesseras-storage</strong> (updated) — Two new adapters:</p>
-<ul>
-<li><code>FsFragmentStore</code> — stores fragment data as files on disk
-(<code>{root}/{tessera_hash}/{index:03}.shard</code>) with a SQLite metadata index
-tracking tessera hash, shard index, shard count, checksum, and byte size.
-Verification recomputes the BLAKE3 hash and compares it to the stored
-checksum.</li>
-<li><code>SqliteReciprocityLedger</code> — bilateral storage accounting in SQLite. Each peer
-has a row tracking bytes stored for them and bytes they store for us. The
-<code>balance</code> column is a generated column
-(<code>bytes_they_store_for_us - bytes_stored_for_them</code>). UPSERT ensures atomic
-increment of counters.</li>
-</ul>
-<p>New migration (<code>002_replication.sql</code>) adds tables for fragments, fragment plans,
-holders, holder-fragment mappings, and reciprocity balances.</p>
-<p><strong>tesseras-dht</strong> (updated) — Four new message variants: <code>Replicate</code> (send a
-fragment envelope), <code>ReplicateAck</code> (confirm receipt), <code>AttestRequest</code> (ask a
-node to prove it holds a tessera's fragments), and <code>AttestResponse</code> (return
-attestation with checksums and timestamp). The engine handles these in its
-message dispatch loop.</p>
-<p><strong>tesseras-replication</strong> — The new crate, with five modules:</p>
-<ul>
-<li>
-<p><em>Fragment encoding</em> (<code>fragment.rs</code>): <code>encode_tessera()</code> selects the
-fragmentation tier based on size, then calls Reed-Solomon encoding for Medium
-and Large tiers. Three tiers:</p>
-<ul>
-<li><strong>Small</strong> (&lt; 4 MB): whole-file replication to r=7 peers, no erasure coding</li>
-<li><strong>Medium</strong> (4–256 MB): 16 data + 8 parity shards, distributed across r=7
-peers</li>
-<li><strong>Large</strong> (≥ 256 MB): 48 data + 24 parity shards, distributed across r=7
-peers</li>
-</ul>
-</li>
-<li>
-<p><em>Distribution</em> (<code>distributor.rs</code>): subnet diversity filtering limits peers per
-/24 IPv4 subnet (or /48 IPv6 prefix) to avoid correlated failures. If all your
-fragments land on the same rack, a single power outage kills them all.</p>
-</li>
-<li>
-<p><em>Service</em> (<code>service.rs</code>): <code>ReplicationService</code> is the orchestrator.
-<code>replicate_tessera()</code> encodes the data, finds the closest peers via DHT,
-applies subnet diversity, and distributes fragments round-robin.
-<code>receive_fragment()</code> validates the BLAKE3 checksum, checks reciprocity balance
-(rejects if the sender's deficit exceeds the configured threshold), stores the
-fragment, and updates the ledger. <code>handle_attestation_request()</code> lists local
-fragments and computes their checksums as proof of possession.</p>
-</li>
-<li>
-<p><em>Repair</em> (<code>repair.rs</code>): <code>check_tessera_health()</code> requests attestations from
-known holders, falls back to ping for unresponsive nodes, verifies local
-fragment integrity, and returns one of three actions: <code>Healthy</code>,
-<code>NeedsReplication { deficit }</code>, or <code>CorruptLocal { fragment_index }</code>. The
-repair loop runs every 24 hours (with 2-hour jitter) via <code>tokio::select!</code> with
-shutdown integration.</p>
-</li>
-<li>
-<p><em>Configuration</em> (<code>config.rs</code>): <code>ReplicationConfig</code> with defaults for repair
-interval (24h), jitter (2h), concurrent transfers (4), minimum free space (1
-GB), deficit allowance (256 MB), and per-peer storage limit (1 GB).</p>
-</li>
-</ul>
-<p><strong>tesd</strong> (updated) — The daemon now opens a SQLite database (<code>db/tesseras.db</code>),
-runs migrations, creates <code>FsFragmentStore</code>, <code>SqliteReciprocityLedger</code>, and
-<code>FsBlobStore</code> instances, wraps the DHT engine in a <code>DhtPortAdapter</code>, builds a
-<code>ReplicationService</code>, and spawns the repair loop as a background task with
-graceful shutdown.</p>
-<p><strong>Testing</strong> — 193 tests across the workspace:</p>
-<ul>
-<li>15 unit tests in tesseras-replication (fragment encoding tiers, checksum
-validation, subnet diversity, repair health checks, service receive/replicate
-flows)</li>
-<li>3 integration tests with real storage (full encode→distribute→receive cycle
-for medium tessera, small whole-file replication, tampered fragment rejection)</li>
-<li>Tests use in-memory SQLite + tempdir fragments with mockall mocks for DHT and
-BlobStore</li>
-<li>Zero clippy warnings, clean formatting</li>
-</ul>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>Three-tier fragmentation</strong>: small files don't need erasure coding — the
-overhead isn't worth it. Medium and large files get progressively more parity
-shards. This avoids wasting storage on small tesseras while providing strong
-redundancy for large ones.</li>
-<li><strong>Owner-push distribution</strong>: the tessera owner encodes fragments and pushes
-them to peers, rather than peers pulling. This simplifies the protocol (no
-negotiation phase) and ensures fragments are distributed immediately.</li>
-<li><strong>Bilateral reciprocity without consensus</strong>: each node tracks its own balance
-with each peer locally. No global ledger, no token, no blockchain. If peer A
-stores 500 MB for peer B, peer B should store roughly 500 MB for peer A. Free
-riders lose redundancy gradually — their fragments are deprioritized for
-repair, but never deleted.</li>
-<li><strong>Subnet diversity</strong>: fragments are spread across different network subnets to
-survive correlated failures. A datacenter outage shouldn't take out all copies
-of a tessera.</li>
-<li><strong>Attestation-first health checks</strong>: the repair loop asks holders to prove
-possession (attestation with checksums) before declaring a tessera degraded.
-Only when attestation fails does it fall back to a simple ping. This catches
-silent data corruption, not just node departure.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<ul>
-<li><strong>Phase 3: API and Apps</strong> — Flutter mobile/desktop app via
-flutter_rust_bridge, GraphQL API (async-graphql), WASM browser node</li>
-<li><strong>Phase 4: Resilience and Scale</strong> — ML-DSA post-quantum signatures, advanced
-NAT traversal, Shamir's Secret Sharing for heirs, packaging for
-Alpine/Arch/Debian/FreeBSD/OpenBSD, CI on SourceHut</li>
-<li><strong>Phase 5: Exploration and Culture</strong> — public tessera browser, institutional
-curation, genealogy integration, physical media export</li>
-</ul>
-<p>Nodes can find each other and keep each other's memories alive. Next, we give
-people a way to hold their memories in their hands.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/phase2-replication/index.html.gz b/news/phase2-replication/index.html.gz
deleted file mode 100644
index eb2ccb3..0000000
--- a/news/phase2-replication/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/phase3-api-and-apps/index.html b/news/phase3-api-and-apps/index.html
deleted file mode 100644
index 1f0feab..0000000
--- a/news/phase3-api-and-apps/index.html
+++ /dev/null
@@ -1,163 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Phase 3: Memories in Your Hands — Tesseras</title>
- <meta name="description" content="Tesseras now has a Flutter app and an embedded Rust node — anyone can create and preserve memories from their phone.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Phase 3: Memories in Your Hands">
- <meta property="og:description" content="Tesseras now has a Flutter app and an embedded Rust node — anyone can create and preserve memories from their phone.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Phase 3: Memories in Your Hands">
- <meta name="twitter:description" content="Tesseras now has a Flutter app and an embedded Rust node — anyone can create and preserve memories from their phone.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;phase3-api-and-apps&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Phase 3: Memories in Your Hands</h2>
- <p class="news-date">2026-02-14</p>
- <p>People can now hold their memories in their hands. Phase 3 delivers what the
-previous phases built toward: a mobile app where someone downloads Tesseras,
-creates an identity, takes a photo, and that memory enters the preservation
-network. No cloud accounts, no subscriptions, no company between you and your
-memories.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong>tesseras-embedded</strong> — A full P2P node that runs inside a mobile app. The
-<code>EmbeddedNode</code> struct owns a Tokio runtime, SQLite database, QUIC transport,
-Kademlia DHT engine, replication service, and tessera service — the same stack
-as the desktop daemon, compiled into a shared library. A global singleton
-pattern (<code>Mutex&lt;Option&lt;EmbeddedNode&gt;&gt;</code>) ensures one node per app lifecycle. On
-start, it opens the database, runs migrations, loads or generates an Ed25519
-identity with proof-of-work node ID, binds QUIC on an ephemeral port, wires up
-DHT and replication, and spawns the repair loop. On stop, it sends a shutdown
-signal and drains gracefully.</p>
-<p>Eleven FFI functions are exposed to Dart via flutter_rust_bridge: lifecycle
-(<code>node_start</code>, <code>node_stop</code>, <code>node_is_running</code>), identity (<code>create_identity</code>,
-<code>get_identity</code>), memories (<code>create_memory</code>, <code>get_timeline</code>, <code>get_memory</code>), and
-network status (<code>get_network_stats</code>, <code>get_replication_status</code>). All types
-crossing the FFI boundary are flat structs with only <code>String</code>, <code>Option&lt;String&gt;</code>,
-<code>Vec&lt;String&gt;</code>, and primitives — no trait objects, no generics, no lifetimes.</p>
-<p>Four adapter modules bridge core ports to concrete implementations:
-<code>Blake3HasherAdapter</code>, <code>Ed25519SignerAdapter</code>/<code>Ed25519VerifierAdapter</code> for
-cryptography, <code>DhtPortAdapter</code> for DHT operations, and
-<code>ReplicationHandlerAdapter</code> for incoming fragment and attestation RPCs.</p>
-<p>The <code>bundled-sqlite</code> feature flag compiles SQLite from source, required for
-Android and iOS where the system library may not be available. Cargokit
-configuration passes this flag automatically in both debug and release builds.</p>
-<p><strong>Flutter app</strong> — A Material Design 3 application with Riverpod state
-management, targeting Android, iOS, Linux, macOS, and Windows from a single
-codebase.</p>
-<p>The <em>onboarding flow</em> is three screens: a welcome screen explaining the project
-in one sentence ("Preserve your memories across millennia. No cloud. No
-company."), an identity creation screen that triggers Ed25519 keypair generation
-in Rust, and a confirmation screen showing the user's name and cryptographic
-identity.</p>
-<p>The <em>timeline screen</em> displays memories in reverse chronological order with
-image previews, context text, and chips for memory type and visibility.
-Pull-to-refresh reloads from the Rust node. A floating action button opens the
-<em>memory creation screen</em>, which supports photo selection from gallery or camera
-via <code>image_picker</code>, optional context text, memory type and visibility dropdowns,
-and comma-separated tags. Creating a memory calls the Rust FFI synchronously,
-then returns to the timeline.</p>
-<p>The <em>network screen</em> shows two cards: node status (peer count, DHT size,
-bootstrap state, uptime) and replication health (total fragments, healthy
-fragments, repairing fragments, replication factor). The <em>settings screen</em>
-displays the user's identity — name, truncated node ID, truncated public key,
-and creation date.</p>
-<p>Three Riverpod providers manage state: <code>nodeProvider</code> starts the embedded node
-on app launch using the app documents directory and stops it on dispose;
-<code>identityProvider</code> loads the existing profile or creates a new one;
-<code>timelineProvider</code> fetches the memory list with pagination.</p>
-<p><strong>Testing</strong> — 9 Rust unit tests in tesseras-embedded covering node lifecycle
-(start/stop without panic), identity persistence across restarts, restart cycles
-without SQLite corruption, network event streaming, stats retrieval, memory
-creation and timeline retrieval, and single memory lookup by hash. 2 Flutter
-tests: an integration test verifying Rust initialization and app startup, and a
-widget smoke test.</p>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>Embedded node, not client-server</strong>: the phone runs the full P2P stack, not a
-thin client talking to a remote daemon. This means memories are preserved even
-without internet. Users with a Raspberry Pi or VPS can optionally connect the
-app to their daemon via GraphQL for higher availability, but it's not
-required.</li>
-<li><strong>Synchronous FFI</strong>: all flutter_rust_bridge functions are marked
-<code>#[frb(sync)]</code> and block on the internal Tokio runtime. This simplifies the
-Dart side (no async bridge complexity) while the Rust side handles concurrency
-internally. Flutter's UI thread stays responsive because Riverpod wraps calls
-in async providers.</li>
-<li><strong>Global singleton</strong>: a <code>Mutex&lt;Option&lt;EmbeddedNode&gt;&gt;</code> global ensures the node
-lifecycle is predictable — one start, one stop, no races. Mobile platforms
-kill processes aggressively, so simplicity in lifecycle management is a
-feature.</li>
-<li><strong>Flat FFI types</strong>: no Rust abstractions leak across the FFI boundary. Every
-type is a plain struct with strings and numbers. This makes the auto-generated
-Dart bindings reliable and easy to debug.</li>
-<li><strong>Three-screen onboarding</strong>: identity creation is the only required step. No
-email, no password, no server registration. The app generates a cryptographic
-identity locally and is ready to use.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<ul>
-<li><strong>Phase 4: Resilience and Scale</strong> — Advanced NAT traversal (STUN/TURN),
-Shamir's Secret Sharing for heirs, sealed tesseras with time-lock encryption,
-performance tuning, security audits, OS packaging for
-Alpine/Arch/Debian/FreeBSD/OpenBSD</li>
-<li><strong>Phase 5: Exploration and Culture</strong> — Public tessera browser by
-era/location/theme/language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)</li>
-</ul>
-<p>The infrastructure is complete. The network exists, replication works, and now
-anyone with a phone can participate. What remains is hardening what we have and
-opening it to the world.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/phase3-api-and-apps/index.html.gz b/news/phase3-api-and-apps/index.html.gz
deleted file mode 100644
index 4d367bc..0000000
--- a/news/phase3-api-and-apps/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/phase4-encryption-sealed/index.html b/news/phase4-encryption-sealed/index.html
deleted file mode 100644
index dd7b5eb..0000000
--- a/news/phase4-encryption-sealed/index.html
+++ /dev/null
@@ -1,178 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Phase 4: Encryption and Sealed Tesseras — Tesseras</title>
- <meta name="description" content="Tesseras now supports private and sealed memories with hybrid post-quantum encryption — AES-256-GCM, X25519 + ML-KEM-768, and time-lock key publication.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Phase 4: Encryption and Sealed Tesseras">
- <meta property="og:description" content="Tesseras now supports private and sealed memories with hybrid post-quantum encryption — AES-256-GCM, X25519 + ML-KEM-768, and time-lock key publication.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Phase 4: Encryption and Sealed Tesseras">
- <meta name="twitter:description" content="Tesseras now supports private and sealed memories with hybrid post-quantum encryption — AES-256-GCM, X25519 + ML-KEM-768, and time-lock key publication.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;phase4-encryption-sealed&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Phase 4: Encryption and Sealed Tesseras</h2>
- <p class="news-date">2026-02-14</p>
- <p>Some memories are not meant for everyone. A private journal, a letter to be
-opened in 2050, a family secret sealed until the grandchildren are old enough.
-Until now, every tessera on the network was open. Phase 4 changes that: Tesseras
-now encrypts private and sealed content with a hybrid cryptographic scheme
-designed to resist both classical and quantum attacks.</p>
-<p>The principle remains the same — encrypt as little as possible. Public memories
-need availability, not secrecy. But when someone creates a private or sealed
-tessera, the content is now locked behind AES-256-GCM encryption with keys
-protected by a hybrid key encapsulation mechanism combining X25519 and
-ML-KEM-768. Both algorithms must be broken to access the content.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong>AES-256-GCM encryptor</strong> (<code>tesseras-crypto/src/encryption.rs</code>) — Symmetric
-content encryption with random 12-byte nonces and authenticated associated data
-(AAD). The AAD binds ciphertext to its context: for private tesseras, the
-content hash is included; for sealed tesseras, both the content hash and the
-<code>open_after</code> timestamp are bound into the AAD. This means moving ciphertext
-between tesseras with different open dates causes decryption failure — you
-cannot trick the system into opening a sealed memory early by swapping its
-ciphertext into a tessera with an earlier seal date.</p>
-<p><strong>Hybrid Key Encapsulation Mechanism</strong> (<code>tesseras-crypto/src/kem.rs</code>) — Key
-exchange using X25519 (classical elliptic curve Diffie-Hellman) combined with
-ML-KEM-768 (the NIST-standardized post-quantum lattice-based KEM, formerly
-Kyber). Both shared secrets are combined via <code>blake3::derive_key</code> with a fixed
-context string ("tesseras hybrid kem v1") to produce a single 256-bit content
-encryption key. This follows the same "dual from day one" philosophy as the
-project's dual signing (Ed25519 + ML-DSA): if either algorithm is broken in the
-future, the other still protects the content.</p>
-<p><strong>Sealed Key Envelope</strong> (<code>tesseras-crypto/src/sealed.rs</code>) — Wraps a content
-encryption key using the hybrid KEM, so only the tessera owner can recover it.
-The KEM produces a transport key, which is XORed with the content key to produce
-a wrapped key stored alongside the KEM ciphertext. On unsealing, the owner
-decapsulates the KEM ciphertext to recover the transport key, then XORs again to
-recover the content key.</p>
-<p><strong>Key Publication</strong> (<code>tesseras-crypto/src/sealed.rs</code>) — A standalone signed
-artifact for publishing a sealed tessera's content key after its <code>open_after</code>
-date has passed. The owner signs the content key, tessera hash, and publication
-timestamp with their dual keys (Ed25519, with ML-DSA placeholder). The manifest
-stays immutable — the key publication is a separate document. Other nodes verify
-the signature against the owner's public key before using the published key to
-decrypt the content.</p>
-<p><strong>EncryptionContext</strong> (<code>tesseras-core/src/enums.rs</code>) — A domain type that
-represents the AAD context for encryption. It lives in tesseras-core rather than
-tesseras-crypto because it's a domain concept (not a crypto implementation
-detail). The <code>to_aad_bytes()</code> method produces deterministic serialization: a tag
-byte (0x00 for Private, 0x01 for Sealed), followed by the content hash, and for
-Sealed, the <code>open_after</code> timestamp as little-endian i64.</p>
-<p><strong>Domain validation</strong> (<code>tesseras-core/src/service.rs</code>) —
-<code>TesseraService::create()</code> now rejects Sealed and Private tesseras that don't
-provide encryption keys. This is a domain-level validation: the service layer
-enforces that you cannot create a sealed memory without the cryptographic
-machinery to protect it. The error message is clear: "missing encryption keys
-for visibility sealed until 2050-01-01."</p>
-<p><strong>Core type updates</strong> — <code>TesseraIdentity</code> now includes an optional
-<code>encryption_public: Option&lt;HybridEncryptionPublic&gt;</code> field containing both the
-X25519 and ML-KEM-768 public keys. <code>KeyAlgorithm</code> gained <code>X25519</code> and <code>MlKem768</code>
-variants. The identity filesystem layout now supports <code>node.x25519.key</code>/<code>.pub</code>
-and <code>node.mlkem768.key</code>/<code>.pub</code>.</p>
-<p><strong>Testing</strong> — 8 unit tests for AES-256-GCM (roundtrip, wrong key, tampered
-ciphertext, wrong AAD, cross-context decryption failure, unique nonces, plus 2
-property-based tests for arbitrary payloads and nonce uniqueness). 5 unit tests
-for HybridKem (roundtrip, wrong keypair, tampered X25519, KDF determinism, plus
-1 property-based test). 4 unit tests for SealedKeyEnvelope and KeyPublication. 2
-integration tests covering the complete sealed and private tessera lifecycle:
-generate keys, create content key, encrypt, seal, unseal, decrypt, publish key,
-and verify — the full cycle.</p>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>Hybrid KEM from day one</strong>: X25519 + ML-KEM-768 follows the same philosophy
-as dual signing. We don't know which cryptographic assumptions will hold over
-millennia, so we combine classical and post-quantum algorithms. The cost is
-~1.2 KB of additional key material per identity — trivial compared to the
-photos and videos in a tessera.</li>
-<li><strong>BLAKE3 for KDF</strong>: rather than adding <code>hkdf</code> + <code>sha2</code> as new dependencies, we
-use <code>blake3::derive_key</code> with a fixed context string. BLAKE3's key derivation
-mode is specifically designed for this use case, and the project already
-depends on BLAKE3 for content hashing.</li>
-<li><strong>Immutable manifests</strong>: when a sealed tessera's <code>open_after</code> date passes, the
-content key is published as a separate signed artifact (<code>KeyPublication</code>), not
-by modifying the manifest. This preserves the append-only, content-addressed
-nature of tesseras. The manifest was signed at creation time and never
-changes.</li>
-<li><strong>AAD binding prevents ciphertext swapping</strong>: the <code>EncryptionContext</code> binds
-both the content hash and (for sealed tesseras) the <code>open_after</code> timestamp
-into the AES-GCM authenticated data. An attacker who copies encrypted content
-from a "sealed until 2050" tessera into a "sealed until 2025" tessera will
-find that decryption fails — the AAD no longer matches.</li>
-<li><strong>XOR key wrapping</strong>: the sealed key envelope uses a simple XOR of the content
-key with the KEM-derived transport key, rather than an additional layer of
-AES-GCM. Since the transport key is a fresh random value from the KEM and is
-used exactly once, XOR is information-theoretically secure for this specific
-use case and avoids unnecessary complexity.</li>
-<li><strong>Domain validation, not storage validation</strong>: the "missing encryption keys"
-check lives in <code>TesseraService::create()</code>, not in the storage layer. This
-follows the hexagonal architecture pattern: domain rules are enforced at the
-service boundary, not scattered across adapters.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<ul>
-<li><strong>Phase 4 continued: Resilience and Scale</strong> — Shamir's Secret Sharing for heir
-key distribution, advanced NAT traversal (STUN/TURN), performance tuning,
-security audits, OS packaging</li>
-<li><strong>Phase 5: Exploration and Culture</strong> — Public tessera browser by
-era/location/theme/language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)</li>
-</ul>
-<p>Sealed tesseras make Tesseras a true time capsule. A father can now record a
-message for his unborn grandchild, seal it until 2060, and know that the
-cryptographic envelope will hold — even if the quantum computers of the future
-try to break it open early.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/phase4-encryption-sealed/index.html.gz b/news/phase4-encryption-sealed/index.html.gz
deleted file mode 100644
index 817b650..0000000
--- a/news/phase4-encryption-sealed/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/phase4-institutional-onboarding/index.html b/news/phase4-institutional-onboarding/index.html
deleted file mode 100644
index cbd9ac3..0000000
--- a/news/phase4-institutional-onboarding/index.html
+++ /dev/null
@@ -1,239 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Phase 4: Institutional Node Onboarding — Tesseras</title>
- <meta name="description" content="Libraries, archives, and museums can now join the Tesseras network as verified institutional nodes with DNS-based identity, full-text search indexes, and configurable storage pledges.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Phase 4: Institutional Node Onboarding">
- <meta property="og:description" content="Libraries, archives, and museums can now join the Tesseras network as verified institutional nodes with DNS-based identity, full-text search indexes, and configurable storage pledges.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Phase 4: Institutional Node Onboarding">
- <meta name="twitter:description" content="Libraries, archives, and museums can now join the Tesseras network as verified institutional nodes with DNS-based identity, full-text search indexes, and configurable storage pledges.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;phase4-institutional-onboarding&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Phase 4: Institutional Node Onboarding</h2>
- <p class="news-date">2026-02-15</p>
- <p>A P2P network of individuals is fragile. Hard drives die, phones get lost,
-people lose interest. The long-term survival of humanity's memories depends on
-institutions — libraries, archives, museums, universities — that measure their
-lifetimes in centuries. Phase 4 continues with institutional node onboarding:
-verified organizations can now pledge storage, run searchable indexes, and
-participate in the network with a distinct identity.</p>
-<p>The design follows a principle of trust but verify: institutions identify
-themselves via DNS TXT records (the same mechanism used by SPF, DKIM, and DMARC
-for email), pledge a storage budget, and receive reciprocity exemptions so they
-can store fragments for others without expecting anything in return. In
-exchange, the network treats their fragments as higher-quality replicas and
-limits over-reliance on any single institution through diversity constraints.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong>Capability bits</strong> (<code>tesseras-core/src/network.rs</code>) — Two new flags added to
-the <code>Capabilities</code> bitfield: <code>INSTITUTIONAL</code> (bit 7) and <code>SEARCH_INDEX</code> (bit 8).
-A new <code>institutional_default()</code> constructor returns the full Phase 2 capability
-set plus these two bits and <code>RELAY</code>. Normal nodes advertise <code>phase2_default()</code>
-which lacks institutional flags. Serialization roundtrip tests verify the new
-bits survive MessagePack encoding.</p>
-<p><strong>Search types</strong> (<code>tesseras-core/src/search.rs</code>) — Three new domain types for
-the search subsystem:</p>
-<ul>
-<li><code>SearchFilters</code> — query parameters: <code>memory_type</code>, <code>visibility</code>, <code>language</code>,
-<code>date_range</code>, <code>geo</code> (bounding box), <code>page</code>, <code>page_size</code></li>
-<li><code>SearchHit</code> — a single result: content hash plus a <code>MetadataExcerpt</code> (title,
-description, memory type, creation date, visibility, language, tags)</li>
-<li><code>GeoFilter</code> — bounding box with <code>min_lat</code>, <code>max_lat</code>, <code>min_lon</code>, <code>max_lon</code> for
-spatial queries</li>
-</ul>
-<p>All types derive <code>Serialize</code>/<code>Deserialize</code> for wire transport and
-<code>Clone</code>/<code>Debug</code> for diagnostics.</p>
-<p><strong>Institutional daemon config</strong> (<code>tesd/src/config.rs</code>) — A new <code>[institutional]</code>
-TOML section with <code>domain</code> (the DNS domain to verify), <code>pledge_bytes</code> (storage
-commitment in bytes), and <code>search_enabled</code> (toggle for the FTS5 index). The
-<code>to_dht_config()</code> method now sets <code>Capabilities::institutional_default()</code> when
-institutional config is present, so institutional nodes advertise the right
-capability bits in Pong responses.</p>
-<p><strong>DNS TXT verification</strong> (<code>tesd/src/institutional.rs</code>) — Async DNS resolution
-using <code>hickory-resolver</code> to verify institutional identity. The daemon looks up
-<code>_tesseras.&lt;domain&gt;</code> TXT records and parses key-value fields: <code>v</code> (version),
-<code>node</code> (hex-encoded node ID), and <code>pledge</code> (storage pledge in bytes).
-Verification checks:</p>
-<ol>
-<li>A TXT record exists at <code>_tesseras.&lt;domain&gt;</code></li>
-<li>The <code>node</code> field matches the daemon's own node ID</li>
-<li>The <code>pledge</code> field is present and valid</li>
-</ol>
-<p>On startup, the daemon attempts DNS verification. If it succeeds, the node runs
-with institutional capabilities. If it fails, the node logs a warning and
-downgrades to a normal full node — no crash, no manual intervention.</p>
-<p><strong>CLI setup command</strong> (<code>tesseras-cli/src/institutional.rs</code>) — A new
-<code>institutional setup</code> subcommand that guides operators through onboarding:</p>
-<ol>
-<li>Reads the node's identity from the data directory</li>
-<li>Prompts for domain name and pledge size</li>
-<li>Generates the exact DNS TXT record to add:
-<code>v=tesseras1 node=&lt;hex&gt; pledge=&lt;bytes&gt;</code></li>
-<li>Writes the institutional section to the daemon's config file</li>
-<li>Prints next steps: add the TXT record, restart the daemon</li>
-</ol>
-<p><strong>SQLite search index</strong> (<code>tesseras-storage</code>) — A migration
-(<code>003_institutional.sql</code>) that creates three structures:</p>
-<ul>
-<li><code>search_content</code> — an FTS5 virtual table for full-text search over tessera
-metadata (title, description, creator, tags, language)</li>
-<li><code>geo_index</code> — an R-tree virtual table for spatial bounding-box queries over
-latitude/longitude</li>
-<li><code>geo_map</code> — a mapping table linking R-tree row IDs to content hashes</li>
-</ul>
-<p>The <code>SqliteSearchIndex</code> adapter implements the <code>SearchIndex</code> port trait with
-<code>index_tessera()</code> (insert/update) and <code>search()</code> (query with filters). FTS5
-queries support natural language search; geo queries use R-tree <code>INTERSECT</code> for
-bounding box lookups. Results are ranked by FTS5 relevance score.</p>
-<p>The migration also adds an <code>is_institutional</code> column to the <code>reciprocity</code> table,
-handled idempotently via <code>pragma_table_info</code> checks (SQLite's
-<code>ALTER TABLE ADD COLUMN</code> lacks <code>IF NOT EXISTS</code>).</p>
-<p><strong>Reciprocity bypass</strong> (<code>tesseras-replication/src/service.rs</code>) — Institutional
-nodes are exempt from reciprocity checks. When <code>receive_fragment()</code> is called,
-if the sender's node ID is marked as institutional in the reciprocity ledger,
-the balance check is skipped entirely. This means institutions can store
-fragments for the entire network without needing to "earn" credits first — their
-DNS-verified identity and storage pledge serve as their credential.</p>
-<p><strong>Node-type diversity constraint</strong> (<code>tesseras-replication/src/distributor.rs</code>) —
-A new <code>apply_institutional_diversity()</code> function limits how many replicas of a
-single tessera can land on institutional nodes. The cap is
-<code>ceil(replication_factor / 3.5)</code> — with the default <code>r=7</code>, at most 2 of 7
-replicas go to institutions. This prevents the network from becoming dependent
-on a small number of large institutions: if a university's servers go down, at
-least 5 replicas remain on independent nodes.</p>
-<p><strong>DHT message extensions</strong> (<code>tesseras-dht/src/message.rs</code>) — Two new message
-variants:</p>
-<table><thead><tr><th>Message</th><th>Purpose</th></tr></thead><tbody>
-<tr><td><code>Search</code></td><td>Client sends query string, filters, and page number</td></tr>
-<tr><td><code>SearchResult</code></td><td>Institutional node responds with hits and total count</td></tr>
-</tbody></table>
-<p>The <code>encode()</code> function was switched from positional to named MessagePack
-serialization (<code>rmp_serde::to_vec_named</code>) to handle <code>SearchFilters</code>' optional
-fields correctly — positional encoding breaks when <code>skip_serializing_if</code> omits
-fields.</p>
-<p><strong>Prometheus metrics</strong> (<code>tesd/src/metrics.rs</code>) — Eight institutional-specific
-metrics:</p>
-<ul>
-<li><code>tesseras_institutional_pledge_bytes</code> — configured storage pledge</li>
-<li><code>tesseras_institutional_stored_bytes</code> — actual bytes stored</li>
-<li><code>tesseras_institutional_pledge_utilization_ratio</code> — stored/pledged ratio</li>
-<li><code>tesseras_institutional_peers_served</code> — unique peers served fragments</li>
-<li><code>tesseras_institutional_search_index_total</code> — tesseras in the search index</li>
-<li><code>tesseras_institutional_search_queries_total</code> — search queries received</li>
-<li><code>tesseras_institutional_dns_verification_status</code> — 1 if DNS verified, 0
-otherwise</li>
-<li><code>tesseras_institutional_dns_verification_last</code> — Unix timestamp of last
-verification</li>
-</ul>
-<p><strong>Integration tests</strong> — Two tests in
-<code>tesseras-replication/tests/integration.rs</code>:</p>
-<ul>
-<li><code>institutional_peer_bypasses_reciprocity</code> — verifies that an institutional
-peer with a massive deficit (-999,999 balance) is still allowed to store
-fragments, while a non-institutional peer with the same deficit is rejected</li>
-<li><code>institutional_node_accepts_fragment_despite_deficit</code> — full async test using
-<code>ReplicationService</code> with mocked DHT, fragment store, reciprocity ledger, and
-blob store: sends a fragment from an institutional sender and verifies it's
-accepted</li>
-</ul>
-<p>322 tests pass across the workspace. Clippy clean with <code>-D warnings</code>.</p>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>DNS TXT over PKI or blockchain</strong>: DNS is universally deployed, universally
-understood, and already used for domain verification (SPF, DKIM, Let's
-Encrypt). Institutions already manage DNS. No certificate authority, no token,
-no on-chain transaction — just a TXT record. If an institution loses control
-of their domain, the verification naturally fails on the next check.</li>
-<li><strong>Graceful degradation on DNS failure</strong>: if DNS verification fails at startup,
-the daemon downgrades to a normal full node instead of refusing to start. This
-prevents operational incidents — a DNS misconfiguration shouldn't take a node
-offline.</li>
-<li><strong>Diversity cap at <code>ceil(r / 3.5)</code></strong>: with <code>r=7</code>, at most 2 replicas go to
-institutions. This is conservative — it ensures the network never depends on
-institutions for majority quorum, while still benefiting from their storage
-capacity and uptime.</li>
-<li><strong>Named MessagePack encoding</strong>: switching from positional to named encoding
-adds ~15% overhead per message but eliminates a class of serialization bugs
-when optional fields are present. The DHT is not bandwidth-constrained at the
-message level, so the tradeoff is worth it.</li>
-<li><strong>Reciprocity exemption over credit grants</strong>: rather than giving institutions
-a large initial credit balance (which is arbitrary and needs tuning), we
-exempt them entirely. Their DNS-verified identity and public storage pledge
-replace the bilateral reciprocity mechanism.</li>
-<li><strong>FTS5 + R-tree in SQLite</strong>: full-text search and spatial indexing are built
-into SQLite as loadable extensions. No external search engine (Elasticsearch,
-Meilisearch) needed. This keeps the deployment a single binary with a single
-database file — critical for institutional operators who may not have a DevOps
-team.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<ul>
-<li><strong>Phase 4 continued</strong> — storage deduplication (content-addressable store with
-BLAKE3 keying), security audits, OS packaging (Alpine, Arch, Debian, OpenBSD,
-FreeBSD)</li>
-<li><strong>Phase 5: Exploration and Culture</strong> — public tessera browser by
-era/location/theme/language, institutional curation, genealogy integration
-(FamilySearch, Ancestry), physical media export (M-DISC, microfilm, acid-free
-paper with QR), AI-assisted context</li>
-</ul>
-<p>Institutional onboarding closes a critical gap in Tesseras' preservation model.
-Individual nodes provide grassroots resilience — thousands of devices across the
-globe, each storing a few fragments. Institutional nodes provide anchoring —
-organizations with professional infrastructure, redundant storage, and
-multi-decade operational horizons. Together, they form a network where memories
-can outlast both individual devices and individual institutions.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/phase4-institutional-onboarding/index.html.gz b/news/phase4-institutional-onboarding/index.html.gz
deleted file mode 100644
index 92beb89..0000000
--- a/news/phase4-institutional-onboarding/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/phase4-nat-traversal/index.html b/news/phase4-nat-traversal/index.html
deleted file mode 100644
index 1d7748b..0000000
--- a/news/phase4-nat-traversal/index.html
+++ /dev/null
@@ -1,228 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Phase 4: Punching Through NATs — Tesseras</title>
- <meta name="description" content="Tesseras nodes can now discover their NAT type via STUN, coordinate UDP hole punching through introducers, and fall back to transparent relay forwarding when direct connectivity fails.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Phase 4: Punching Through NATs">
- <meta property="og:description" content="Tesseras nodes can now discover their NAT type via STUN, coordinate UDP hole punching through introducers, and fall back to transparent relay forwarding when direct connectivity fails.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Phase 4: Punching Through NATs">
- <meta name="twitter:description" content="Tesseras nodes can now discover their NAT type via STUN, coordinate UDP hole punching through introducers, and fall back to transparent relay forwarding when direct connectivity fails.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;phase4-nat-traversal&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Phase 4: Punching Through NATs</h2>
- <p class="news-date">2026-02-15</p>
- <p>Most people's devices sit behind a NAT — a network address translator that lets
-them reach the internet but prevents incoming connections. For a P2P network,
-this is an existential problem: if two nodes behind NATs can't talk to each
-other, the network fragments. Phase 4 continues with a full NAT traversal stack:
-STUN-based discovery, coordinated hole punching, and relay fallback.</p>
-<p>The approach follows the same pattern as most battle-tested P2P systems (WebRTC,
-BitTorrent, IPFS): try the cheapest option first, escalate only when necessary.
-Direct connectivity costs nothing. Hole punching costs a few coordinated
-packets. Relaying costs sustained bandwidth from a third party. Tesseras tries
-them in that order.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong>NatType classification</strong> (<code>tesseras-core/src/network.rs</code>) — A new <code>NatType</code>
-enum (Public, Cone, Symmetric, Unknown) added to the core domain layer. This
-type is shared across the entire stack: the STUN client writes it, the DHT
-advertises it in Pong messages, and the punch coordinator reads it to decide
-whether hole punching is even worth attempting (Cone-to-Cone works ~80% of the
-time; Symmetric-to-Symmetric almost never works).</p>
-<p><strong>STUN client</strong> (<code>tesseras-net/src/stun.rs</code>) — A minimal STUN implementation
-(RFC 5389 Binding Request/Response) that discovers a node's external address.
-The codec encodes 20-byte binding requests with a random transaction ID and
-decodes XOR-MAPPED-ADDRESS responses. The <code>discover_nat()</code> function queries
-multiple STUN servers in parallel (Google, Cloudflare by default), compares the
-mapped addresses, and classifies the NAT type:</p>
-<ul>
-<li>Same IP and port from all servers → <strong>Public</strong> (no NAT)</li>
-<li>Same mapped address from all servers → <strong>Cone</strong> (hole punching works)</li>
-<li>Different mapped addresses → <strong>Symmetric</strong> (hole punching unreliable)</li>
-<li>No responses → <strong>Unknown</strong></li>
-</ul>
-<p>Retries with exponential backoff and configurable timeouts. 12 tests covering
-codec roundtrips, all classification paths, and async loopback queries.</p>
-<p><strong>Signed punch coordination</strong> (<code>tesseras-net/src/punch.rs</code>) — Ed25519 signing
-and verification for <code>PunchIntro</code>, <code>RelayRequest</code>, and <code>RelayMigrate</code> messages.
-Every introduction is signed by the initiator with a 30-second timestamp window,
-preventing reflection attacks (where an attacker replays an old introduction to
-redirect traffic). The payload format is <code>target || external_addr || timestamp</code>
-— changing any field invalidates the signature. 6 unit tests plus 3
-property-based tests with proptest (arbitrary node IDs, ports, and session
-tokens).</p>
-<p><strong>Relay session manager</strong> (<code>tesseras-net/src/relay.rs</code>) — Manages transparent
-UDP relay sessions between NATed peers. Each session has a random 16-byte token;
-peers prefix their packets with the token, the relay strips it and forwards.
-Features:</p>
-<ul>
-<li>Bidirectional forwarding (A→R→B and B→R→A)</li>
-<li>Rate limiting: 256 KB/s for reciprocal peers, 64 KB/s for non-reciprocal</li>
-<li>10-minute maximum duration for bootstrap (non-reciprocal) sessions</li>
-<li>Address migration: when a peer's IP changes (Wi-Fi to cellular), a signed
-<code>RelayMigrate</code> updates the session without tearing it down</li>
-<li>Idle cleanup with configurable timeout</li>
-<li>8 unit tests plus 2 property-based tests</li>
-</ul>
-<p><strong>DHT message extensions</strong> (<code>tesseras-dht/src/message.rs</code>) — Seven new message
-variants added to the DHT protocol:</p>
-<table><thead><tr><th>Message</th><th>Purpose</th></tr></thead><tbody>
-<tr><td><code>PunchIntro</code></td><td>"I want to connect to node X, here's my signed external address"</td></tr>
-<tr><td><code>PunchRequest</code></td><td>Introducer forwards the request to the target</td></tr>
-<tr><td><code>PunchReady</code></td><td>Target confirms readiness, sends its external address</td></tr>
-<tr><td><code>RelayRequest</code></td><td>"Create a relay session to node X"</td></tr>
-<tr><td><code>RelayOffer</code></td><td>Relay responds with its address and session token</td></tr>
-<tr><td><code>RelayClose</code></td><td>Tear down a relay session</td></tr>
-<tr><td><code>RelayMigrate</code></td><td>Update session after network change</td></tr>
-</tbody></table>
-<p>The <code>Pong</code> message was extended with NAT metadata: <code>nat_type</code>,
-<code>relay_slots_available</code>, and <code>relay_bandwidth_used_kbps</code>. All new fields use
-<code>#[serde(default)]</code> for backward compatibility — old nodes ignore what they
-don't recognize, new nodes fall back to defaults. 9 new serialization roundtrip
-tests.</p>
-<p><strong>NatHandler trait and dispatch</strong> (<code>tesseras-dht/src/engine.rs</code>) — A new
-<code>NatHandler</code> async trait (5 methods) injected into the DHT engine, following the
-same dependency injection pattern as the existing <code>ReplicationHandler</code>. The
-engine's message dispatch loop now routes all punch/relay messages to the
-handler. This keeps the DHT engine protocol-agnostic while allowing the NAT
-traversal logic to live in <code>tesseras-net</code>.</p>
-<p><strong>Mobile reconnection types</strong> (<code>tesseras-embedded/src/reconnect.rs</code>) — A
-three-phase reconnection state machine for mobile devices:</p>
-<ol>
-<li><strong>QuicMigration</strong> (0-2s) — try QUIC connection migration for all active peers</li>
-<li><strong>ReStun</strong> (2-5s) — re-discover external address via STUN</li>
-<li><strong>ReEstablish</strong> (5-10s) — reconnect peers that migration couldn't save</li>
-</ol>
-<p>Peers are reconnected in priority order: bootstrap nodes first, then nodes
-holding our fragments, then nodes whose fragments we hold, then general DHT
-neighbors. A new <code>NetworkChanged</code> event variant was added to the FFI event
-stream so the Flutter app can show reconnection progress.</p>
-<p><strong>Daemon NAT configuration</strong> (<code>tesd/src/config.rs</code>) — A new <code>[nat]</code> section in
-the TOML config with STUN server list, relay toggle, max relay sessions,
-bandwidth limits (reciprocal vs bootstrap), and idle timeout. All fields have
-sensible defaults; relay is disabled by default.</p>
-<p><strong>Prometheus metrics</strong> (<code>tesseras-net/src/metrics.rs</code>) — 16 metrics across four
-subsystems:</p>
-<ul>
-<li><strong>STUN</strong>: requests, failures, latency histogram</li>
-<li><strong>Punch</strong>: attempts/successes/failures (by NAT type pair), latency histogram</li>
-<li><strong>Relay</strong>: active sessions, total sessions, bytes forwarded, idle timeouts,
-rate limit hits</li>
-<li><strong>Reconnect</strong>: network changes, attempts/successes by phase, duration
-histogram</li>
-</ul>
-<p>6 tests verifying registration, increment, label cardinality, and
-double-registration detection.</p>
-<p><strong>Integration tests</strong> — Two end-to-end tests using <code>MemTransport</code> (in-memory
-simulated network):</p>
-<ul>
-<li><code>punch_integration.rs</code> — Full 3-node hole-punch flow: A sends signed
-<code>PunchIntro</code> to introducer I, I verifies and forwards <code>PunchRequest</code> to B, B
-verifies the original signature and sends <code>PunchReady</code> back, A and B exchange
-messages directly. Also tests that a bad signature is correctly rejected.</li>
-<li><code>relay_integration.rs</code> — Full 3-node relay flow: A requests relay from R, R
-creates session and sends <code>RelayOffer</code> to both peers, A and B exchange
-token-prefixed packets through R, A migrates to a new address mid-session, A
-closes the session, and the test verifies the session is torn down and further
-forwarding fails.</li>
-</ul>
-<p><strong>Property tests</strong> — 7 proptest-based tests covering: signature round-trips for
-all three signed message types (arbitrary node IDs, ports, tokens), NAT
-classification determinism (same inputs always produce same output), STUN
-binding request validity, session token uniqueness, and relay rejection of
-too-short packets.</p>
-<p><strong>Justfile targets</strong> — <code>just test-nat</code> runs all NAT traversal tests across
-<code>tesseras-net</code> and <code>tesseras-dht</code>. <code>just test-chaos</code> is a placeholder for future
-Docker Compose chaos tests with <code>tc netem</code>.</p>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>STUN over TURN</strong>: we implement STUN (discovery) and custom relay rather than
-full TURN. TURN requires authenticated allocation and is designed for media
-relay; our relay is simpler — token-prefixed UDP forwarding with rate limits.
-This keeps the protocol minimal and avoids depending on external TURN servers.</li>
-<li><strong>Signatures on introductions</strong>: every <code>PunchIntro</code> is signed by the
-initiator. Without this, an attacker could send forged introductions to
-redirect a node's hole-punch attempts to an attacker-controlled address (a
-reflection attack). The 30-second timestamp window limits replay.</li>
-<li><strong>Reciprocal bandwidth tiers</strong>: relay nodes give 4x more bandwidth (256 vs 64
-KB/s) to peers with good reciprocity scores. This incentivizes nodes to store
-fragments for others — if you contribute, you get better relay service when
-you need it.</li>
-<li><strong>Backward-compatible Pong extension</strong>: new NAT fields in <code>Pong</code> use
-<code>#[serde(default)]</code> and <code>Option&lt;T&gt;</code>. Old nodes that don't understand these
-fields simply skip them during deserialization. No protocol version bump
-needed.</li>
-<li><strong>NatHandler as async trait</strong>: the NAT traversal logic is injected into the
-DHT engine via a trait, just like <code>ReplicationHandler</code>. This keeps the DHT
-engine focused on routing and peer management, and allows the NAT
-implementation to be swapped or disabled without touching core DHT code.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<ul>
-<li><strong>Phase 4 continued</strong> — performance tuning (connection pooling, fragment
-caching, SQLite WAL), security audits, institutional node onboarding, OS
-packaging</li>
-<li><strong>Phase 5: Exploration and Culture</strong> — public tessera browser by
-era/location/theme/language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)</li>
-</ul>
-<p>With NAT traversal, Tesseras can connect nodes regardless of their network
-topology. Public nodes talk directly. Cone-NATed nodes punch through with an
-introducer's help. Symmetric-NATed or firewalled nodes relay through willing
-peers. The network adapts to the real world, where most devices are behind a NAT
-and network conditions change constantly.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/phase4-nat-traversal/index.html.gz b/news/phase4-nat-traversal/index.html.gz
deleted file mode 100644
index 57b93d2..0000000
--- a/news/phase4-nat-traversal/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/phase4-performance-tuning/index.html b/news/phase4-performance-tuning/index.html
deleted file mode 100644
index 5426996..0000000
--- a/news/phase4-performance-tuning/index.html
+++ /dev/null
@@ -1,164 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Phase 4: Performance Tuning — Tesseras</title>
- <meta name="description" content="SQLite WAL mode with centralized pragma configuration, LRU fragment caching, QUIC connection pool lifecycle management, and attestation hot path optimization.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Phase 4: Performance Tuning">
- <meta property="og:description" content="SQLite WAL mode with centralized pragma configuration, LRU fragment caching, QUIC connection pool lifecycle management, and attestation hot path optimization.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Phase 4: Performance Tuning">
- <meta name="twitter:description" content="SQLite WAL mode with centralized pragma configuration, LRU fragment caching, QUIC connection pool lifecycle management, and attestation hot path optimization.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;phase4-performance-tuning&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Phase 4: Performance Tuning</h2>
- <p class="news-date">2026-02-15</p>
- <p>A P2P network that can traverse NATs but chokes on its own I/O is not much use.
-Phase 4 continues with performance tuning: centralizing database configuration,
-caching fragment blobs in memory, managing QUIC connection lifecycles, and
-eliminating unnecessary disk reads from the attestation hot path.</p>
-<p>The guiding principle was the same as the rest of Tesseras: do the simplest
-thing that actually works. No custom allocators, no lock-free data structures,
-no premature complexity. A centralized <code>StorageConfig</code>, an LRU cache, a
-connection reaper, and a targeted fix to avoid re-reading blobs that were
-already checksummed.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong>Centralized SQLite configuration</strong> (<code>tesseras-storage/src/database.rs</code>) — A
-new <code>StorageConfig</code> struct and <code>open_database()</code> / <code>open_in_memory()</code> functions
-that apply all SQLite pragmas in one place: WAL journal mode, foreign keys,
-synchronous mode (NORMAL by default, FULL for unstable hardware like RPi + SD
-card), busy timeout, page cache size, and WAL autocheckpoint interval.
-Previously, each call site opened a connection and applied pragmas ad hoc. Now
-the daemon, CLI, and tests all go through the same path. 7 tests covering
-foreign keys, busy timeout, journal mode, migrations, synchronous modes, and
-on-disk WAL file creation.</p>
-<p><strong>LRU fragment cache</strong> (<code>tesseras-storage/src/cache.rs</code>) — A
-<code>CachedFragmentStore</code> that wraps any <code>FragmentStore</code> with a byte-aware LRU
-cache. Fragment blobs are cached on read and invalidated on write or delete.
-When the cache exceeds its configured byte limit, the least recently used
-entries are evicted. The cache is transparent: it implements <code>FragmentStore</code>
-itself, so the rest of the stack doesn't know it's there. Optional Prometheus
-metrics track hits, misses, and current byte usage. 3 tests: cache hit avoids
-inner read, store invalidates cache, eviction when over max bytes.</p>
-<p><strong>Prometheus storage metrics</strong> (<code>tesseras-storage/src/metrics.rs</code>) — A
-<code>StorageMetrics</code> struct with three counters/gauges: <code>fragment_cache_hits</code>,
-<code>fragment_cache_misses</code>, and <code>fragment_cache_bytes</code>. Registered with the
-Prometheus registry and wired into the fragment cache via <code>with_metrics()</code>.</p>
-<p><strong>Attestation hot path fix</strong> (<code>tesseras-replication/src/service.rs</code>) — The
-attestation flow previously read every fragment blob from disk and recomputed
-its BLAKE3 checksum. Since <code>list_fragments()</code> already returns <code>FragmentId</code> with
-a stored checksum, the fix is trivial: use <code>frag.checksum</code> instead of
-<code>blake3::hash(&amp;data)</code>. This eliminates one disk read per fragment during
-attestation — for a tessera with 100 fragments, that's 100 fewer reads. A test
-with <code>expect_read_fragment().never()</code> verifies no blob reads happen during
-attestation.</p>
-<p><strong>QUIC connection pool lifecycle</strong> (<code>tesseras-net/src/quinn_transport.rs</code>) — A
-<code>PoolConfig</code> struct controlling max connections, idle timeout, and reaper
-interval. <code>PooledConnection</code> wraps each <code>quinn::Connection</code> with a <code>last_used</code>
-timestamp. When the pool reaches capacity, the oldest idle connection is evicted
-before opening a new one. A background reaper task (Tokio spawn) periodically
-closes connections that have been idle beyond the timeout. 4 new pool metrics:
-<code>tesseras_conn_pool_size</code>, <code>pool_hits_total</code>, <code>pool_misses_total</code>,
-<code>pool_evictions_total</code>.</p>
-<p><strong>Daemon integration</strong> (<code>tesd/src/config.rs</code>, <code>main.rs</code>) — A new <code>[performance]</code>
-section in the TOML config with fields for SQLite cache size, synchronous mode,
-busy timeout, fragment cache size, max connections, idle timeout, and reaper
-interval. The daemon's <code>main()</code> now calls <code>open_database()</code> with the configured
-<code>StorageConfig</code>, wraps <code>FsFragmentStore</code> with <code>CachedFragmentStore</code>, and binds
-QUIC with the configured <code>PoolConfig</code>. The direct <code>rusqlite</code> dependency was
-removed from the daemon crate.</p>
-<p><strong>CLI migration</strong> (<code>tesseras-cli/src/commands/init.rs</code>, <code>create.rs</code>) — Both
-<code>init</code> and <code>create</code> commands now use <code>tesseras_storage::open_database()</code> with
-the default <code>StorageConfig</code> instead of opening raw <code>rusqlite</code> connections. The
-<code>rusqlite</code> dependency was removed from the CLI crate.</p>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>Decorator pattern for caching</strong>: <code>CachedFragmentStore</code> wraps
-<code>Box&lt;dyn FragmentStore&gt;</code> and implements <code>FragmentStore</code> itself. This means
-caching is opt-in, composable, and invisible to consumers. The daemon enables
-it; tests can skip it.</li>
-<li><strong>Byte-aware eviction</strong>: the LRU cache tracks total bytes, not entry count.
-Fragment blobs vary wildly in size (a 4KB text fragment vs a 2MB photo shard),
-so counting entries would give a misleading picture of memory usage.</li>
-<li><strong>No connection pool crate</strong>: instead of pulling in a generic pool library,
-the connection pool is a thin wrapper around
-<code>DashMap&lt;SocketAddr, PooledConnection&gt;</code> with a Tokio reaper. QUIC connections
-are multiplexed, so the "pool" is really about lifecycle management (idle
-cleanup, max connections) rather than borrowing/returning.</li>
-<li><strong>Stored checksums over re-reads</strong>: the attestation fix is intentionally
-minimal — one line changed, one disk read removed per fragment. The checksums
-were already stored in SQLite by <code>store_fragment()</code>, they just weren't being
-used.</li>
-<li><strong>Centralized pragma configuration</strong>: a single <code>StorageConfig</code> struct replaces
-scattered <code>PRAGMA</code> calls. The <code>sqlite_synchronous_full</code> flag exists
-specifically for Raspberry Pi deployments where the kernel can crash and lose
-un-checkpointed WAL transactions.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<ul>
-<li><strong>Phase 4 continued</strong> — Shamir's Secret Sharing for heirs, sealed tesseras
-(time-lock encryption), security audits, institutional node onboarding,
-storage deduplication, OS packaging</li>
-<li><strong>Phase 5: Exploration and Culture</strong> — public tessera browser by
-era/location/theme/language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)</li>
-</ul>
-<p>With performance tuning in place, Tesseras handles the common case efficiently:
-fragment reads hit the LRU cache, attestation skips disk I/O, idle QUIC
-connections are reaped automatically, and SQLite is configured consistently
-across the entire stack. The next steps focus on cryptographic features (Shamir,
-time-lock) and hardening for production deployment.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/phase4-performance-tuning/index.html.gz b/news/phase4-performance-tuning/index.html.gz
deleted file mode 100644
index 98c6079..0000000
--- a/news/phase4-performance-tuning/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/phase4-shamir-heir-recovery/index.html b/news/phase4-shamir-heir-recovery/index.html
deleted file mode 100644
index 3acf79a..0000000
--- a/news/phase4-shamir-heir-recovery/index.html
+++ /dev/null
@@ -1,199 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Phase 4: Heir Key Recovery with Shamir&#x27;s Secret Sharing — Tesseras</title>
- <meta name="description" content="Tesseras now lets you split your cryptographic identity into shares distributed to trusted heirs — any threshold of them can reconstruct your keys, but fewer reveal nothing.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Phase 4: Heir Key Recovery with Shamir&#x27;s Secret Sharing">
- <meta property="og:description" content="Tesseras now lets you split your cryptographic identity into shares distributed to trusted heirs — any threshold of them can reconstruct your keys, but fewer reveal nothing.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Phase 4: Heir Key Recovery with Shamir&#x27;s Secret Sharing">
- <meta name="twitter:description" content="Tesseras now lets you split your cryptographic identity into shares distributed to trusted heirs — any threshold of them can reconstruct your keys, but fewer reveal nothing.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;phase4-shamir-heir-recovery&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Phase 4: Heir Key Recovery with Shamir&#x27;s Secret Sharing</h2>
- <p class="news-date">2026-02-15</p>
- <p>What happens to your memories when you die? Until now, Tesseras could preserve
-content across millennia — but the private and sealed keys died with their
-owner. Phase 4 continues with a solution: Shamir's Secret Sharing, a
-cryptographic scheme that lets you split your identity into shares and
-distribute them to the people you trust most.</p>
-<p>The math is elegant: you choose a threshold T and a total N. Any T shares
-reconstruct the full secret; T-1 shares reveal absolutely nothing. This is not
-"almost nothing" — it is information-theoretically secure. An attacker with one
-fewer share than the threshold has exactly zero bits of information about the
-secret, no matter how much computing power they have.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong>GF(256) finite field arithmetic</strong> (<code>tesseras-crypto/src/shamir/gf256.rs</code>) —
-Shamir's Secret Sharing requires arithmetic in a finite field. We implement
-GF(256) using the same irreducible polynomial as AES (x^8 + x^4 + x^3 + x + 1),
-with compile-time lookup tables for logarithm and exponentiation. All operations
-are constant-time via table lookups — no branches on secret data. The module
-includes Horner's method for polynomial evaluation and Lagrange interpolation at
-x=0 for secret recovery. 233 lines, exhaustively tested: all 256 elements for
-identity/inverse properties, commutativity, and associativity.</p>
-<p><strong>ShamirSplitter</strong> (<code>tesseras-crypto/src/shamir/mod.rs</code>) — The core
-split/reconstruct API. <code>split()</code> takes a secret byte slice, a configuration
-(threshold T, total N), and the owner's Ed25519 public key. For each byte of the
-secret, it constructs a random polynomial of degree T-1 over GF(256) with the
-secret byte as the constant term, then evaluates it at N distinct points.
-<code>reconstruct()</code> takes T or more shares and recovers the secret via Lagrange
-interpolation. Both operations include extensive validation: threshold bounds,
-session consistency, owner fingerprint matching, and BLAKE3 checksum
-verification.</p>
-<p><strong>HeirShare format</strong> — Each share is a self-contained, serializable artifact
-with:</p>
-<ul>
-<li>Format version (v1) for forward compatibility</li>
-<li>Share index (1..N) and threshold/total metadata</li>
-<li>Session ID (random 8 bytes) — prevents mixing shares from different split
-sessions</li>
-<li>Owner fingerprint (first 8 bytes of BLAKE3 hash of the Ed25519 public key)</li>
-<li>Share data (the Shamir y-values, same length as the secret)</li>
-<li>BLAKE3 checksum over all preceding fields</li>
-</ul>
-<p>Shares are serialized in two formats: <strong>MessagePack</strong> (compact binary, for
-programmatic use) and <strong>base64 text</strong> (human-readable, for printing and physical
-storage). The text format includes a header with metadata and delimiters:</p>
-<pre><code>--- TESSERAS HEIR SHARE ---
-Format: v1
-Owner: a1b2c3d4e5f6a7b8 (fingerprint)
-Share: 1 of 3 (threshold: 2)
-Session: 9f8e7d6c5b4a3210
-Created: 2026-02-15
-
-&lt;base64-encoded MessagePack data&gt;
---- END HEIR SHARE ---
-</code></pre>
-<p>This format is designed to be printed on paper, stored in a safe deposit box, or
-engraved on metal. The header is informational — only the base64 payload is
-parsed during reconstruction.</p>
-<p><strong>CLI integration</strong> (<code>tesseras-cli/src/commands/heir.rs</code>) — Three new
-subcommands:</p>
-<ul>
-<li><code>tes heir create</code> — splits your Ed25519 identity into heir shares. Prompts for
-confirmation (your full identity is at stake), generates both <code>.bin</code> and
-<code>.txt</code> files for each share, and writes <code>heir_meta.json</code> to your identity
-directory.</li>
-<li><code>tes heir reconstruct</code> — loads share files (auto-detects binary vs text
-format), validates consistency, reconstructs the secret, derives the Ed25519
-keypair, and optionally installs it to <code>~/.tesseras/identity/</code> (with automatic
-backup of the existing identity).</li>
-<li><code>tes heir info</code> — displays share metadata and verifies the checksum without
-exposing any secret material.</li>
-</ul>
-<p><strong>Secret blob format</strong> — Identity keys are serialized into a versioned blob
-before splitting: a version byte (0x01), a flags byte (0x00 for Ed25519-only),
-followed by the 32-byte Ed25519 secret key. This leaves room for future
-expansion when X25519 and ML-KEM-768 private keys are integrated into the heir
-share system.</p>
-<p><strong>Testing</strong> — 20 unit tests for ShamirSplitter (roundtrip, all share
-combinations, insufficient shares, wrong owner, wrong session, threshold-1
-boundary, large secrets up to ML-KEM-768 key size). 7 unit tests for GF(256)
-arithmetic (exhaustive field properties). 3 property-based tests with proptest
-(arbitrary secrets up to 5000 bytes, arbitrary T-of-N configurations,
-information-theoretic security verification). Serialization roundtrip tests for
-both MessagePack and base64 text formats. 2 integration tests covering the
-complete heir lifecycle: generate identity, split into shares, serialize,
-deserialize, reconstruct, verify keypair, and sign/verify with reconstructed
-keys.</p>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>GF(256) over GF(prime)</strong>: we use GF(256) rather than a prime field because
-it maps naturally to bytes — each element is a single byte, each share is the
-same length as the secret. No big-integer arithmetic, no modular reduction, no
-padding. This is the same approach used by most real-world Shamir
-implementations including SSSS and Hashicorp Vault.</li>
-<li><strong>Compile-time lookup tables</strong>: the LOG and EXP tables for GF(256) are
-computed at compile time using <code>const fn</code>. This means zero runtime
-initialization cost and constant-time operations via table lookups rather than
-loops.</li>
-<li><strong>Session ID prevents cross-session mixing</strong>: each call to <code>split()</code> generates
-a fresh random session ID. If an heir accidentally uses shares from two
-different split sessions (e.g., before and after a key rotation),
-reconstruction fails cleanly with a validation error rather than producing
-garbage output.</li>
-<li><strong>BLAKE3 checksums detect corruption</strong>: each share includes a BLAKE3 checksum
-over its contents. This catches bit rot, transmission errors, and accidental
-truncation before any reconstruction attempt. A share printed on paper and
-scanned back via OCR will fail the checksum if a single character is wrong.</li>
-<li><strong>Owner fingerprint for identification</strong>: shares include the first 8 bytes of
-BLAKE3(Ed25519 public key) as a fingerprint. This lets heirs verify which
-identity a share belongs to without revealing the full public key. During
-reconstruction, the fingerprint is cross-checked against the recovered key.</li>
-<li><strong>Dual format for resilience</strong>: both binary (MessagePack) and text (base64)
-formats are generated because physical media has different failure modes than
-digital storage. A USB drive might fail; paper survives. A QR code might be
-unreadable; base64 text can be manually typed.</li>
-<li><strong>Blob versioning</strong>: the secret is wrapped in a versioned blob (version +
-flags + key material) so future versions can include additional keys (X25519,
-ML-KEM-768) without breaking backward compatibility with existing shares.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<ul>
-<li><strong>Phase 4 continued: Resilience and Scale</strong> — advanced NAT traversal
-(STUN/TURN), performance tuning (connection pooling, fragment caching, SQLite
-WAL), security audits, institutional node onboarding, OS packaging</li>
-<li><strong>Phase 5: Exploration and Culture</strong> — public tessera browser by
-era/location/theme/language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)</li>
-</ul>
-<p>With Shamir's Secret Sharing, Tesseras closes the last critical gap in long-term
-preservation. Your memories survive infrastructure failures through erasure
-coding. Your privacy survives quantum computers through hybrid encryption. And
-now, your identity survives you — passed on to the people you chose, requiring
-their cooperation to unlock what you left behind.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/phase4-shamir-heir-recovery/index.html.gz b/news/phase4-shamir-heir-recovery/index.html.gz
deleted file mode 100644
index f4b1598..0000000
--- a/news/phase4-shamir-heir-recovery/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/phase4-storage-deduplication/index.html b/news/phase4-storage-deduplication/index.html
deleted file mode 100644
index d499b4a..0000000
--- a/news/phase4-storage-deduplication/index.html
+++ /dev/null
@@ -1,217 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Phase 4: Storage Deduplication — Tesseras</title>
- <meta name="description" content="A new content-addressable storage layer eliminates duplicate data across tesseras, reducing disk usage and enabling automatic garbage collection.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Phase 4: Storage Deduplication">
- <meta property="og:description" content="A new content-addressable storage layer eliminates duplicate data across tesseras, reducing disk usage and enabling automatic garbage collection.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Phase 4: Storage Deduplication">
- <meta name="twitter:description" content="A new content-addressable storage layer eliminates duplicate data across tesseras, reducing disk usage and enabling automatic garbage collection.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;phase4-storage-deduplication&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Phase 4: Storage Deduplication</h2>
- <p class="news-date">2026-02-15</p>
- <p>When multiple tesseras share the same photo, the same audio clip, or the same
-fragment data, the old storage layer kept separate copies of each. On a node
-storing thousands of tesseras for the network, this duplication adds up fast.
-Phase 4 continues with storage deduplication: a content-addressable store (CAS)
-that ensures every unique piece of data is stored exactly once on disk,
-regardless of how many tesseras reference it.</p>
-<p>The design is simple and proven: hash the content with BLAKE3, use the hash as
-the filename, and maintain a reference count in SQLite. When two tesseras
-include the same 5 MB photo, one file exists on disk with a refcount of 2. When
-one tessera is deleted, the refcount drops to 1 and the file stays. When the
-last reference is released, a periodic sweep cleans up the orphan.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong>CAS schema migration</strong> (<code>tesseras-storage/migrations/004_dedup.sql</code>) — Three
-new tables:</p>
-<ul>
-<li><code>cas_objects</code> — tracks every object in the store: BLAKE3 hash (primary key),
-byte size, reference count, and creation timestamp</li>
-<li><code>blob_refs</code> — maps logical blob identifiers (tessera hash + memory hash +
-filename) to CAS hashes, replacing the old filesystem path convention</li>
-<li><code>fragment_refs</code> — maps logical fragment identifiers (tessera hash + fragment
-index) to CAS hashes, replacing the old <code>fragments/</code> directory layout</li>
-</ul>
-<p>Indexes on the hash columns ensure O(1) lookups during reads and reference
-counting.</p>
-<p><strong>CasStore</strong> (<code>tesseras-storage/src/cas.rs</code>) — The core content-addressable
-storage engine. Files are stored under a two-level prefix directory:
-<code>&lt;root&gt;/&lt;2-char-hex-prefix&gt;/&lt;full-hash&gt;.blob</code>. The store provides five
-operations:</p>
-<ul>
-<li><code>put(hash, data)</code> — writes data to disk if not already present, increments
-refcount. Returns whether a dedup hit occurred.</li>
-<li><code>get(hash)</code> — reads data from disk by hash</li>
-<li><code>release(hash)</code> — decrements refcount. If it reaches zero, the on-disk file is
-deleted immediately.</li>
-<li><code>contains(hash)</code> — checks existence without reading</li>
-<li><code>ref_count(hash)</code> — returns the current reference count</li>
-</ul>
-<p>All operations are atomic within a single SQLite transaction. The refcount is
-the source of truth — if the refcount says the object exists, the file must be
-on disk.</p>
-<p><strong>CAS-backed FsBlobStore</strong> (<code>tesseras-storage/src/blob.rs</code>) — Rewritten to
-delegate all storage to the CAS. When a blob is written, its BLAKE3 hash is
-computed and passed to <code>cas.put()</code>. A row in <code>blob_refs</code> maps the logical path
-(tessera + memory + filename) to the CAS hash. Reads look up the CAS hash via
-<code>blob_refs</code> and fetch from <code>cas.get()</code>. Deleting a tessera releases all its blob
-references in a single transaction.</p>
-<p><strong>CAS-backed FsFragmentStore</strong> (<code>tesseras-storage/src/fragment.rs</code>) — Same
-pattern for erasure-coded fragments. Each fragment's BLAKE3 checksum is already
-computed during Reed-Solomon encoding, so it's used directly as the CAS key.
-Fragment verification now checks the CAS hash instead of recomputing from
-scratch — if the CAS says the data is intact, it is.</p>
-<p><strong>Sweep garbage collector</strong> (<code>cas.rs:sweep()</code>) — A periodic GC pass that handles
-three edge cases the normal refcount path can't:</p>
-<ol>
-<li><strong>Orphan files</strong> — files on disk with no corresponding row in <code>cas_objects</code>.
-Can happen after a crash mid-write. Files younger than 1 hour are skipped
-(grace period for in-flight writes); older orphans are deleted.</li>
-<li><strong>Leaked refcounts</strong> — rows in <code>cas_objects</code> with refcount zero that weren't
-cleaned up (e.g., if the process died between decrementing and deleting).
-These rows are removed.</li>
-<li><strong>Idempotent</strong> — running sweep twice produces the same result.</li>
-</ol>
-<p>The sweep is wired into the existing repair loop in <code>tesseras-replication</code>, so
-it runs automatically every 24 hours alongside fragment health checks.</p>
-<p><strong>Migration from old layout</strong> (<code>tesseras-storage/src/migration.rs</code>) — A
-copy-first migration strategy that moves data from the old directory-based
-layout (<code>blobs/&lt;tessera&gt;/&lt;memory&gt;/&lt;file&gt;</code> and
-<code>fragments/&lt;tessera&gt;/&lt;index&gt;.shard</code>) into the CAS. The migration:</p>
-<ol>
-<li>Checks the storage version in <code>storage_meta</code> (version 1 = old layout, version
-2 = CAS)</li>
-<li>Walks the old <code>blobs/</code> and <code>fragments/</code> directories</li>
-<li>Computes BLAKE3 hashes and inserts into CAS via <code>put()</code> — duplicates are
-automatically deduplicated</li>
-<li>Creates corresponding <code>blob_refs</code> / <code>fragment_refs</code> entries</li>
-<li>Removes old directories only after all data is safely in CAS</li>
-<li>Updates the storage version to 2</li>
-</ol>
-<p>The migration runs on daemon startup, is idempotent (safe to re-run), and
-reports statistics: files migrated, duplicates found, bytes saved.</p>
-<p><strong>Prometheus metrics</strong> (<code>tesseras-storage/src/metrics.rs</code>) — Ten new metrics for
-observability:</p>
-<table><thead><tr><th>Metric</th><th>Description</th></tr></thead><tbody>
-<tr><td><code>cas_objects_total</code></td><td>Total unique objects in the CAS</td></tr>
-<tr><td><code>cas_bytes_total</code></td><td>Total bytes stored</td></tr>
-<tr><td><code>cas_dedup_hits_total</code></td><td>Number of writes that found an existing object</td></tr>
-<tr><td><code>cas_bytes_saved_total</code></td><td>Bytes saved by deduplication</td></tr>
-<tr><td><code>cas_gc_refcount_deletions_total</code></td><td>Objects deleted when refcount reached zero</td></tr>
-<tr><td><code>cas_gc_sweep_orphans_cleaned_total</code></td><td>Orphan files removed by sweep</td></tr>
-<tr><td><code>cas_gc_sweep_leaked_refs_cleaned_total</code></td><td>Leaked refcount rows cleaned</td></tr>
-<tr><td><code>cas_gc_sweep_skipped_young_total</code></td><td>Young orphans skipped (grace period)</td></tr>
-<tr><td><code>cas_gc_sweep_duration_seconds</code></td><td>Time spent in sweep GC</td></tr>
-</tbody></table>
-<p><strong>Property-based tests</strong> — Two proptest tests verify CAS invariants under random
-inputs:</p>
-<ul>
-<li><code>refcount_matches_actual_refs</code> — after N random put/release operations, the
-refcount always matches the actual number of outstanding references</li>
-<li><code>cas_path_is_deterministic</code> — the same hash always produces the same
-filesystem path</li>
-</ul>
-<p><strong>Integration test updates</strong> — All integration tests across <code>tesseras-core</code>,
-<code>tesseras-replication</code>, <code>tesseras-embedded</code>, and <code>tesseras-cli</code> updated for the
-new CAS-backed constructors. Tamper-detection tests updated to work with the CAS
-directory layout.</p>
-<p>347 tests pass across the workspace. Clippy clean with <code>-D warnings</code>.</p>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>BLAKE3 as CAS key</strong>: the content hash we already compute for integrity
-verification doubles as the deduplication key. No additional hashing step —
-the hash computed during <code>create</code> or <code>replicate</code> is reused as the CAS address.</li>
-<li><strong>SQLite refcount over filesystem reflinks</strong>: we considered using
-filesystem-level copy-on-write (reflinks on btrfs/XFS), but that would tie
-Tesseras to specific filesystems. SQLite refcounting works on any filesystem,
-including FAT32 on cheap USB drives and ext4 on Raspberry Pis.</li>
-<li><strong>Two-level hex prefix directories</strong>: storing all CAS objects in a flat
-directory would slow down filesystems with millions of entries. The
-<code>&lt;2-char prefix&gt;/</code> split limits any single directory to ~65k entries before a
-second prefix level is needed. This matches the approach used by Git's object
-store.</li>
-<li><strong>Grace period for orphan files</strong>: the sweep GC skips files younger than 1
-hour to avoid deleting objects that are being written by a concurrent
-operation. This is a pragmatic choice — it trades a small window of potential
-orphans for crash safety without requiring fsync or two-phase commit.</li>
-<li><strong>Copy-first migration</strong>: the migration copies data to CAS before removing old
-directories. If the process is interrupted, the old data is still intact and
-migration can be re-run. This is slower than moving files but guarantees no
-data loss.</li>
-<li><strong>Sweep in repair loop</strong>: rather than adding a separate GC timer, the CAS
-sweep piggybacks on the existing 24-hour repair loop. This keeps the daemon
-simple — one background maintenance cycle handles both fragment health and
-storage cleanup.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<ul>
-<li><strong>Phase 4 continued</strong> — security audits, OS packaging (Alpine, Arch, Debian,
-OpenBSD, FreeBSD)</li>
-<li><strong>Phase 5: Exploration and Culture</strong> — public tessera browser by
-era/location/theme/language, institutional curation, genealogy integration
-(FamilySearch, Ancestry), physical media export (M-DISC, microfilm, acid-free
-paper with QR), AI-assisted context</li>
-</ul>
-<p>Storage deduplication completes the storage efficiency story for Tesseras. A
-node that stores fragments for thousands of users — common for institutional
-nodes and always-on full nodes — now pays the disk cost of unique data only.
-Combined with Reed-Solomon erasure coding (which already minimizes redundancy at
-the network level), the system achieves efficient storage at both the local and
-distributed layers.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/phase4-storage-deduplication/index.html.gz b/news/phase4-storage-deduplication/index.html.gz
deleted file mode 100644
index 7df051e..0000000
--- a/news/phase4-storage-deduplication/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/phase4-wasm-browser-verification/index.html b/news/phase4-wasm-browser-verification/index.html
deleted file mode 100644
index 571e094..0000000
--- a/news/phase4-wasm-browser-verification/index.html
+++ /dev/null
@@ -1,192 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Phase 4: Verify Without Installing Anything — Tesseras</title>
- <meta name="description" content="Tesseras now compiles to WebAssembly — anyone can verify a tessera&#x27;s integrity and authenticity directly in the browser, with no software to install.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Phase 4: Verify Without Installing Anything">
- <meta property="og:description" content="Tesseras now compiles to WebAssembly — anyone can verify a tessera&#x27;s integrity and authenticity directly in the browser, with no software to install.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Phase 4: Verify Without Installing Anything">
- <meta name="twitter:description" content="Tesseras now compiles to WebAssembly — anyone can verify a tessera&#x27;s integrity and authenticity directly in the browser, with no software to install.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;phase4-wasm-browser-verification&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Phase 4: Verify Without Installing Anything</h2>
- <p class="news-date">2026-02-15</p>
- <p>Trust shouldn't require installing software. If someone sends you a tessera — a
-bundle of preserved memories — you should be able to verify it's genuine and
-unmodified without downloading an app, creating an account, or trusting a
-server. That's what <code>tesseras-wasm</code> delivers: drag a tessera archive into a web
-page, and cryptographic verification happens entirely in your browser.</p>
-<h2 id="what-was-built">What was built</h2>
-<p><strong>tesseras-wasm</strong> — A Rust crate that compiles to WebAssembly via wasm-pack,
-exposing four stateless functions to JavaScript. The crate depends on
-<code>tesseras-core</code> for manifest parsing and calls cryptographic primitives directly
-(blake3, ed25519-dalek) rather than depending on <code>tesseras-crypto</code>, which pulls
-in C-based post-quantum libraries that don't compile to
-<code>wasm32-unknown-unknown</code>.</p>
-<p><code>parse_manifest</code> takes raw MANIFEST bytes (UTF-8 plain text, not MessagePack),
-delegates to <code>tesseras_core::manifest::Manifest::parse()</code>, and returns a JSON
-string with the creator's Ed25519 public key, signature file paths, and a list
-of files with their expected BLAKE3 hashes, sizes, and MIME types. Internal
-structs (<code>ManifestJson</code>, <code>CreatorPubkey</code>, <code>SignatureFiles</code>, <code>FileEntry</code>) are
-serialized with serde_json. The ML-DSA public key and signature file fields are
-present in the JSON contract but set to <code>null</code> — ready for when post-quantum
-signing is implemented on the native side.</p>
-<p><code>hash_blake3</code> computes a BLAKE3 hash of arbitrary bytes and returns a
-64-character hex string. It's called once per file in the tessera to verify
-integrity against the MANIFEST.</p>
-<p><code>verify_ed25519</code> takes a message, a 64-byte signature, and a 32-byte public key,
-constructs an <code>ed25519_dalek::VerifyingKey</code>, and returns whether the signature
-is valid. Length validation returns descriptive errors ("Ed25519 public key must
-be 32 bytes") rather than panicking.</p>
-<p><code>verify_ml_dsa</code> is a stub that returns an error explaining ML-DSA verification
-is not yet available. This is deliberate: the <code>ml-dsa</code> crate on crates.io is
-v0.1.0-rc.7 (pre-release), and <code>tesseras-crypto</code> uses <code>pqcrypto-dilithium</code>
-(C-based CRYSTALS-Dilithium) which is byte-incompatible with FIPS 204 ML-DSA.
-Both sides need to use the same pure Rust implementation before
-cross-verification works. Ed25519 verification is sufficient — every tessera is
-Ed25519-signed.</p>
-<p>All four functions use a two-layer pattern for testability: inner functions
-return <code>Result&lt;T, String&gt;</code> and are tested natively, while thin <code>#[wasm_bindgen]</code>
-wrappers convert errors to <code>JsError</code>. This avoids <code>JsError::new()</code> panicking on
-non-WASM targets during testing.</p>
-<p>The compiled WASM binary is 109 KB raw and 44 KB gzipped — well under the 200 KB
-budget. wasm-opt applies <code>-Oz</code> optimization after wasm-pack builds with
-<code>opt-level = "z"</code>, LTO, and single codegen unit.</p>
-<p><strong>@tesseras/verify</strong> — A TypeScript npm package (<code>crates/tesseras-wasm/js/</code>)
-that orchestrates browser-side verification. The public API is a single
-function:</p>
-<pre><code data-lang="typescript">async function verifyTessera(
- archive: Uint8Array,
- onProgress?: (current: number, total: number, file: string) =&gt; void
-): Promise&lt;VerificationResult&gt;
-</code></pre>
-<p>The <code>VerificationResult</code> type provides everything a UI needs: overall validity,
-tessera hash, creator public keys, signature status (valid/invalid/missing for
-both Ed25519 and ML-DSA), per-file integrity results with expected and actual
-hashes, a list of unexpected files not in the MANIFEST, and an errors array.</p>
-<p>Archive unpacking (<code>unpack.ts</code>) handles three formats: gzip-compressed tar
-(detected by <code>\x1f\x8b</code> magic bytes, decompressed with fflate then parsed as
-tar), ZIP (<code>PK\x03\x04</code> magic, unpacked with fflate's <code>unzipSync</code>), and raw tar
-(<code>ustar</code> at offset 257). A <code>normalizePath</code> function strips the leading
-<code>tessera-&lt;hash&gt;/</code> prefix so internal paths match MANIFEST entries.</p>
-<p>Verification runs in a Web Worker (<code>worker.ts</code>) to keep the UI thread
-responsive. The worker initializes the WASM module, unpacks the archive, parses
-the MANIFEST, verifies the Ed25519 signature against the creator's public key,
-then hashes each file with BLAKE3 and compares against expected values. Progress
-messages stream back to the main thread after each file. If any signature is
-invalid, verification stops early without hashing files — failing fast on the
-most critical check.</p>
-<p>The archive is transferred to the worker with zero-copy
-(<code>worker.postMessage({ type: "verify", archive }, [archive.buffer])</code>) to avoid
-duplicating potentially large tessera files in memory.</p>
-<p><strong>Build pipeline</strong> — Three new justfile targets: <code>wasm-build</code> runs wasm-pack
-with <code>--target web --release</code> and optimizes with wasm-opt; <code>wasm-size</code> reports
-raw and gzipped binary size; <code>test-wasm</code> runs the native test suite.</p>
-<p><strong>Tests</strong> — 9 native unit tests cover BLAKE3 hashing (empty input, known value),
-Ed25519 verification (valid signature, invalid signature, wrong key, bad key
-length), and MANIFEST parsing (valid manifest, invalid UTF-8, garbage input). 3
-WASM integration tests run in headless Chrome via
-<code>wasm-pack test --headless --chrome</code>, verifying that <code>hash_blake3</code>,
-<code>verify_ed25519</code>, and <code>parse_manifest</code> work correctly when compiled to
-<code>wasm32-unknown-unknown</code>.</p>
-<h2 id="architecture-decisions">Architecture decisions</h2>
-<ul>
-<li><strong>No tesseras-crypto dependency</strong>: the WASM crate calls blake3 and
-ed25519-dalek directly. <code>tesseras-crypto</code> depends on <code>pqcrypto-kyber</code> (C-based
-ML-KEM via pqcrypto-traits) which requires a C compiler toolchain and doesn't
-target wasm32. By depending only on pure Rust crates, the WASM build has zero
-C dependencies and compiles cleanly to WebAssembly.</li>
-<li><strong>ML-DSA deferred, not faked</strong>: rather than silently skipping post-quantum
-verification, the stub returns an explicit error. This ensures that if a
-tessera contains an ML-DSA signature, the verification result will report
-<code>ml_dsa: "missing"</code> rather than pretending it was checked. The JS orchestrator
-handles this gracefully — a tessera is valid if Ed25519 passes and ML-DSA is
-missing (not yet implemented on either side).</li>
-<li><strong>Inner function pattern</strong>: <code>JsError</code> cannot be constructed on non-WASM
-targets (it panics). Splitting each function into
-<code>foo_inner() -&gt; Result&lt;T, String&gt;</code> and <code>foo() -&gt; Result&lt;T, JsError&gt;</code> lets the
-native test suite exercise all logic without touching JavaScript types. The
-WASM integration tests in headless Chrome test the full <code>#[wasm_bindgen]</code>
-surface.</li>
-<li><strong>Web Worker isolation</strong>: cryptographic operations (especially BLAKE3 over
-large media files) can take hundreds of milliseconds. Running in a Worker
-prevents UI jank. The streaming progress protocol
-(<code>{ type: "progress", current, total, file }</code>) lets the UI show a progress bar
-during verification of tesseras with many files.</li>
-<li><strong>Zero-copy transfer</strong>: <code>archive.buffer</code> is transferred to the Worker, not
-copied. For a 50 MB tessera archive, this avoids doubling memory usage during
-verification.</li>
-<li><strong>Plain text MANIFEST, not MessagePack</strong>: the WASM crate parses the same
-plain-text MANIFEST format as the CLI. This is by design — the MANIFEST is the
-tessera's Rosetta Stone, readable by anyone with a text editor. The
-<code>rmp-serde</code> dependency in the Cargo.toml is not used and will be removed.</li>
-</ul>
-<h2 id="what-comes-next">What comes next</h2>
-<ul>
-<li><strong>Phase 4: Resilience and Scale</strong> — OS packaging (Alpine, Arch, Debian,
-FreeBSD, OpenBSD), CI on SourceHut and GitHub Actions, security audits,
-browser-based tessera explorer at tesseras.net using @tesseras/verify</li>
-<li><strong>Phase 5: Exploration and Culture</strong> — Public tessera browser by
-era/location/theme/language, institutional curation, genealogy integration,
-physical media export (M-DISC, microfilm, acid-free paper with QR)</li>
-</ul>
-<p>Verification no longer requires trust in software. A tessera archive dropped
-into a browser is verified with the same cryptographic rigor as the CLI — same
-BLAKE3 hashes, same Ed25519 signatures, same MANIFEST parser. The difference is
-that now anyone can do it.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/phase4-wasm-browser-verification/index.html.gz b/news/phase4-wasm-browser-verification/index.html.gz
deleted file mode 100644
index 41c46ac..0000000
--- a/news/phase4-wasm-browser-verification/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/news/reed-solomon/index.html b/news/reed-solomon/index.html
deleted file mode 100644
index e47a9f2..0000000
--- a/news/reed-solomon/index.html
+++ /dev/null
@@ -1,200 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Reed-Solomon: How Tesseras Survives Data Loss — Tesseras</title>
- <meta name="description" content="A deep dive into Reed-Solomon erasure coding — what it is, why Tesseras uses it, and the challenges of keeping memories alive across centuries.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Reed-Solomon: How Tesseras Survives Data Loss">
- <meta property="og:description" content="A deep dive into Reed-Solomon erasure coding — what it is, why Tesseras uses it, and the challenges of keeping memories alive across centuries.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Reed-Solomon: How Tesseras Survives Data Loss">
- <meta name="twitter:description" content="A deep dive into Reed-Solomon erasure coding — what it is, why Tesseras uses it, and the challenges of keeping memories alive across centuries.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;news&#x2F;reed-solomon&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Reed-Solomon: How Tesseras Survives Data Loss</h2>
- <p class="news-date">2026-02-14</p>
- <p>Your hard drive will die. Your cloud provider will pivot. The RAID array in your
-closet will outlive its controller but not its owner. If a memory is stored in
-exactly one place, it has exactly one way to be lost forever.</p>
-<p>Tesseras is a network that keeps human memories alive through mutual aid. The
-core survival mechanism is <strong>Reed-Solomon erasure coding</strong> — a technique
-borrowed from deep-space communication that lets us reconstruct data even when
-pieces go missing.</p>
-<h2 id="what-is-reed-solomon">What is Reed-Solomon?</h2>
-<p>Reed-Solomon is a family of error-correcting codes invented by Irving Reed and
-Gustave Solomon in 1960. The original use case was correcting errors in data
-transmitted over noisy channels — think Voyager sending photos from Jupiter, or
-a CD playing despite scratches.</p>
-<p>The key insight: if you add carefully computed redundancy to your data <em>before</em>
-something goes wrong, you can recover the original even after losing some
-pieces.</p>
-<p>Here's the intuition. Suppose you have a polynomial of degree 2 — a parabola.
-You need 3 points to define it uniquely. But if you evaluate it at 5 points, you
-can lose any 2 of those 5 and still reconstruct the polynomial from the
-remaining 3. Reed-Solomon generalizes this idea to work over finite fields
-(Galois fields), where the "polynomial" is your data and the "evaluation points"
-are your fragments.</p>
-<p>In concrete terms:</p>
-<ol>
-<li><strong>Split</strong> your data into <em>k</em> data shards</li>
-<li><strong>Compute</strong> <em>m</em> parity shards from the data shards</li>
-<li><strong>Distribute</strong> all <em>k + m</em> shards across different locations</li>
-<li><strong>Reconstruct</strong> the original data from any <em>k</em> of the <em>k + m</em> shards</li>
-</ol>
-<p>You can lose up to <em>m</em> shards — any <em>m</em>, data or parity, in any combination —
-and still recover everything.</p>
-<h2 id="why-not-just-make-copies">Why not just make copies?</h2>
-<p>The naive approach to redundancy is replication: make 3 copies, store them in 3
-places. This gives you tolerance for 2 failures at the cost of 3x your storage.</p>
-<p>Reed-Solomon is dramatically more efficient:</p>
-<table><thead><tr><th>Strategy</th><th style="text-align: right">Storage overhead</th><th style="text-align: right">Failures tolerated</th></tr></thead><tbody>
-<tr><td>3x replication</td><td style="text-align: right">200%</td><td style="text-align: right">2 out of 3</td></tr>
-<tr><td>Reed-Solomon (16,8)</td><td style="text-align: right">50%</td><td style="text-align: right">8 out of 24</td></tr>
-<tr><td>Reed-Solomon (48,24)</td><td style="text-align: right">50%</td><td style="text-align: right">24 out of 72</td></tr>
-</tbody></table>
-<p>With 16 data shards and 8 parity shards, you use 50% extra storage but can
-survive losing a third of all fragments. To achieve the same fault tolerance
-with replication alone, you'd need 3x the storage.</p>
-<p>For a network that aims to preserve memories across decades and centuries, this
-efficiency isn't a nice-to-have — it's the difference between a viable system
-and one that drowns in its own overhead.</p>
-<h2 id="how-tesseras-uses-reed-solomon">How Tesseras uses Reed-Solomon</h2>
-<p>Not all data deserves the same treatment. A 500-byte text memory and a 100 MB
-video have very different redundancy needs. Tesseras uses a three-tier
-fragmentation strategy:</p>
-<p><strong>Small (&lt; 4 MB)</strong> — Whole-file replication to 7 peers. For small tesseras, the
-overhead of erasure coding (encoding time, fragment management, reconstruction
-logic) outweighs its benefits. Simple copies are faster and simpler.</p>
-<p><strong>Medium (4–256 MB)</strong> — 16 data shards + 8 parity shards = 24 total fragments.
-Each fragment is roughly 1/16th of the original size. Any 16 of the 24 fragments
-reconstruct the original. Distributed across 7 peers.</p>
-<p><strong>Large (≥ 256 MB)</strong> — 48 data shards + 24 parity shards = 72 total fragments.
-Higher shard count means smaller individual fragments (easier to transfer and
-store) and higher absolute fault tolerance. Also distributed across 7 peers.</p>
-<p>The implementation uses the <code>reed-solomon-erasure</code> crate operating over GF(2⁸) —
-the same Galois field used in QR codes and CDs. Each fragment carries a BLAKE3
-checksum so corruption is detected immediately, not silently propagated.</p>
-<pre><code>Tessera (120 MB photo album)
- ↓ encode
-16 data shards (7.5 MB each) + 8 parity shards (7.5 MB each)
- ↓ distribute
-24 fragments across 7 peers (subnet-diverse)
- ↓ any 16 fragments
-Original tessera recovered
-</code></pre>
-<h2 id="the-challenges">The challenges</h2>
-<p>Reed-Solomon solves the mathematical problem of redundancy. The engineering
-challenges are everything around it.</p>
-<h3 id="fragment-tracking">Fragment tracking</h3>
-<p>Every fragment needs to be findable. Tesseras uses a Kademlia DHT for peer
-discovery and fragment-to-peer mapping. When a node goes offline, its fragments
-need to be re-created and distributed to new peers. This means tracking which
-fragments exist, where they are, and whether they're still intact — across a
-network with no central authority.</p>
-<h3 id="silent-corruption">Silent corruption</h3>
-<p>A fragment that returns wrong data is worse than one that's missing — at least a
-missing fragment is honestly absent. Tesseras addresses this with
-attestation-based health checks: the repair loop periodically asks fragment
-holders to prove possession by returning BLAKE3 checksums. If a checksum doesn't
-match, the fragment is treated as lost.</p>
-<h3 id="correlated-failures">Correlated failures</h3>
-<p>If all 24 fragments of a tessera land on machines in the same datacenter, a
-single power outage kills them all. Reed-Solomon's math assumes independent
-failures. Tesseras enforces <strong>subnet diversity</strong> during distribution: no more
-than 2 fragments per /24 IPv4 subnet (or /48 IPv6 prefix). This spreads
-fragments across different physical infrastructure.</p>
-<h3 id="repair-speed-vs-network-load">Repair speed vs. network load</h3>
-<p>When a peer goes offline, the clock starts ticking. Lost fragments need to be
-re-created before more failures accumulate. But aggressive repair floods the
-network. Tesseras balances this with a configurable repair loop (default: every
-24 hours with 2-hour jitter) and concurrent transfer limits (default: 4
-simultaneous transfers). The jitter prevents repair storms where every node
-checks its fragments at the same moment.</p>
-<h3 id="long-term-key-management">Long-term key management</h3>
-<p>Reed-Solomon protects against data loss, not against losing access. If a tessera
-is encrypted (private or sealed visibility), you need the decryption key to make
-the recovered data useful. Tesseras separates these concerns: erasure coding
-handles availability, while Shamir's Secret Sharing (a future phase) will handle
-key distribution among heirs. The project's design philosophy — encrypt as
-little as possible — keeps the key management problem small.</p>
-<h3 id="galois-field-limitations">Galois field limitations</h3>
-<p>The GF(2⁸) field limits the total number of shards to 255 (data + parity
-combined). For Tesseras, this is not a practical constraint — even the Large
-tier uses only 72 shards. But it does mean that extremely large files with
-thousands of fragments would require either a different field or a layered
-encoding scheme.</p>
-<h3 id="evolving-codec-compatibility">Evolving codec compatibility</h3>
-<p>A tessera encoded today must be decodable in 50 years. Reed-Solomon over GF(2⁸)
-is one of the most widely implemented algorithms in computing — it's in every CD
-player, every QR code scanner, every deep-space probe. This ubiquity is itself a
-survival strategy. The algorithm won't be forgotten because half the world's
-infrastructure depends on it.</p>
-<h2 id="the-bigger-picture">The bigger picture</h2>
-<p>Reed-Solomon is a piece of a larger puzzle. It works in concert with:</p>
-<ul>
-<li><strong>Kademlia DHT</strong> for finding peers and routing fragments</li>
-<li><strong>BLAKE3 checksums</strong> for integrity verification</li>
-<li><strong>Bilateral reciprocity</strong> for fair storage exchange (no blockchain needed)</li>
-<li><strong>Subnet diversity</strong> for failure independence</li>
-<li><strong>Automatic repair</strong> for maintaining redundancy over time</li>
-</ul>
-<p>No single technique makes memories survive. Reed-Solomon ensures that data <em>can</em>
-be recovered. The DHT ensures fragments <em>can be found</em>. Reciprocity ensures
-peers <em>want to help</em>. Repair ensures none of this degrades over time.</p>
-<p>A tessera is a bet that the sum of these mechanisms, running across many
-independent machines operated by many independent people, is more durable than
-any single institution. Reed-Solomon is the mathematical foundation of that bet.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/news/reed-solomon/index.html.gz b/news/reed-solomon/index.html.gz
deleted file mode 100644
index 3e76a2e..0000000
--- a/news/reed-solomon/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/og-image.png b/og-image.png
deleted file mode 100644
index 1447739..0000000
--- a/og-image.png
+++ /dev/null
Binary files differ
diff --git a/pt-br/about/index.html b/pt-br/about/index.html
deleted file mode 100644
index b9b425b..0000000
--- a/pt-br/about/index.html
+++ /dev/null
@@ -1,192 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Sobre — Tesseras</title>
- <meta name="description" content="Tesseras é uma rede peer-to-peer para preservar memórias humanas através dos milênios — porque sua história merece sobreviver a qualquer plataforma.">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="Sobre">
- <meta property="og:description" content="Tesseras é uma rede peer-to-peer para preservar memórias humanas através dos milênios — porque sua história merece sobreviver a qualquer plataforma.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Sobre">
- <meta name="twitter:description" content="Tesseras é uma rede peer-to-peer para preservar memórias humanas através dos milênios — porque sua história merece sobreviver a qualquer plataforma.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;about&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Sobre</h2>
- <p>Neste exato momento, em algum lugar, o álbum de fotos de uma avó está se
-desfazendo em um porão inundado. As cartas de um soldado para casa existem
-apenas em um serviço de e-mail que foi descontinuado. As primeiras palavras de
-uma criança, gravadas em um celular, vão desaparecer quando a assinatura da
-nuvem vencer.</p>
-<p>Somos a primeira geração na história que produz mais memórias do que qualquer
-civilização antes de nós — e as perde mais rápido do que qualquer civilização
-antes de nós.</p>
-<h2 id="o-problema-de-que-ninguem-fala">O Problema de Que Ninguém Fala</h2>
-<p>Toda plataforma em que você confia suas memórias é temporária. Toda empresa que
-promete "para sempre" está a um relatório trimestral de distância de mudar de
-direção, ser vendida ou fechar as portas. Todo formato proprietário é um relógio
-fazendo contagem regressiva.</p>
-<ul>
-<li><strong>Google Fotos, iCloud, OneDrive</strong> — suas memórias vivem no servidor de outra
-pessoa, sob os termos de serviço de outra pessoa, atrás do paywall de outra
-pessoa</li>
-<li><strong>Redes sociais</strong> — a história da sua vida está espalhada por plataformas que
-tratam suas memórias como inventário de publicidade</li>
-<li><strong>HDs e pendrives</strong> — falham silenciosamente, sem aviso e sem backup</li>
-<li><strong>DVDs e CDs</strong> — já são ilegíveis para a maioria das pessoas</li>
-</ul>
-<p>O padrão é sempre o mesmo: um formato se torna popular, uma empresa facilita o
-uso, as pessoas despejam suas vidas nele, e então ele desaparece. GeoCities.
-Vine. MySpace. Google+. Orkut. A lista cresce a cada ano.</p>
-<p>Isso não é um problema de tecnologia. É um problema de design. Continuamos
-construindo sistemas onde a preservação de memórias é um efeito colateral do
-modelo de negócios de alguém, não o propósito.</p>
-<h2 id="o-que-tesseras-faz-de-diferente">O Que Tesseras Faz de Diferente</h2>
-<p>Tesseras parte de uma premissa radical: <strong>suas memórias pertencem a você, e elas
-devem sobreviver a toda empresa, plataforma e formato que existe hoje.</strong></p>
-<p>Uma tessera é uma cápsula do tempo autocontida — fotos, áudio, vídeo e texto —
-empacotada em um formato projetado para ser compreendido séculos no futuro, sem
-nenhum software especial.</p>
-<h3 id="sem-servidores-sem-assinaturas-sem-empresa">Sem Servidores. Sem Assinaturas. Sem Empresa.</h3>
-<p>Tesseras é uma rede peer-to-peer construída sobre ajuda mútua. Você armazena
-fragmentos das memórias de outras pessoas, e elas armazenam as suas. Sem tokens,
-sem blockchain, sem mensalidades. O incentivo é simples e humano: eu ajudo a
-preservar a sua história, você ajuda a preservar a minha.</p>
-<h3 id="sobrevive-a-tudo">Sobrevive a Tudo</h3>
-<p>Sua tessera é protegida por codificação por apagamento — a mesma matemática que
-mantém sondas espaciais se comunicando com a Terra. Seus dados são divididos em
-fragmentos redundantes e distribuídos pela rede. Nós podem ficar offline, discos
-rígidos podem falhar, regiões inteiras podem perder conectividade — e suas
-memórias sobrevivem.</p>
-<h3 id="formato-autodescritivo">Formato Autodescritivo</h3>
-<p>Cada tessera carrega dentro de si as instruções para ser decodificada. Em texto
-simples. Em múltiplos idiomas. Mesmo que todas as cópias do software Tesseras
-desaparecessem amanhã, qualquer pessoa com um entendimento básico de computação
-poderia ler sua tessera. É um formato de arquivo projetado para arqueólogos, não
-apenas para programadores.</p>
-<h3 id="criptografia-pos-quantica">Criptografia Pós-Quântica</h3>
-<p>Tesseras usa assinaturas duplas — Ed25519 clássico e ML-DSA pós-quântico — para
-que a autenticidade das suas memórias possa ser verificada mesmo depois que
-computadores quânticos tornarem a criptografia de hoje obsoleta. Protegemos o
-futuro, hoje.</p>
-<h3 id="construido-para-o-longo-prazo">Construído para o Longo Prazo</h3>
-<p>Cada decisão no Tesseras é tomada pensando em séculos:</p>
-<ul>
-<li><strong>Formatos de mídia mais simples</strong> — JPEG para fotos, WAV para áudio, WebM
-para vídeo, texto simples para escrita. Não porque são os melhores, mas porque
-serão legíveis por mais tempo.</li>
-<li><strong>Sem criptografia por padrão</strong> — disponibilidade acima do sigilo. Uma memória
-que não pode ser descriptografada é uma memória perdida. Memórias privadas
-podem ser criptografadas, mas o padrão é a sobrevivência.</li>
-<li><strong>Sem dependência da internet</strong> — tesseras podem ser armazenadas em pendrives,
-mídias ópticas, Raspberry Pis em uma prateleira, até dispositivos IoT de baixo
-consumo. Qualquer cópia é uma cópia válida.</li>
-</ul>
-<h2 id="a-necessidade-humana">A Necessidade Humana</h2>
-<p>Seres humanos sempre preservaram memórias. Pinturas rupestres em Lascaux. Tábuas
-de argila na Mesopotâmia. Cartas dobradas dentro de livros. Álbuns de fotos
-passados de pai para filho.</p>
-<p>O desejo de ser lembrado — de deixar prova de que estivemos aqui, de que amamos,
-de que vivemos — está entre os impulsos humanos mais profundos. Toda cultura, em
-toda era, encontrou formas de inscrever sua existência em algo mais durável que
-uma única vida.</p>
-<p>A era digital prometeu tornar isso mais fácil. Em vez disso, tornou frágil.
-Trocamos durabilidade por conveniência, e o custo é medido em infâncias
-perdidas, rostos esquecidos e histórias que ninguém jamais ouvirá.</p>
-<p>Tesseras é uma tentativa de restaurar o contrato ancestral: <strong>o que você escolhe
-lembrar deve perdurar.</strong></p>
-<h2 id="por-que-tesseras">Por Que "Tesseras"?</h2>
-<p>Uma <em>tessera</em> (plural <em>tesserae</em>) é uma pequena peça de pedra, vidro ou cerâmica
-usada para compor um mosaico. A palavra vem do latim, emprestada do grego
-<em>τέσσερα</em> — os pequenos quadrados que, peça por peça, construíram os grandes
-mosaicos de Roma, Pompeia e Bizâncio.</p>
-<p>Alguns desses mosaicos permanecem intactos depois de dois mil anos.</p>
-<p>A metáfora é o projeto: cada tessera na nossa rede é um fragmento pequeno e
-autocontido — individualmente simples, individualmente durável. Mas juntas, elas
-compõem algo maior: um mosaico da memória humana, distribuído por milhares de
-nós, resiliente o bastante para sobreviver a qualquer ponto único de falha.</p>
-<p>Assim como as tesserae antigas não precisavam de manual para serem compreendidas
-— um fragmento de pedra colorida fala por si — cada tessera digital carrega
-dentro de si tudo o que é necessário para ser lida, em formatos simples, em
-linguagem simples.</p>
-<p>O nome também é um lembrete de escala. Um mosaico não se faz em um dia. É
-montado peça por peça, com paciência, por muitas mãos. É assim que pretendemos
-construir uma rede que dure.</p>
-<h2 id="codigo-aberto-protocolo-aberto-futuro-aberto">Código Aberto, Protocolo Aberto, Futuro Aberto</h2>
-<p>Tesseras é software livre sob a licença ISC. O protocolo é aberto. O formato é
-documentado. Qualquer pessoa pode rodar um nó, construir um cliente ou bifurcar
-o projeto inteiro.</p>
-<p>Não há capital de risco por trás do Tesseras. Nenhuma métrica de crescimento
-para atingir. Nenhuma estratégia de saída. Apenas uma convicção simples: a
-tecnologia para preservar a memória humana não deveria pertencer a ninguém.</p>
-<h2 id="status-atual">Status Atual</h2>
-<p>Tesseras está na Fase 4 — Resiliência e Escala. O formato base, as fundações
-criptográficas, a rede peer-to-peer, a replicação ativa com erasure coding, a
-API GraphQL e o app Flutter estão construídos. Estamos agora trabalhando em
-Shamir's Secret Sharing para recuperação de chaves por herdeiros, NAT traversal
-avançado e ajuste de performance.</p>
-<p>Este é um projeto de longo prazo. Medimos progresso em décadas, não em
-trimestres.</p>
-<h2 id="participe">Participe</h2>
-<p>Se você acredita que a memória humana merece ser preservada — não como um
-produto, não como um serviço, mas como um direito fundamental — adoraríamos sua
-ajuda.</p>
-<ul>
-<li>Leia o <a href="/pt-br/faq/">FAQ</a> para saber mais</li>
-<li>Entre nas <a href="/pt-br/subscriptions/">listas de discussão</a> para atualizações</li>
-<li>Navegue pelo <a rel="external" href="https://git.sr.ht/~ijanc/tesseras">código-fonte</a></li>
-<li><a href="/pt-br/contact/">Fale conosco</a> diretamente</li>
-</ul>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/about/index.html.gz b/pt-br/about/index.html.gz
deleted file mode 100644
index c89a5f4..0000000
--- a/pt-br/about/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/atom.xml b/pt-br/atom.xml
deleted file mode 100644
index bf61615..0000000
--- a/pt-br/atom.xml
+++ /dev/null
@@ -1,2101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-br">
- <title>Tesseras</title>
- <subtitle>Rede P2P para preservar memórias humanas através dos milênios</subtitle>
- <link rel="self" type="application/atom+xml" href="https://tesseras.net/pt-br/atom.xml"/>
- <link rel="alternate" type="text/html" href="https://tesseras.net"/>
- <generator uri="https://www.getzola.org/">Zola</generator>
- <updated>2026-02-16T10:00:00+00:00</updated>
- <id>https://tesseras.net/pt-br/atom.xml</id>
- <entry xml:lang="pt-br">
- <title>Empacotando o Tesseras para Debian</title>
- <published>2026-02-16T10:00:00+00:00</published>
- <updated>2026-02-16T10:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/packaging-debian/"/>
- <id>https://tesseras.net/pt-br/news/packaging-debian/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/packaging-debian/">&lt;p&gt;O Tesseras agora inclui um pacote &lt;code&gt;.deb&lt;&#x2F;code&gt; para Debian e Ubuntu. Este post explica
-como compilar e instalar o pacote a partir do código-fonte usando &lt;code&gt;cargo-deb&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;pre-requisitos&quot;&gt;Pré-requisitos&lt;&#x2F;h2&gt;
-&lt;p&gt;Você precisa de uma toolchain Rust funcional e das bibliotecas de sistema
-necessárias:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo apt install build-essential pkg-config libsqlite3-dev
-rustup toolchain install stable
-cargo install cargo-deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;compilando&quot;&gt;Compilando&lt;&#x2F;h2&gt;
-&lt;p&gt;Clone o repositório e execute a recipe &lt;code&gt;just deb&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git clone https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras
-cd tesseras
-just deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Essa recipe faz três coisas:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Compila&lt;&#x2F;strong&gt; &lt;code&gt;tesd&lt;&#x2F;code&gt; (o daemon) e &lt;code&gt;tes&lt;&#x2F;code&gt; (o CLI) em modo release com
-&lt;code&gt;cargo build --release&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Gera completions de shell&lt;&#x2F;strong&gt; para bash, zsh e fish a partir do binário &lt;code&gt;tes&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Empacota&lt;&#x2F;strong&gt; tudo em um arquivo &lt;code&gt;.deb&lt;&#x2F;code&gt; com
-&lt;code&gt;cargo deb -p tesseras-daemon --no-build&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;O resultado é um arquivo &lt;code&gt;.deb&lt;&#x2F;code&gt; em &lt;code&gt;target&#x2F;debian&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;instalando&quot;&gt;Instalando&lt;&#x2F;h2&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo dpkg -i target&#x2F;debian&#x2F;tesseras-daemon_*.deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Se houver dependências faltando, corrija com:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo apt install -f
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;configuracao-pos-instalacao&quot;&gt;Configuração pós-instalação&lt;&#x2F;h2&gt;
-&lt;p&gt;O script &lt;code&gt;postinst&lt;&#x2F;code&gt; cria automaticamente um usuário de sistema &lt;code&gt;tesseras&lt;&#x2F;code&gt; e o
-diretório de dados &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;. Para usar o CLI sem sudo, adicione seu
-usuário ao grupo:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo usermod -aG tesseras $USER
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Faça logout e login novamente, depois inicie o daemon:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo systemctl enable --now tesd
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;o-que-o-pacote-inclui&quot;&gt;O que o pacote inclui&lt;&#x2F;h2&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Caminho&lt;&#x2F;th&gt;&lt;th&gt;Descrição&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tesd&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Daemon do nó completo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tes&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Cliente CLI&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;etc&#x2F;tesseras&#x2F;config.toml&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Configuração padrão (marcado como conffile)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;lib&#x2F;systemd&#x2F;system&#x2F;tesd.service&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Unit systemd com hardening de segurança&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Completions de shell&lt;&#x2F;td&gt;&lt;td&gt;bash, zsh e fish&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;h2 id=&quot;como-o-cargo-deb-funciona&quot;&gt;Como o cargo-deb funciona&lt;&#x2F;h2&gt;
-&lt;p&gt;Os metadados de empacotamento ficam em &lt;code&gt;crates&#x2F;tesseras-daemon&#x2F;Cargo.toml&lt;&#x2F;code&gt; na
-seção &lt;code&gt;[package.metadata.deb]&lt;&#x2F;code&gt;. Essa seção define:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;depends&lt;&#x2F;strong&gt; — dependências em tempo de execução: &lt;code&gt;libc6&lt;&#x2F;code&gt; e &lt;code&gt;libsqlite3-0&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;assets&lt;&#x2F;strong&gt; — arquivos incluídos no pacote (binários, config, unit systemd,
-completions de shell)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;conf-files&lt;&#x2F;strong&gt; — arquivos tratados como configuração (preservados na
-atualização)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;maintainer-scripts&lt;&#x2F;strong&gt; — scripts &lt;code&gt;postinst&lt;&#x2F;code&gt; e &lt;code&gt;postrm&lt;&#x2F;code&gt; em
-&lt;code&gt;packaging&#x2F;debian&#x2F;scripts&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;systemd-units&lt;&#x2F;strong&gt; — integração automática com systemd&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;O script &lt;code&gt;postinst&lt;&#x2F;code&gt; cria o usuário de sistema &lt;code&gt;tesseras&lt;&#x2F;code&gt; e o diretório de dados
-na instalação. O script &lt;code&gt;postrm&lt;&#x2F;code&gt; remove o usuário, grupo e diretório de dados
-apenas no &lt;code&gt;purge&lt;&#x2F;code&gt; (não na remoção simples).&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;hardening-do-systemd&quot;&gt;Hardening do systemd&lt;&#x2F;h2&gt;
-&lt;p&gt;A unit &lt;code&gt;tesd.service&lt;&#x2F;code&gt; inclui diretivas de hardening de segurança:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;ini&quot;&gt;NoNewPrivileges=true
-ProtectSystem=strict
-ProtectHome=true
-ReadWritePaths=&#x2F;var&#x2F;lib&#x2F;tesseras
-PrivateTmp=true
-PrivateDevices=true
-ProtectKernelTunables=true
-ProtectControlGroups=true
-RestrictSUIDSGID=true
-MemoryDenyWriteExecute=true
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;O daemon roda como o usuário não-privilegiado &lt;code&gt;tesseras&lt;&#x2F;code&gt; e só pode escrever em
-&lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;deploy-para-um-servidor-remoto&quot;&gt;Deploy para um servidor remoto&lt;&#x2F;h2&gt;
-&lt;p&gt;O justfile inclui uma recipe &lt;code&gt;deploy&lt;&#x2F;code&gt; para enviar o &lt;code&gt;.deb&lt;&#x2F;code&gt; a um host remoto:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;just deploy bootstrap1.tesseras.net
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Isso compila o &lt;code&gt;.deb&lt;&#x2F;code&gt;, copia via &lt;code&gt;scp&lt;&#x2F;code&gt;, instala com &lt;code&gt;dpkg -i&lt;&#x2F;code&gt; e reinicia o
-serviço &lt;code&gt;tesd&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;atualizando&quot;&gt;Atualizando&lt;&#x2F;h2&gt;
-&lt;p&gt;Depois de baixar novas mudanças, basta rodar &lt;code&gt;just deb&lt;&#x2F;code&gt; novamente e reinstalar:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git pull
-just deb
-sudo dpkg -i target&#x2F;debian&#x2F;tesseras-daemon_*.deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Empacotando o Tesseras para Arch Linux</title>
- <published>2026-02-16T09:00:00+00:00</published>
- <updated>2026-02-16T09:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/packaging-archlinux/"/>
- <id>https://tesseras.net/pt-br/news/packaging-archlinux/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/packaging-archlinux/">&lt;p&gt;O Tesseras agora inclui um PKGBUILD para Arch Linux. Este post explica como
-compilar e instalar o pacote a partir do código-fonte.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;pre-requisitos&quot;&gt;Pré-requisitos&lt;&#x2F;h2&gt;
-&lt;p&gt;Você precisa de uma toolchain Rust funcional e do grupo base-devel:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo pacman -S --needed base-devel sqlite
-rustup toolchain install stable
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;compilando&quot;&gt;Compilando&lt;&#x2F;h2&gt;
-&lt;p&gt;Clone o repositório e execute a recipe &lt;code&gt;just arch&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git clone https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras
-cd tesseras
-just arch
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Isso executa &lt;code&gt;makepkg -sf&lt;&#x2F;code&gt; dentro de &lt;code&gt;packaging&#x2F;archlinux&#x2F;&lt;&#x2F;code&gt;, que:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;prepare&lt;&#x2F;strong&gt; — baixa as dependências Cargo com &lt;code&gt;cargo fetch --locked&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;build&lt;&#x2F;strong&gt; — compila &lt;code&gt;tesd&lt;&#x2F;code&gt; e &lt;code&gt;tes&lt;&#x2F;code&gt; (o CLI) em modo release&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;package&lt;&#x2F;strong&gt; — instala binários, serviço systemd, configs sysusers&#x2F;tmpfiles,
-completions de shell (bash, zsh, fish) e um arquivo de configuração padrão&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;O resultado é um arquivo &lt;code&gt;.pkg.tar.zst&lt;&#x2F;code&gt; em &lt;code&gt;packaging&#x2F;archlinux&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;instalando&quot;&gt;Instalando&lt;&#x2F;h2&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo pacman -U packaging&#x2F;archlinux&#x2F;tesseras-*.pkg.tar.zst
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;configuracao-pos-instalacao&quot;&gt;Configuração pós-instalação&lt;&#x2F;h2&gt;
-&lt;p&gt;O pacote cria automaticamente um usuário e grupo de sistema &lt;code&gt;tesseras&lt;&#x2F;code&gt; via
-systemd-sysusers. Para usar o CLI sem sudo, adicione seu usuário ao grupo:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo usermod -aG tesseras $USER
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Faça logout e login novamente, depois inicie o daemon:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo systemctl enable --now tesd
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;o-que-o-pacote-inclui&quot;&gt;O que o pacote inclui&lt;&#x2F;h2&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Caminho&lt;&#x2F;th&gt;&lt;th&gt;Descrição&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tesd&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Daemon do nó completo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tes&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Cliente CLI&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;etc&#x2F;tesseras&#x2F;config.toml&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Configuração padrão (marcado como backup)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;systemd&#x2F;system&#x2F;tesd.service&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Unit systemd com hardening de segurança&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;sysusers.d&#x2F;tesseras.conf&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Definição do usuário de sistema&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;tmpfiles.d&#x2F;tesseras.conf&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Diretório de dados &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Completions de shell&lt;&#x2F;td&gt;&lt;td&gt;bash, zsh e fish&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;h2 id=&quot;detalhes-do-pkgbuild&quot;&gt;Detalhes do PKGBUILD&lt;&#x2F;h2&gt;
-&lt;p&gt;O PKGBUILD compila diretamente a partir do checkout git local em vez de baixar
-um tarball. A variável de ambiente &lt;code&gt;TESSERAS_ROOT&lt;&#x2F;code&gt; aponta o makepkg para a raiz
-do workspace. O diretório target do Cargo é configurado para &lt;code&gt;$srcdir&#x2F;target&lt;&#x2F;code&gt;
-para manter os artefatos de build dentro do sandbox do makepkg.&lt;&#x2F;p&gt;
-&lt;p&gt;O pacote depende apenas de &lt;code&gt;sqlite&lt;&#x2F;code&gt; em tempo de execução e &lt;code&gt;cargo&lt;&#x2F;code&gt; em tempo de
-build.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;atualizando&quot;&gt;Atualizando&lt;&#x2F;h2&gt;
-&lt;p&gt;Depois de baixar novas mudanças, basta rodar &lt;code&gt;just arch&lt;&#x2F;code&gt; novamente e reinstalar:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git pull
-just arch
-sudo pacman -U packaging&#x2F;archlinux&#x2F;tesseras-*.pkg.tar.zst
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Deduplicacao de Armazenamento</title>
- <published>2026-02-15T23:00:00+00:00</published>
- <updated>2026-02-15T23:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-storage-deduplication/"/>
- <id>https://tesseras.net/pt-br/news/phase4-storage-deduplication/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-storage-deduplication/">&lt;p&gt;Quando multiplas tesseras compartilham a mesma foto, o mesmo clipe de audio ou
-os mesmos dados de fragmento, a camada de armazenamento antiga mantinha copias
-separadas de cada. Em um no armazenando milhares de tesseras para a rede, essa
-duplicacao se acumula rapidamente. A Fase 4 continua com deduplicacao de
-armazenamento: um armazenamento enderecavel por conteudo (CAS) que garante que
-cada dado unico seja armazenado exatamente uma vez em disco, independentemente
-de quantas tesseras o referenciam.&lt;&#x2F;p&gt;
-&lt;p&gt;O design e simples e comprovado: hash do conteudo com BLAKE3, usar o hash como
-nome do arquivo e manter uma contagem de referencias no SQLite. Quando duas
-tesseras incluem a mesma foto de 5 MB, um arquivo existe em disco com
-refcount 2. Quando uma tessera e deletada, o refcount cai para 1 e o arquivo
-permanece. Quando a ultima referencia e liberada, uma varredura periodica limpa
-o orfao.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construido&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Migracao do esquema CAS&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;migrations&#x2F;004_dedup.sql&lt;&#x2F;code&gt;) — Tres
-novas tabelas:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;cas_objects&lt;&#x2F;code&gt; — rastreia cada objeto no armazenamento: hash BLAKE3 (chave
-primaria), tamanho em bytes, contagem de referencias e timestamp de criacao&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;blob_refs&lt;&#x2F;code&gt; — mapeia identificadores logicos de blobs (hash da tessera + hash
-da memoria + nome do arquivo) para hashes CAS, substituindo a convencao antiga
-de caminhos no sistema de arquivos&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;fragment_refs&lt;&#x2F;code&gt; — mapeia identificadores logicos de fragmentos (hash da
-tessera + indice do fragmento) para hashes CAS, substituindo o antigo layout
-do diretorio &lt;code&gt;fragments&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Indices nas colunas de hash garantem lookups O(1) durante leituras e contagem de
-referencias.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CasStore&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;cas.rs&lt;&#x2F;code&gt;) — O motor central de armazenamento
-enderecavel por conteudo. Arquivos sao armazenados sob um diretorio de prefixo
-de dois niveis: &lt;code&gt;&amp;lt;raiz&amp;gt;&#x2F;&amp;lt;prefixo-hex-2-chars&amp;gt;&#x2F;&amp;lt;hash-completo&amp;gt;.blob&lt;&#x2F;code&gt;. O
-armazenamento fornece cinco operacoes:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;put(hash, data)&lt;&#x2F;code&gt; — escreve dados em disco se ainda nao presente, incrementa o
-refcount. Retorna se ocorreu um hit de deduplicacao.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;get(hash)&lt;&#x2F;code&gt; — le dados do disco pelo hash&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;release(hash)&lt;&#x2F;code&gt; — decrementa o refcount. Se chegar a zero, o arquivo em disco
-e deletado imediatamente.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;contains(hash)&lt;&#x2F;code&gt; — verifica existencia sem ler&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;ref_count(hash)&lt;&#x2F;code&gt; — retorna a contagem de referencias atual&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Todas as operacoes sao atomicas dentro de uma unica transacao SQLite. O refcount
-e a fonte de verdade — se o refcount diz que o objeto existe, o arquivo deve
-estar em disco.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;FsBlobStore com CAS&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;blob.rs&lt;&#x2F;code&gt;) — Reescrito para
-delegar todo armazenamento ao CAS. Quando um blob e escrito, seu hash BLAKE3 e
-computado e passado para &lt;code&gt;cas.put()&lt;&#x2F;code&gt;. Uma linha em &lt;code&gt;blob_refs&lt;&#x2F;code&gt; mapeia o caminho
-logico (tessera + memoria + arquivo) para o hash CAS. Leituras buscam o hash CAS
-via &lt;code&gt;blob_refs&lt;&#x2F;code&gt; e leem de &lt;code&gt;cas.get()&lt;&#x2F;code&gt;. Deletar uma tessera libera todas as suas
-referencias de blob em uma unica transacao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;FsFragmentStore com CAS&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;fragment.rs&lt;&#x2F;code&gt;) — Mesmo padrao
-para fragmentos codificados com erasure coding. O checksum BLAKE3 de cada
-fragmento ja e computado durante a codificacao Reed-Solomon, entao e usado
-diretamente como chave CAS. A verificacao de fragmentos agora checa o hash CAS
-ao inves de recomputar do zero — se o CAS diz que os dados estao intactos,
-estao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Coletor de lixo sweep&lt;&#x2F;strong&gt; (&lt;code&gt;cas.rs:sweep()&lt;&#x2F;code&gt;) — Uma passagem periodica de GC que
-trata tres casos limite que o caminho normal de refcount nao consegue:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Arquivos orfaos&lt;&#x2F;strong&gt; — arquivos em disco sem linha correspondente em
-&lt;code&gt;cas_objects&lt;&#x2F;code&gt;. Pode acontecer apos um crash durante escrita. Arquivos com
-menos de 1 hora sao pulados (periodo de graca para escritas em andamento);
-orfaos mais antigos sao deletados.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Refcounts vazados&lt;&#x2F;strong&gt; — linhas em &lt;code&gt;cas_objects&lt;&#x2F;code&gt; com refcount zero que nao
-foram limpas (ex: se o processo morreu entre decrementar e deletar). Essas
-linhas sao removidas.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Idempotente&lt;&#x2F;strong&gt; — executar sweep duas vezes produz o mesmo resultado.&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;O sweep e conectado ao loop de reparo existente em &lt;code&gt;tesseras-replication&lt;&#x2F;code&gt;, entao
-roda automaticamente a cada 24 horas junto com as verificacoes de saude dos
-fragmentos.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Migracao do layout antigo&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;migration.rs&lt;&#x2F;code&gt;) — Uma
-estrategia de migracao copy-first que move dados do layout antigo baseado em
-diretorios (&lt;code&gt;blobs&#x2F;&amp;lt;tessera&amp;gt;&#x2F;&amp;lt;memoria&amp;gt;&#x2F;&amp;lt;arquivo&amp;gt;&lt;&#x2F;code&gt; e
-&lt;code&gt;fragments&#x2F;&amp;lt;tessera&amp;gt;&#x2F;&amp;lt;indice&amp;gt;.shard&lt;&#x2F;code&gt;) para o CAS. A migracao:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;Verifica a versao de armazenamento em &lt;code&gt;storage_meta&lt;&#x2F;code&gt; (versao 1 = layout
-antigo, versao 2 = CAS)&lt;&#x2F;li&gt;
-&lt;li&gt;Percorre os diretorios antigos &lt;code&gt;blobs&#x2F;&lt;&#x2F;code&gt; e &lt;code&gt;fragments&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;Computa hashes BLAKE3 e insere no CAS via &lt;code&gt;put()&lt;&#x2F;code&gt; — duplicatas sao
-automaticamente deduplicadas&lt;&#x2F;li&gt;
-&lt;li&gt;Cria entradas correspondentes em &lt;code&gt;blob_refs&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;fragment_refs&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;Remove diretorios antigos somente apos todos os dados estarem seguros no CAS&lt;&#x2F;li&gt;
-&lt;li&gt;Atualiza a versao de armazenamento para 2&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;A migracao roda na inicializacao do daemon, e idempotente (segura para
-re-executar) e reporta estatisticas: arquivos migrados, duplicatas encontradas,
-bytes economizados.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Metricas Prometheus&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — Dez novas metricas
-para observabilidade:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metrica&lt;&#x2F;th&gt;&lt;th&gt;Descricao&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_objects_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Total de objetos unicos no CAS&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_bytes_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Total de bytes armazenados&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_dedup_hits_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Numero de escritas que encontraram um objeto existente&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_bytes_saved_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bytes economizados por deduplicacao&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_refcount_deletions_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Objetos deletados quando refcount chegou a zero&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_orphans_cleaned_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Arquivos orfaos removidos pelo sweep&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_leaked_refs_cleaned_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Linhas de refcount vazadas limpas&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_skipped_young_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Orfaos jovens pulados (periodo de graca)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_duration_seconds&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Tempo gasto no sweep GC&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;&lt;strong&gt;Testes baseados em propriedades&lt;&#x2F;strong&gt; — Dois testes proptest verificam invariantes
-do CAS sob entradas aleatorias:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;refcount_matches_actual_refs&lt;&#x2F;code&gt; — apos N operacoes aleatorias de put&#x2F;release, o
-refcount sempre corresponde ao numero real de referencias pendentes&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;cas_path_is_deterministic&lt;&#x2F;code&gt; — o mesmo hash sempre produz o mesmo caminho no
-sistema de arquivos&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Atualizacao de testes de integracao&lt;&#x2F;strong&gt; — Todos os testes de integracao em
-&lt;code&gt;tesseras-core&lt;&#x2F;code&gt;, &lt;code&gt;tesseras-replication&lt;&#x2F;code&gt;, &lt;code&gt;tesseras-embedded&lt;&#x2F;code&gt; e &lt;code&gt;tesseras-cli&lt;&#x2F;code&gt;
-atualizados para os novos construtores com CAS. Testes de deteccao de
-adulteracao atualizados para funcionar com o layout de diretorio CAS.&lt;&#x2F;p&gt;
-&lt;p&gt;347 testes passam em todo o workspace. Clippy limpo com &lt;code&gt;-D warnings&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisoes de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 como chave CAS&lt;&#x2F;strong&gt;: o hash de conteudo que ja computamos para
-verificacao de integridade serve tambem como chave de deduplicacao. Nenhuma
-etapa adicional de hashing — o hash computado durante &lt;code&gt;create&lt;&#x2F;code&gt; ou &lt;code&gt;replicate&lt;&#x2F;code&gt;
-e reutilizado como endereco CAS.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Refcount SQLite ao inves de reflinks do sistema de arquivos&lt;&#x2F;strong&gt;: consideramos
-usar copy-on-write no nivel do sistema de arquivos (reflinks em btrfs&#x2F;XFS),
-mas isso amarraria o Tesseras a sistemas de arquivos especificos. Refcounting
-em SQLite funciona em qualquer sistema de arquivos, incluindo FAT32 em
-pendrives baratos e ext4 em Raspberry Pis.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Diretorios de prefixo hexadecimal de dois niveis&lt;&#x2F;strong&gt;: armazenar todos os
-objetos CAS em um diretorio plano desaceleraria sistemas de arquivos com
-milhoes de entradas. A divisao &lt;code&gt;&amp;lt;prefixo 2 chars&amp;gt;&#x2F;&lt;&#x2F;code&gt; limita qualquer diretorio
-individual a ~65k entradas antes de um segundo nivel ser necessario. Isso
-segue a abordagem usada pelo object store do Git.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Periodo de graca para arquivos orfaos&lt;&#x2F;strong&gt;: o sweep GC pula arquivos com menos
-de 1 hora para evitar deletar objetos sendo escritos por uma operacao
-concorrente. Esta e uma escolha pragmatica — troca uma pequena janela de
-potenciais orfaos por seguranca contra crashes sem exigir fsync ou commit de
-duas fases.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Migracao copy-first&lt;&#x2F;strong&gt;: a migracao copia dados para o CAS antes de remover
-diretorios antigos. Se o processo for interrompido, os dados antigos
-permanecem intactos e a migracao pode ser re-executada. Isso e mais lento que
-mover arquivos mas garante zero perda de dados.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Sweep no loop de reparo&lt;&#x2F;strong&gt;: ao inves de adicionar um timer separado de GC, o
-sweep CAS aproveita o loop de reparo existente de 24 horas. Isso mantem o
-daemon simples — um unico ciclo de manutencao em segundo plano cuida tanto da
-saude dos fragmentos quanto da limpeza de armazenamento.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuacao&lt;&#x2F;strong&gt; — auditorias de seguranca, empacotamento para OS
-(Alpine, Arch, Debian, OpenBSD, FreeBSD)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploracao e Cultura&lt;&#x2F;strong&gt; — navegador publico de tesseras por
-era&#x2F;localizacao&#x2F;tema&#x2F;idioma, curadoria institucional, integracao genealogica
-(FamilySearch, Ancestry), exportacao para midia fisica (M-DISC, microfilme,
-papel livre de acido com QR), contexto assistido por IA&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;A deduplicacao de armazenamento completa a historia de eficiencia de
-armazenamento do Tesseras. Um no que armazena fragmentos para milhares de
-usuarios — comum para nos institucionais e nos completos sempre ligados — agora
-paga o custo de disco apenas por dados unicos. Combinado com codificacao de
-apagamento Reed-Solomon (que ja minimiza redundancia no nivel da rede), o
-sistema alcanca armazenamento eficiente tanto nas camadas local quanto
-distribuida.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Onboarding de Nos Institucionais</title>
- <published>2026-02-15T22:00:00+00:00</published>
- <updated>2026-02-15T22:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-institutional-onboarding/"/>
- <id>https://tesseras.net/pt-br/news/phase4-institutional-onboarding/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-institutional-onboarding/">&lt;p&gt;Uma rede P2P composta apenas por individuos e fragil. Discos rigidos morrem,
-celulares sao perdidos, pessoas perdem interesse. A sobrevivencia a longo prazo
-das memorias da humanidade depende de instituicoes — bibliotecas, arquivos,
-museus, universidades — que medem seus tempos de vida em seculos. A Fase 4
-continua com o onboarding de nos institucionais: organizacoes verificadas agora
-podem prometer armazenamento, manter indices de busca e participar da rede com
-uma identidade distinta.&lt;&#x2F;p&gt;
-&lt;p&gt;O design segue um principio de confiar mas verificar: instituicoes se
-identificam via registros DNS TXT (o mesmo mecanismo usado por SPF, DKIM e DMARC
-para email), prometem um orcamento de armazenamento e recebem isencoes de
-reciprocidade para que possam armazenar fragmentos para outros sem esperar nada
-em troca. Em contrapartida, a rede trata seus fragmentos como replicas de maior
-qualidade e limita a dependencia excessiva de qualquer instituicao individual
-atraves de restricoes de diversidade.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construido&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Bits de capacidade&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;network.rs&lt;&#x2F;code&gt;) — Dois novos flags
-adicionados ao bitfield &lt;code&gt;Capabilities&lt;&#x2F;code&gt;: &lt;code&gt;INSTITUTIONAL&lt;&#x2F;code&gt; (bit 7) e &lt;code&gt;SEARCH_INDEX&lt;&#x2F;code&gt;
-(bit 8). Um novo construtor &lt;code&gt;institutional_default()&lt;&#x2F;code&gt; retorna o conjunto
-completo de capacidades da Fase 2 mais esses dois bits e &lt;code&gt;RELAY&lt;&#x2F;code&gt;. Nos normais
-anunciam &lt;code&gt;phase2_default()&lt;&#x2F;code&gt; que nao inclui flags institucionais. Testes de
-roundtrip de serializacao verificam que os novos bits sobrevivem a codificacao
-MessagePack.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Tipos de busca&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;search.rs&lt;&#x2F;code&gt;) — Tres novos tipos de dominio
-para o subsistema de busca:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;SearchFilters&lt;&#x2F;code&gt; — parametros de consulta: &lt;code&gt;memory_type&lt;&#x2F;code&gt;, &lt;code&gt;visibility&lt;&#x2F;code&gt;,
-&lt;code&gt;language&lt;&#x2F;code&gt;, &lt;code&gt;date_range&lt;&#x2F;code&gt;, &lt;code&gt;geo&lt;&#x2F;code&gt; (bounding box), &lt;code&gt;page&lt;&#x2F;code&gt;, &lt;code&gt;page_size&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;SearchHit&lt;&#x2F;code&gt; — um resultado individual: hash do conteudo mais um
-&lt;code&gt;MetadataExcerpt&lt;&#x2F;code&gt; (titulo, descricao, tipo de memoria, data de criacao,
-visibilidade, idioma, tags)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;GeoFilter&lt;&#x2F;code&gt; — bounding box com &lt;code&gt;min_lat&lt;&#x2F;code&gt;, &lt;code&gt;max_lat&lt;&#x2F;code&gt;, &lt;code&gt;min_lon&lt;&#x2F;code&gt;, &lt;code&gt;max_lon&lt;&#x2F;code&gt; para
-consultas espaciais&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Todos os tipos derivam &lt;code&gt;Serialize&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Deserialize&lt;&#x2F;code&gt; para transporte e
-&lt;code&gt;Clone&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Debug&lt;&#x2F;code&gt; para diagnostico.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Configuracao institucional do daemon&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;) — Uma nova secao
-&lt;code&gt;[institutional]&lt;&#x2F;code&gt; no TOML com &lt;code&gt;domain&lt;&#x2F;code&gt; (o dominio DNS a verificar),
-&lt;code&gt;pledge_bytes&lt;&#x2F;code&gt; (compromisso de armazenamento em bytes) e &lt;code&gt;search_enabled&lt;&#x2F;code&gt;
-(toggle para o indice FTS5). O metodo &lt;code&gt;to_dht_config()&lt;&#x2F;code&gt; agora define
-&lt;code&gt;Capabilities::institutional_default()&lt;&#x2F;code&gt; quando a configuracao institucional esta
-presente, para que nos institucionais anunciem os bits de capacidade corretos em
-respostas Pong.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Verificacao DNS TXT&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;institutional.rs&lt;&#x2F;code&gt;) — Resolucao DNS assincrona
-usando &lt;code&gt;hickory-resolver&lt;&#x2F;code&gt; para verificar identidade institucional. O daemon
-consulta registros TXT em &lt;code&gt;_tesseras.&amp;lt;dominio&amp;gt;&lt;&#x2F;code&gt; e analisa campos chave-valor:
-&lt;code&gt;v&lt;&#x2F;code&gt; (versao), &lt;code&gt;node&lt;&#x2F;code&gt; (node ID em hexadecimal) e &lt;code&gt;pledge&lt;&#x2F;code&gt; (compromisso de
-armazenamento em bytes). A verificacao checa:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;Um registro TXT existe em &lt;code&gt;_tesseras.&amp;lt;dominio&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;O campo &lt;code&gt;node&lt;&#x2F;code&gt; corresponde ao node ID do proprio daemon&lt;&#x2F;li&gt;
-&lt;li&gt;O campo &lt;code&gt;pledge&lt;&#x2F;code&gt; esta presente e e valido&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;Na inicializacao, o daemon tenta a verificacao DNS. Se bem-sucedida, o no roda
-com capacidades institucionais. Se falhar, o no registra um aviso e faz
-downgrade para um no completo normal — sem crash, sem intervencao manual.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Comando CLI de setup&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;institutional.rs&lt;&#x2F;code&gt;) — Um novo
-subcomando &lt;code&gt;institutional setup&lt;&#x2F;code&gt; que guia operadores pelo onboarding:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;Le a identidade do no a partir do diretorio de dados&lt;&#x2F;li&gt;
-&lt;li&gt;Solicita nome de dominio e tamanho do pledge&lt;&#x2F;li&gt;
-&lt;li&gt;Gera o registro DNS TXT exato a adicionar:
-&lt;code&gt;v=tesseras1 node=&amp;lt;hex&amp;gt; pledge=&amp;lt;bytes&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;Escreve a secao institucional no arquivo de configuracao do daemon&lt;&#x2F;li&gt;
-&lt;li&gt;Imprime os proximos passos: adicionar o registro TXT, reiniciar o daemon&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;&lt;strong&gt;Indice de busca SQLite&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&lt;&#x2F;code&gt;) — Uma migracao
-(&lt;code&gt;003_institutional.sql&lt;&#x2F;code&gt;) que cria tres estruturas:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;search_content&lt;&#x2F;code&gt; — uma tabela virtual FTS5 para busca full-text sobre
-metadados de tesseras (titulo, descricao, criador, tags, idioma)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;geo_index&lt;&#x2F;code&gt; — uma tabela virtual R-tree para consultas espaciais de bounding
-box sobre latitude&#x2F;longitude&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;geo_map&lt;&#x2F;code&gt; — uma tabela de mapeamento ligando IDs de linhas do R-tree a hashes
-de conteudo&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;O adaptador &lt;code&gt;SqliteSearchIndex&lt;&#x2F;code&gt; implementa o port trait &lt;code&gt;SearchIndex&lt;&#x2F;code&gt; com
-&lt;code&gt;index_tessera()&lt;&#x2F;code&gt; (inserir&#x2F;atualizar) e &lt;code&gt;search()&lt;&#x2F;code&gt; (consultar com filtros).
-Consultas FTS5 suportam busca em linguagem natural; consultas geo usam
-&lt;code&gt;INTERSECT&lt;&#x2F;code&gt; do R-tree para lookups de bounding box. Resultados sao ranqueados
-por score de relevancia do FTS5.&lt;&#x2F;p&gt;
-&lt;p&gt;A migracao tambem adiciona uma coluna &lt;code&gt;is_institutional&lt;&#x2F;code&gt; a tabela &lt;code&gt;reciprocity&lt;&#x2F;code&gt;,
-tratada de forma idempotente via checagens &lt;code&gt;pragma_table_info&lt;&#x2F;code&gt; (o
-&lt;code&gt;ALTER TABLE ADD COLUMN&lt;&#x2F;code&gt; do SQLite nao tem &lt;code&gt;IF NOT EXISTS&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Bypass de reciprocidade&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-replication&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) — Nos
-institucionais sao isentos de checagens de reciprocidade. Quando
-&lt;code&gt;receive_fragment()&lt;&#x2F;code&gt; e chamado, se o node ID do remetente esta marcado como
-institucional no ledger de reciprocidade, a checagem de saldo e ignorada
-completamente. Isso significa que instituicoes podem armazenar fragmentos para
-toda a rede sem precisar &quot;ganhar&quot; creditos primeiro — sua identidade verificada
-por DNS e compromisso de armazenamento servem como credencial.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Restricao de diversidade por tipo de no&lt;&#x2F;strong&gt;
-(&lt;code&gt;tesseras-replication&#x2F;src&#x2F;distributor.rs&lt;&#x2F;code&gt;) — Uma nova funcao
-&lt;code&gt;apply_institutional_diversity()&lt;&#x2F;code&gt; limita quantas replicas de uma unica tessera
-podem ir para nos institucionais. O limite e &lt;code&gt;ceil(fator_replicacao &#x2F; 3.5)&lt;&#x2F;code&gt; —
-com o padrao &lt;code&gt;r=7&lt;&#x2F;code&gt;, no maximo 2 de 7 replicas vao para instituicoes. Isso impede
-que a rede se torne dependente de um pequeno numero de grandes instituicoes: se
-os servidores de uma universidade cairem, pelo menos 5 replicas permanecem em
-nos independentes.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Extensoes de mensagens DHT&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;message.rs&lt;&#x2F;code&gt;) — Duas novas
-variantes de mensagem:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Mensagem&lt;&#x2F;th&gt;&lt;th&gt;Proposito&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;Search&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Cliente envia string de consulta, filtros e numero da pagina&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;SearchResult&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;No institucional responde com resultados e contagem total&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;A funcao &lt;code&gt;encode()&lt;&#x2F;code&gt; foi trocada de serializacao MessagePack posicional para
-nomeada (&lt;code&gt;rmp_serde::to_vec_named&lt;&#x2F;code&gt;) para lidar corretamente com campos opcionais
-de &lt;code&gt;SearchFilters&lt;&#x2F;code&gt; — a codificacao posicional quebra quando
-&lt;code&gt;skip_serializing_if&lt;&#x2F;code&gt; omite campos.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Metricas Prometheus&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — Oito metricas especificas
-institucionais:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_pledge_bytes&lt;&#x2F;code&gt; — compromisso de armazenamento
-configurado&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_stored_bytes&lt;&#x2F;code&gt; — bytes realmente armazenados&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_pledge_utilization_ratio&lt;&#x2F;code&gt; — razao armazenado&#x2F;prometido&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_peers_served&lt;&#x2F;code&gt; — peers unicos que receberam fragmentos&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_search_index_total&lt;&#x2F;code&gt; — tesseras no indice de busca&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_search_queries_total&lt;&#x2F;code&gt; — consultas de busca recebidas&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_dns_verification_status&lt;&#x2F;code&gt; — 1 se verificado por DNS, 0
-caso contrario&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_dns_verification_last&lt;&#x2F;code&gt; — timestamp Unix da ultima
-verificacao&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Testes de integracao&lt;&#x2F;strong&gt; — Dois testes em
-&lt;code&gt;tesseras-replication&#x2F;tests&#x2F;integration.rs&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;institutional_peer_bypasses_reciprocity&lt;&#x2F;code&gt; — verifica que um peer institucional
-com deficit massivo (-999.999 de saldo) ainda pode armazenar fragmentos,
-enquanto um peer nao institucional com o mesmo deficit e rejeitado&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;institutional_node_accepts_fragment_despite_deficit&lt;&#x2F;code&gt; — teste async completo
-usando &lt;code&gt;ReplicationService&lt;&#x2F;code&gt; com DHT, fragment store, reciprocity ledger e blob
-store mockados: envia um fragmento de um remetente institucional e verifica
-que e aceito&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;322 testes passam em todo o workspace. Clippy limpo com &lt;code&gt;-D warnings&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisoes de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;DNS TXT ao inves de PKI ou blockchain&lt;&#x2F;strong&gt;: DNS e universalmente implantado,
-universalmente compreendido e ja usado para verificacao de dominio (SPF, DKIM,
-Let&#x27;s Encrypt). Instituicoes ja gerenciam DNS. Nenhuma autoridade
-certificadora, nenhum token, nenhuma transacao on-chain — apenas um registro
-TXT. Se uma instituicao perder controle de seu dominio, a verificacao
-naturalmente falha na proxima checagem.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Degradacao graciosa em falha DNS&lt;&#x2F;strong&gt;: se a verificacao DNS falha na
-inicializacao, o daemon faz downgrade para um no completo normal ao inves de
-recusar iniciar. Isso previne incidentes operacionais — uma misconfiguracao
-DNS nao deveria tirar um no do ar.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Limite de diversidade em &lt;code&gt;ceil(r &#x2F; 3.5)&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: com &lt;code&gt;r=7&lt;&#x2F;code&gt;, no maximo 2 replicas
-vao para instituicoes. Isso e conservador — garante que a rede nunca dependa
-de instituicoes para quorum majoritario, enquanto ainda se beneficia de sua
-capacidade de armazenamento e uptime.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Codificacao MessagePack nomeada&lt;&#x2F;strong&gt;: trocar de codificacao posicional para
-nomeada adiciona ~15% de overhead por mensagem mas elimina uma classe de bugs
-de serializacao quando campos opcionais estao presentes. O DHT nao e limitado
-por largura de banda no nivel de mensagem, entao o tradeoff vale a pena.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Isencao de reciprocidade ao inves de concessao de creditos&lt;&#x2F;strong&gt;: ao inves de
-dar as instituicoes um saldo inicial grande de creditos (que e arbitrario e
-precisa de ajuste), isentamos completamente. Sua identidade verificada por DNS
-e compromisso publico de armazenamento substituem o mecanismo de reciprocidade
-bilateral.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;FTS5 + R-tree no SQLite&lt;&#x2F;strong&gt;: busca full-text e indexacao espacial sao
-embutidas no SQLite como extensoes carregaveis. Nenhum motor de busca externo
-(Elasticsearch, Meilisearch) necessario. Isso mantem o deploy como um unico
-binario com um unico arquivo de banco de dados — critico para operadores
-institucionais que podem nao ter uma equipe de DevOps.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuacao&lt;&#x2F;strong&gt; — deduplicacao de armazenamento (armazenamento
-enderecavel por conteudo com BLAKE3), auditorias de seguranca, empacotamento
-para OS (Alpine, Arch, Debian, OpenBSD, FreeBSD)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploracao e Cultura&lt;&#x2F;strong&gt; — navegador publico de tesseras por
-era&#x2F;localizacao&#x2F;tema&#x2F;idioma, curadoria institucional, integracao genealogica
-(FamilySearch, Ancestry), exportacao para midia fisica (M-DISC, microfilme,
-papel livre de acido com QR), contexto assistido por IA&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;O onboarding institucional fecha uma lacuna critica no modelo de preservacao do
-Tesseras. Nos individuais fornecem resiliencia de base — milhares de
-dispositivos ao redor do globo, cada um armazenando alguns fragmentos. Nos
-institucionais fornecem ancoragem — organizacoes com infraestrutura
-profissional, armazenamento redundante e horizontes operacionais de multiplas
-decadas. Juntos, formam uma rede onde memorias podem sobreviver tanto a
-dispositivos individuais quanto a instituicoes individuais.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Tuning de Performance</title>
- <published>2026-02-15T20:00:00+00:00</published>
- <updated>2026-02-15T20:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-performance-tuning/"/>
- <id>https://tesseras.net/pt-br/news/phase4-performance-tuning/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-performance-tuning/">&lt;p&gt;Uma rede P2P que atravessa NATs mas engasga com seu proprio I&#x2F;O nao serve de
-muito. A Fase 4 continua com tuning de performance: centralizacao da
-configuracao do banco de dados, cache de blobs de fragmentos em memoria,
-gerenciamento de ciclo de vida de conexoes QUIC e eliminacao de leituras
-desnecessarias de disco no hot path de atestacao.&lt;&#x2F;p&gt;
-&lt;p&gt;O principio orientador foi o mesmo do resto do Tesseras: fazer a coisa mais
-simples que realmente funciona. Sem alocadores customizados, sem estruturas de
-dados lock-free, sem complexidade prematura. Um &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; centralizado, um
-cache LRU, um reaper de conexoes e uma correcao pontual para evitar reler blobs
-que ja tinham checksum calculado.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construido&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Configuracao SQLite centralizada&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;database.rs&lt;&#x2F;code&gt;) — Um
-novo struct &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; e funcoes &lt;code&gt;open_database()&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;open_in_memory()&lt;&#x2F;code&gt; que
-aplicam todos os pragmas SQLite em um unico lugar: journal mode WAL, foreign
-keys, modo synchronous (NORMAL por padrao, FULL para hardware instavel como
-RPi + cartao SD), busy timeout, tamanho do cache de paginas e intervalo de
-autocheckpoint WAL. Anteriormente, cada ponto de chamada abria uma conexao e
-aplicava pragmas ad hoc. Agora o daemon, CLI e testes passam todos pelo mesmo
-caminho. 7 testes cobrindo foreign keys, busy timeout, journal mode, migracoes,
-modos synchronous e criacao de arquivos WAL em disco.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Cache LRU de fragmentos&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;cache.rs&lt;&#x2F;code&gt;) — Um
-&lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt; que envolve qualquer &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; com um cache LRU
-ciente de bytes. Blobs de fragmentos sao cacheados na leitura e invalidados na
-escrita ou exclusao. Quando o cache excede seu limite de bytes configurado, as
-entradas menos recentemente usadas sao removidas. O cache e transparente: ele
-proprio implementa &lt;code&gt;FragmentStore&lt;&#x2F;code&gt;, entao o resto da pilha nao sabe que esta la.
-Metricas Prometheus opcionais rastreiam hits, misses e uso atual de bytes. 3
-testes: hit no cache evita leitura interna, store invalida cache, remocao quando
-excede bytes maximos.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Metricas Prometheus de storage&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — Um
-struct &lt;code&gt;StorageMetrics&lt;&#x2F;code&gt; com tres contadores&#x2F;gauges: &lt;code&gt;fragment_cache_hits&lt;&#x2F;code&gt;,
-&lt;code&gt;fragment_cache_misses&lt;&#x2F;code&gt; e &lt;code&gt;fragment_cache_bytes&lt;&#x2F;code&gt;. Registrado no registry
-Prometheus e conectado ao cache de fragmentos via &lt;code&gt;with_metrics()&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Correcao do hot path de atestacao&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-replication&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) —
-O fluxo de atestacao anteriormente lia cada blob de fragmento do disco e
-recalculava seu checksum BLAKE3. Como &lt;code&gt;list_fragments()&lt;&#x2F;code&gt; ja retorna &lt;code&gt;FragmentId&lt;&#x2F;code&gt;
-com um checksum armazenado, a correcao e trivial: usar &lt;code&gt;frag.checksum&lt;&#x2F;code&gt; ao inves
-de &lt;code&gt;blake3::hash(&amp;amp;data)&lt;&#x2F;code&gt;. Isso elimina uma leitura de disco por fragmento
-durante atestacao — para uma tessera com 100 fragmentos, sao 100 leituras a
-menos. Um teste com &lt;code&gt;expect_read_fragment().never()&lt;&#x2F;code&gt; verifica que nenhuma
-leitura de blob acontece durante atestacao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Ciclo de vida do pool de conexoes QUIC&lt;&#x2F;strong&gt;
-(&lt;code&gt;tesseras-net&#x2F;src&#x2F;quinn_transport.rs&lt;&#x2F;code&gt;) — Um struct &lt;code&gt;PoolConfig&lt;&#x2F;code&gt; controlando
-maximo de conexoes, timeout de inatividade e intervalo do reaper.
-&lt;code&gt;PooledConnection&lt;&#x2F;code&gt; envolve cada &lt;code&gt;quinn::Connection&lt;&#x2F;code&gt; com um timestamp
-&lt;code&gt;last_used&lt;&#x2F;code&gt;. Quando o pool atinge capacidade maxima, a conexao inativa mais
-antiga e removida antes de abrir uma nova. Uma tarefa reaper em background
-(Tokio spawn) periodicamente fecha conexoes que ficaram inativas alem do
-timeout. 4 novas metricas de pool: &lt;code&gt;tesseras_conn_pool_size&lt;&#x2F;code&gt;, &lt;code&gt;pool_hits_total&lt;&#x2F;code&gt;,
-&lt;code&gt;pool_misses_total&lt;&#x2F;code&gt;, &lt;code&gt;pool_evictions_total&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Integracao no daemon&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;, &lt;code&gt;main.rs&lt;&#x2F;code&gt;) — Uma nova secao
-&lt;code&gt;[performance]&lt;&#x2F;code&gt; na configuracao TOML com campos para tamanho de cache SQLite,
-modo synchronous, busy timeout, tamanho de cache de fragmentos, maximo de
-conexoes, timeout de inatividade e intervalo do reaper. O &lt;code&gt;main()&lt;&#x2F;code&gt; do daemon
-agora chama &lt;code&gt;open_database()&lt;&#x2F;code&gt; com o &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; configurado, envolve
-&lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt; com &lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt; e vincula QUIC com o &lt;code&gt;PoolConfig&lt;&#x2F;code&gt;
-configurado. A dependencia direta de &lt;code&gt;rusqlite&lt;&#x2F;code&gt; foi removida do crate do daemon.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Migracao do CLI&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;commands&#x2F;init.rs&lt;&#x2F;code&gt;, &lt;code&gt;create.rs&lt;&#x2F;code&gt;) — Ambos
-os comandos &lt;code&gt;init&lt;&#x2F;code&gt; e &lt;code&gt;create&lt;&#x2F;code&gt; agora usam &lt;code&gt;tesseras_storage::open_database()&lt;&#x2F;code&gt; com
-o &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; padrao ao inves de abrir conexoes &lt;code&gt;rusqlite&lt;&#x2F;code&gt; diretamente. A
-dependencia de &lt;code&gt;rusqlite&lt;&#x2F;code&gt; foi removida do crate do CLI.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisoes de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Padrao decorator para cache&lt;&#x2F;strong&gt;: &lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt; envolve
-&lt;code&gt;Box&amp;lt;dyn FragmentStore&amp;gt;&lt;&#x2F;code&gt; e implementa &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; ele proprio. Isso
-significa que cache e opt-in, composavel e invisivel para consumidores. O
-daemon habilita; testes podem pular.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Remocao ciente de bytes&lt;&#x2F;strong&gt;: o cache LRU rastreia bytes totais, nao contagem
-de entradas. Blobs de fragmentos variam muito em tamanho (um fragmento de
-texto de 4KB vs um shard de foto de 2MB), entao contar entradas daria uma
-visao enganosa do uso de memoria.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Sem crate de pool de conexoes&lt;&#x2F;strong&gt;: ao inves de trazer uma biblioteca generica
-de pool, o pool de conexoes e um wrapper fino sobre
-&lt;code&gt;DashMap&amp;lt;SocketAddr, PooledConnection&amp;gt;&lt;&#x2F;code&gt; com um reaper Tokio. Conexoes QUIC sao
-multiplexadas, entao o &quot;pool&quot; e realmente sobre gerenciamento de ciclo de vida
-(limpeza de inativos, maximo de conexoes) e nao sobre emprestar&#x2F;devolver.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Checksums armazenados ao inves de releituras&lt;&#x2F;strong&gt;: a correcao de atestacao e
-intencionalmente minima — uma linha alterada, uma leitura de disco removida
-por fragmento. Os checksums ja estavam armazenados no SQLite por
-&lt;code&gt;store_fragment()&lt;&#x2F;code&gt;, apenas nao estavam sendo usados.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Configuracao centralizada de pragmas&lt;&#x2F;strong&gt;: um unico struct &lt;code&gt;StorageConfig&lt;&#x2F;code&gt;
-substitui chamadas &lt;code&gt;PRAGMA&lt;&#x2F;code&gt; espalhadas. O flag &lt;code&gt;sqlite_synchronous_full&lt;&#x2F;code&gt;
-existe especificamente para implantacoes em Raspberry Pi onde o kernel pode
-crashar e perder transacoes WAL nao checkpointadas.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuacao&lt;&#x2F;strong&gt; — Shamir&#x27;s Secret Sharing para herdeiros, tesseras
-seladas (criptografia time-lock), auditorias de seguranca, onboarding de nos
-institucionais, deduplicacao de storage, empacotamento para OS&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploracao e Cultura&lt;&#x2F;strong&gt; — navegador publico de tesseras por
-era&#x2F;localizacao&#x2F;tema&#x2F;idioma, curadoria institucional, integracao genealogica,
-exportacao para midia fisica (M-DISC, microfilme, papel livre de acido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Com tuning de performance implementado, Tesseras lida com o caso comum de forma
-eficiente: leituras de fragmentos acertam o cache LRU, atestacao pula I&#x2F;O de
-disco, conexoes QUIC inativas sao removidas automaticamente e o SQLite e
-configurado consistentemente em toda a pilha. Os proximos passos focam em
-funcionalidades criptograficas (Shamir, time-lock) e hardening para implantacao
-em producao.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Verificar Sem Instalar Nada</title>
- <published>2026-02-15T20:00:00+00:00</published>
- <updated>2026-02-15T20:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-wasm-browser-verification/"/>
- <id>https://tesseras.net/pt-br/news/phase4-wasm-browser-verification/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-wasm-browser-verification/">&lt;p&gt;Confiança não deveria exigir instalação de software. Se alguém te envia uma
-tessera — um pacote de memórias preservadas — você deveria poder verificar que é
-genuína e não foi modificada sem baixar um app, criar uma conta, ou confiar em
-um servidor. É isso que o &lt;code&gt;tesseras-wasm&lt;&#x2F;code&gt; entrega: arraste um arquivo tessera
-para uma página web, e a verificação criptográfica acontece inteiramente no seu
-navegador.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-wasm&lt;&#x2F;strong&gt; — Um crate Rust que compila para WebAssembly via wasm-pack,
-expondo quatro funções stateless para JavaScript. O crate depende do
-&lt;code&gt;tesseras-core&lt;&#x2F;code&gt; para parsing do manifesto e chama primitivas criptográficas
-diretamente (blake3, ed25519-dalek) ao invés de depender do &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt;,
-que puxa bibliotecas pós-quânticas baseadas em C que não compilam para
-&lt;code&gt;wasm32-unknown-unknown&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;parse_manifest&lt;&#x2F;code&gt; recebe os bytes brutos do MANIFEST (texto UTF-8 plano, não
-MessagePack), delega para &lt;code&gt;tesseras_core::manifest::Manifest::parse()&lt;&#x2F;code&gt;, e
-retorna uma string JSON com a chave pública Ed25519 do criador, caminhos dos
-arquivos de assinatura, e uma lista de arquivos com seus hashes BLAKE3
-esperados, tamanhos e tipos MIME. Structs internas (&lt;code&gt;ManifestJson&lt;&#x2F;code&gt;,
-&lt;code&gt;CreatorPubkey&lt;&#x2F;code&gt;, &lt;code&gt;SignatureFiles&lt;&#x2F;code&gt;, &lt;code&gt;FileEntry&lt;&#x2F;code&gt;) são serializadas com serde_json.
-Os campos de chave pública ML-DSA e arquivo de assinatura estão presentes no
-contrato JSON mas definidos como &lt;code&gt;null&lt;&#x2F;code&gt; — prontos para quando a assinatura
-pós-quântica for implementada no lado nativo.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;hash_blake3&lt;&#x2F;code&gt; computa um hash BLAKE3 de bytes arbitrários e retorna uma string
-hexadecimal de 64 caracteres. É chamada uma vez por arquivo na tessera para
-verificar integridade contra o MANIFEST.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;verify_ed25519&lt;&#x2F;code&gt; recebe uma mensagem, uma assinatura de 64 bytes e uma chave
-pública de 32 bytes, constrói uma &lt;code&gt;ed25519_dalek::VerifyingKey&lt;&#x2F;code&gt;, e retorna se a
-assinatura é válida. A validação de comprimento retorna erros descritivos
-(&quot;Ed25519 public key must be 32 bytes&quot;) ao invés de causar panic.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;verify_ml_dsa&lt;&#x2F;code&gt; é um stub que retorna um erro explicando que verificação ML-DSA
-ainda não está disponível. Isso é deliberado: o crate &lt;code&gt;ml-dsa&lt;&#x2F;code&gt; no crates.io está
-na v0.1.0-rc.7 (pré-release), e o &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt; usa &lt;code&gt;pqcrypto-dilithium&lt;&#x2F;code&gt;
-(CRYSTALS-Dilithium baseado em C) que é incompatível em nível de bytes com FIPS
-204 ML-DSA. Ambos os lados precisam usar a mesma implementação em Rust puro
-antes que a verificação cruzada funcione. Verificação Ed25519 é suficiente —
-toda tessera é assinada com Ed25519.&lt;&#x2F;p&gt;
-&lt;p&gt;Todas as quatro funções usam um padrão de duas camadas para testabilidade:
-funções internas retornam &lt;code&gt;Result&amp;lt;T, String&amp;gt;&lt;&#x2F;code&gt; e são testadas nativamente,
-enquanto wrappers finos &lt;code&gt;#[wasm_bindgen]&lt;&#x2F;code&gt; convertem erros para &lt;code&gt;JsError&lt;&#x2F;code&gt;. Isso
-evita que &lt;code&gt;JsError::new()&lt;&#x2F;code&gt; cause panic em targets não-WASM durante os testes.&lt;&#x2F;p&gt;
-&lt;p&gt;O binário WASM compilado tem 109 KB bruto e 44 KB com gzip — bem abaixo do
-orçamento de 200 KB. O wasm-opt aplica otimização &lt;code&gt;-Oz&lt;&#x2F;code&gt; após o wasm-pack
-compilar com &lt;code&gt;opt-level = &quot;z&quot;&lt;&#x2F;code&gt;, LTO e uma única unidade de codegen.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;@tesseras&#x2F;verify&lt;&#x2F;strong&gt; — Um pacote npm TypeScript (&lt;code&gt;crates&#x2F;tesseras-wasm&#x2F;js&#x2F;&lt;&#x2F;code&gt;) que
-orquestra a verificação no lado do navegador. A API pública é uma única função:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;typescript&quot;&gt;async function verifyTessera(
- archive: Uint8Array,
- onProgress?: (current: number, total: number, file: string) =&amp;gt; void
-): Promise&amp;lt;VerificationResult&amp;gt;
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;O tipo &lt;code&gt;VerificationResult&lt;&#x2F;code&gt; fornece tudo que uma UI precisa: validade geral,
-hash da tessera, chaves públicas do criador, status das assinaturas
-(valid&#x2F;invalid&#x2F;missing para Ed25519 e ML-DSA), resultados de integridade por
-arquivo com hashes esperados e reais, uma lista de arquivos inesperados não
-presentes no MANIFEST, e um array de erros.&lt;&#x2F;p&gt;
-&lt;p&gt;A descompactação de arquivos (&lt;code&gt;unpack.ts&lt;&#x2F;code&gt;) lida com três formatos: tar
-comprimido com gzip (detectado pelos magic bytes &lt;code&gt;\x1f\x8b&lt;&#x2F;code&gt;, descomprimido com
-fflate e depois parseado como tar), ZIP (magic &lt;code&gt;PK\x03\x04&lt;&#x2F;code&gt;, descompactado com
-&lt;code&gt;unzipSync&lt;&#x2F;code&gt; do fflate), e tar bruto (&lt;code&gt;ustar&lt;&#x2F;code&gt; no offset 257). Uma função
-&lt;code&gt;normalizePath&lt;&#x2F;code&gt; remove o prefixo &lt;code&gt;tessera-&amp;lt;hash&amp;gt;&#x2F;&lt;&#x2F;code&gt; para que os caminhos internos
-correspondam às entradas do MANIFEST.&lt;&#x2F;p&gt;
-&lt;p&gt;A verificação roda em um Web Worker (&lt;code&gt;worker.ts&lt;&#x2F;code&gt;) para manter a thread da UI
-responsiva. O worker inicializa o módulo WASM, descompacta o arquivo, parseia o
-MANIFEST, verifica a assinatura Ed25519 contra a chave pública do criador,
-depois faz hash de cada arquivo com BLAKE3 e compara com os valores esperados.
-Mensagens de progresso são transmitidas de volta para a thread principal após
-cada arquivo. Se qualquer assinatura é inválida, a verificação para
-imediatamente sem fazer hash dos arquivos — falhando rápido na verificação mais
-crítica.&lt;&#x2F;p&gt;
-&lt;p&gt;O arquivo é transferido para o worker com zero-copy
-(&lt;code&gt;worker.postMessage({ type: &quot;verify&quot;, archive }, [archive.buffer])&lt;&#x2F;code&gt;) para
-evitar duplicar arquivos de tessera potencialmente grandes na memória.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Pipeline de build&lt;&#x2F;strong&gt; — Três novos targets no justfile: &lt;code&gt;wasm-build&lt;&#x2F;code&gt; executa
-wasm-pack com &lt;code&gt;--target web --release&lt;&#x2F;code&gt; e otimiza com wasm-opt; &lt;code&gt;wasm-size&lt;&#x2F;code&gt;
-reporta o tamanho do binário bruto e com gzip; &lt;code&gt;test-wasm&lt;&#x2F;code&gt; executa a suíte de
-testes nativos.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 9 testes unitários nativos cobrem hashing BLAKE3 (entrada vazia,
-valor conhecido), verificação Ed25519 (assinatura válida, assinatura inválida,
-chave errada, comprimento de chave inválido), e parsing do MANIFEST (manifesto
-válido, UTF-8 inválido, lixo). 3 testes de integração WASM rodam em Chrome
-headless via &lt;code&gt;wasm-pack test --headless --chrome&lt;&#x2F;code&gt;, verificando que
-&lt;code&gt;hash_blake3&lt;&#x2F;code&gt;, &lt;code&gt;verify_ed25519&lt;&#x2F;code&gt; e &lt;code&gt;parse_manifest&lt;&#x2F;code&gt; funcionam corretamente quando
-compilados para &lt;code&gt;wasm32-unknown-unknown&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Sem dependência do tesseras-crypto&lt;&#x2F;strong&gt;: o crate WASM chama blake3 e
-ed25519-dalek diretamente. O &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt; depende do &lt;code&gt;pqcrypto-kyber&lt;&#x2F;code&gt;
-(ML-KEM baseado em C via pqcrypto-traits) que requer um toolchain de
-compilador C e não tem target wasm32. Dependendo apenas de crates Rust puros,
-o build WASM tem zero dependências C e compila sem problemas para WebAssembly.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ML-DSA adiado, não fingido&lt;&#x2F;strong&gt;: ao invés de silenciosamente pular a
-verificação pós-quântica, o stub retorna um erro explícito. Isso garante que
-se uma tessera contiver uma assinatura ML-DSA, o resultado da verificação
-reportará &lt;code&gt;ml_dsa: &quot;missing&quot;&lt;&#x2F;code&gt; ao invés de fingir que foi verificada. O
-orquestrador JS lida com isso graciosamente — uma tessera é válida se Ed25519
-passar e ML-DSA estiver ausente (ainda não implementado em nenhum dos lados).&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Padrão de função interna&lt;&#x2F;strong&gt;: &lt;code&gt;JsError&lt;&#x2F;code&gt; não pode ser construído em targets
-não-WASM (causa panic). Dividir cada função em
-&lt;code&gt;foo_inner() -&amp;gt; Result&amp;lt;T, String&amp;gt;&lt;&#x2F;code&gt; e &lt;code&gt;foo() -&amp;gt; Result&amp;lt;T, JsError&amp;gt;&lt;&#x2F;code&gt; permite que
-a suíte de testes nativa exercite toda a lógica sem tocar em tipos JavaScript.
-Os testes de integração WASM em Chrome headless testam a superfície completa
-do &lt;code&gt;#[wasm_bindgen]&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Isolamento em Web Worker&lt;&#x2F;strong&gt;: operações criptográficas (especialmente BLAKE3
-sobre arquivos de mídia grandes) podem levar centenas de milissegundos. Rodar
-em um Worker previne travamentos na UI. O protocolo de progresso com streaming
-(&lt;code&gt;{ type: &quot;progress&quot;, current, total, file }&lt;&#x2F;code&gt;) permite que a UI mostre uma
-barra de progresso durante a verificação de tesseras com muitos arquivos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Transferência zero-copy&lt;&#x2F;strong&gt;: &lt;code&gt;archive.buffer&lt;&#x2F;code&gt; é transferido para o Worker, não
-copiado. Para um arquivo tessera de 50 MB, isso evita dobrar o uso de memória
-durante a verificação.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;MANIFEST em texto plano, não MessagePack&lt;&#x2F;strong&gt;: o crate WASM parseia o mesmo
-formato de MANIFEST em texto plano que o CLI. Isso é por design — o MANIFEST é
-a Pedra de Rosetta da tessera, legível por qualquer pessoa com um editor de
-texto. A dependência &lt;code&gt;rmp-serde&lt;&#x2F;code&gt; no Cargo.toml não é usada e será removida.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4: Resiliência e Escala&lt;&#x2F;strong&gt; — Empacotamento para sistemas operacionais
-(Alpine, Arch, Debian, FreeBSD, OpenBSD), CI no SourceHut e GitHub Actions,
-auditorias de segurança, explorador de tesseras no navegador em tesseras.net
-usando @tesseras&#x2F;verify&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — Navegador público de tesseras por
-era&#x2F;localização&#x2F;tema&#x2F;idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;A verificação não exige mais confiança em software. Um arquivo tessera arrastado
-para um navegador é verificado com o mesmo rigor criptográfico do CLI — mesmos
-hashes BLAKE3, mesmas assinaturas Ed25519, mesmo parser de MANIFEST. A diferença
-é que agora qualquer pessoa pode fazer isso.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Furando NATs</title>
- <published>2026-02-15T18:00:00+00:00</published>
- <updated>2026-02-15T18:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-nat-traversal/"/>
- <id>https://tesseras.net/pt-br/news/phase4-nat-traversal/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-nat-traversal/">&lt;p&gt;A maioria dos dispositivos das pessoas ficam atras de um NAT — um tradutor de
-enderecos de rede que permite acessar a internet mas impede conexoes de entrada.
-Para uma rede P2P, isso e um problema existencial: se dois nos atras de NATs nao
-conseguem se comunicar, a rede se fragmenta. A Fase 4 continua com uma pilha
-completa de travessia de NAT: descoberta via STUN, hole punching coordenado e
-fallback por relay.&lt;&#x2F;p&gt;
-&lt;p&gt;A abordagem segue o mesmo padrao da maioria dos sistemas P2P consolidados
-(WebRTC, BitTorrent, IPFS): tente a opcao mais barata primeiro, escale apenas
-quando necessario. Conectividade direta nao custa nada. Hole punching custa
-alguns pacotes coordenados. Relay custa largura de banda sustentada de um
-terceiro. Tesseras tenta nessa ordem.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construido&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Classificacao NatType&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;network.rs&lt;&#x2F;code&gt;) — Um novo enum
-&lt;code&gt;NatType&lt;&#x2F;code&gt; (Public, Cone, Symmetric, Unknown) adicionado a camada de dominio
-core. Esse tipo e compartilhado por toda a pilha: o cliente STUN o escreve, o
-DHT o divulga em mensagens Pong, e o coordenador de punch o le para decidir se
-hole punching vale a pena tentar (Cone-para-Cone funciona ~80% das vezes;
-Symmetric-para-Symmetric quase nunca funciona).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Cliente STUN&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;stun.rs&lt;&#x2F;code&gt;) — Uma implementacao STUN minima
-(RFC 5389 Binding Request&#x2F;Response) que descobre o endereco externo de um no. O
-codec codifica requisicoes de 20 bytes com um ID de transacao aleatorio e
-decodifica respostas XOR-MAPPED-ADDRESS. A funcao &lt;code&gt;discover_nat()&lt;&#x2F;code&gt; consulta
-multiplos servidores STUN em paralelo (Google, Cloudflare por padrao), compara
-os enderecos mapeados e classifica o tipo de NAT:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Mesmo IP e porta de todos os servidores → &lt;strong&gt;Public&lt;&#x2F;strong&gt; (sem NAT)&lt;&#x2F;li&gt;
-&lt;li&gt;Mesmo endereco mapeado de todos os servidores → &lt;strong&gt;Cone&lt;&#x2F;strong&gt; (hole punching
-funciona)&lt;&#x2F;li&gt;
-&lt;li&gt;Enderecos mapeados diferentes → &lt;strong&gt;Symmetric&lt;&#x2F;strong&gt; (hole punching nao confiavel)&lt;&#x2F;li&gt;
-&lt;li&gt;Sem respostas → &lt;strong&gt;Unknown&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Retentativas com backoff exponencial e timeouts configuraveis. 12 testes
-cobrindo roundtrips de codec, todos os caminhos de classificacao e consultas
-async em loopback.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Coordenacao de punch assinada&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;punch.rs&lt;&#x2F;code&gt;) — Assinatura e
-verificacao Ed25519 para mensagens &lt;code&gt;PunchIntro&lt;&#x2F;code&gt;, &lt;code&gt;RelayRequest&lt;&#x2F;code&gt; e
-&lt;code&gt;RelayMigrate&lt;&#x2F;code&gt;. Cada introducao e assinada pelo iniciador com uma janela de
-timestamp de 30 segundos, prevenindo ataques de reflexao (onde um atacante
-reproduz uma introducao antiga para redirecionar trafego). O formato do payload
-e &lt;code&gt;target || external_addr || timestamp&lt;&#x2F;code&gt; — alterar qualquer campo invalida a
-assinatura. 6 testes unitarios mais 3 testes baseados em propriedades com
-proptest (IDs de no, portas e tokens de sessao arbitrarios).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Gerenciador de sessoes de relay&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;relay.rs&lt;&#x2F;code&gt;) — Gerencia
-sessoes de relay UDP transparente entre nos com NAT. Cada sessao tem um token
-aleatorio de 16 bytes; os nos prefixam seus pacotes com o token, o relay remove
-e encaminha. Funcionalidades:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Encaminhamento bidirecional (A→R→B e B→R→A)&lt;&#x2F;li&gt;
-&lt;li&gt;Limite de taxa: 256 KB&#x2F;s para nos reciprocos, 64 KB&#x2F;s para nao reciprocos&lt;&#x2F;li&gt;
-&lt;li&gt;Duracao maxima de 10 minutos para sessoes bootstrap (nao reciprocas)&lt;&#x2F;li&gt;
-&lt;li&gt;Migracao de endereco: quando o IP de um no muda (Wi-Fi para celular), um
-&lt;code&gt;RelayMigrate&lt;&#x2F;code&gt; assinado atualiza a sessao sem derruba-la&lt;&#x2F;li&gt;
-&lt;li&gt;Limpeza por inatividade com timeout configuravel&lt;&#x2F;li&gt;
-&lt;li&gt;8 testes unitarios mais 2 testes baseados em propriedades&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Extensoes de mensagens DHT&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;message.rs&lt;&#x2F;code&gt;) — Sete novas
-variantes de mensagem adicionadas ao protocolo DHT:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Mensagem&lt;&#x2F;th&gt;&lt;th&gt;Proposito&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchIntro&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&quot;Quero conectar ao no X, aqui esta meu endereco externo assinado&quot;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchRequest&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;O introdutor encaminha a requisicao ao destino&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchReady&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;O destino confirma prontidao, envia seu endereco externo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayRequest&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&quot;Crie uma sessao de relay para o no X&quot;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayOffer&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;O relay responde com seu endereco e token de sessao&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayClose&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Encerrar uma sessao de relay&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayMigrate&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Atualizar sessao apos mudanca de rede&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;A mensagem &lt;code&gt;Pong&lt;&#x2F;code&gt; foi estendida com metadados NAT: &lt;code&gt;nat_type&lt;&#x2F;code&gt;,
-&lt;code&gt;relay_slots_available&lt;&#x2F;code&gt; e &lt;code&gt;relay_bandwidth_used_kbps&lt;&#x2F;code&gt;. Todos os novos campos
-usam &lt;code&gt;#[serde(default)]&lt;&#x2F;code&gt; para compatibilidade retroativa — nos antigos ignoram o
-que nao reconhecem, nos novos usam defaults. 9 novos testes de roundtrip de
-serializacao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Trait NatHandler e dispatch&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;engine.rs&lt;&#x2F;code&gt;) — Uma nova trait
-async &lt;code&gt;NatHandler&lt;&#x2F;code&gt; (5 metodos) injetada no engine DHT, seguindo o mesmo padrao
-de injecao de dependencia do &lt;code&gt;ReplicationHandler&lt;&#x2F;code&gt; existente. O loop de dispatch
-de mensagens do engine agora roteia todas as mensagens punch&#x2F;relay para o
-handler. Isso mantem o engine DHT agnóstico ao protocolo enquanto permite que a
-logica de travessia de NAT viva em &lt;code&gt;tesseras-net&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Tipos de reconexao mobile&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-embedded&#x2F;src&#x2F;reconnect.rs&lt;&#x2F;code&gt;) — Uma
-maquina de estados de reconexao em tres fases para dispositivos moveis:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;QuicMigration&lt;&#x2F;strong&gt; (0-2s) — tenta migracao de conexao QUIC para todos os peers
-ativos&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ReStun&lt;&#x2F;strong&gt; (2-5s) — redescobre endereco externo via STUN&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ReEstablish&lt;&#x2F;strong&gt; (5-10s) — reconecta peers que a migracao nao conseguiu salvar&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;Peers sao reconectados em ordem de prioridade: nos bootstrap primeiro, depois
-nos que guardam nossos fragmentos, depois nos cujos fragmentos guardamos, depois
-vizinhos DHT gerais. Uma nova variante de evento &lt;code&gt;NetworkChanged&lt;&#x2F;code&gt; foi adicionada
-ao stream de eventos FFI para que o app Flutter possa mostrar progresso de
-reconexao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Configuracao NAT do daemon&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;) — Uma nova secao &lt;code&gt;[nat]&lt;&#x2F;code&gt;
-na configuracao TOML com lista de servidores STUN, toggle de relay, maximo de
-sessoes relay, limites de largura de banda (reciproco vs bootstrap) e timeout de
-inatividade. Todos os campos tem defaults sensiveis; relay e desabilitado por
-padrao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Metricas Prometheus&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — 16 metricas em quatro
-subsistemas:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;STUN&lt;&#x2F;strong&gt;: requisicoes, falhas, histograma de latencia&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Punch&lt;&#x2F;strong&gt;: tentativas&#x2F;sucessos&#x2F;falhas (por par de tipo NAT), histograma de
-latencia&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Relay&lt;&#x2F;strong&gt;: sessoes ativas, sessoes totais, bytes encaminhados, timeouts por
-inatividade, hits de rate limit&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reconexao&lt;&#x2F;strong&gt;: mudancas de rede, tentativas&#x2F;sucessos por fase, histograma de
-duracao&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;6 testes verificando registro, incremento, cardinalidade de labels e deteccao de
-registro duplo.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes de integracao&lt;&#x2F;strong&gt; — Dois testes end-to-end usando &lt;code&gt;MemTransport&lt;&#x2F;code&gt; (rede
-simulada em memoria):&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;punch_integration.rs&lt;&#x2F;code&gt; — Fluxo completo de hole-punch com 3 nos: A envia
-&lt;code&gt;PunchIntro&lt;&#x2F;code&gt; assinado ao introdutor I, I verifica e encaminha &lt;code&gt;PunchRequest&lt;&#x2F;code&gt; a
-B, B verifica a assinatura original e envia &lt;code&gt;PunchReady&lt;&#x2F;code&gt; de volta, A e B
-trocam mensagens diretamente. Tambem testa que uma assinatura invalida e
-corretamente rejeitada.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;relay_integration.rs&lt;&#x2F;code&gt; — Fluxo completo de relay com 3 nos: A solicita relay
-de R, R cria sessao e envia &lt;code&gt;RelayOffer&lt;&#x2F;code&gt; a ambos os peers, A e B trocam
-pacotes prefixados com token atraves de R, A migra para um novo endereco no
-meio da sessao, A fecha a sessao, e o teste verifica que a sessao e encerrada
-e encaminhamento posterior falha.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Testes de propriedade&lt;&#x2F;strong&gt; — 7 testes baseados em proptest cobrindo: roundtrips
-de assinatura para todos os tres tipos de mensagem assinada (IDs de no, portas e
-tokens arbitrarios), determinismo de classificacao NAT (mesmas entradas sempre
-produzem mesma saida), validade de binding request STUN, unicidade de tokens de
-sessao, e rejeicao de pacotes curtos pelo relay.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Alvos Justfile&lt;&#x2F;strong&gt; — &lt;code&gt;just test-nat&lt;&#x2F;code&gt; executa todos os testes de travessia NAT em
-&lt;code&gt;tesseras-net&lt;&#x2F;code&gt; e &lt;code&gt;tesseras-dht&lt;&#x2F;code&gt;. &lt;code&gt;just test-chaos&lt;&#x2F;code&gt; e um placeholder para futuros
-testes de caos com Docker Compose e &lt;code&gt;tc netem&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisoes de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;STUN ao inves de TURN&lt;&#x2F;strong&gt;: implementamos STUN (descoberta) e relay customizado
-ao inves de TURN completo. TURN requer alocacao autenticada e foi projetado
-para relay de midia; nosso relay e mais simples — encaminhamento UDP com
-prefixo de token e limites de taxa. Isso mantem o protocolo minimo e evita
-depender de servidores TURN externos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Assinaturas em introducoes&lt;&#x2F;strong&gt;: cada &lt;code&gt;PunchIntro&lt;&#x2F;code&gt; e assinado pelo iniciador.
-Sem isso, um atacante poderia enviar introducoes forjadas para redirecionar as
-tentativas de hole-punch de um no para um endereco controlado pelo atacante
-(ataque de reflexao). A janela de timestamp de 30 segundos limita replay.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Tiers reciprocos de largura de banda&lt;&#x2F;strong&gt;: nos relay dao 4x mais largura de
-banda (256 vs 64 KB&#x2F;s) para peers com boas pontuacoes de reciprocidade. Isso
-incentiva nos a armazenar fragmentos para outros — se voce contribui, recebe
-melhor servico de relay quando precisa.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Extensao Pong retrocompativel&lt;&#x2F;strong&gt;: novos campos NAT em &lt;code&gt;Pong&lt;&#x2F;code&gt; usam
-&lt;code&gt;#[serde(default)]&lt;&#x2F;code&gt; e &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;. Nos antigos que nao entendem esses campos
-simplesmente os pulam durante deserializacao. Nenhum bump de versao de
-protocolo necessario.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;NatHandler como trait async&lt;&#x2F;strong&gt;: a logica de travessia NAT e injetada no
-engine DHT via trait, assim como &lt;code&gt;ReplicationHandler&lt;&#x2F;code&gt;. Isso mantem o engine
-DHT focado em roteamento e gerenciamento de peers, e permite que a
-implementacao NAT seja trocada ou desabilitada sem tocar no codigo core do
-DHT.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuacao&lt;&#x2F;strong&gt; — tuning de performance (pooling de conexoes, cache de
-fragmentos, SQLite WAL), auditorias de seguranca, onboarding de nos
-institucionais, empacotamento para OS&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploracao e Cultura&lt;&#x2F;strong&gt; — navegador publico de tesseras por
-era&#x2F;localizacao&#x2F;tema&#x2F;idioma, curadoria institucional, integracao genealogica,
-exportacao para midia fisica (M-DISC, microfilme, papel livre de acido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Com travessia de NAT, Tesseras pode conectar nos independentemente de sua
-topologia de rede. Nos publicos conversam diretamente. Nos com NAT Cone furam
-com ajuda de um introdutor. Nos com NAT Symmetric ou firewalled usam relay
-atraves de peers voluntarios. A rede se adapta ao mundo real, onde a maioria dos
-dispositivos esta atras de um NAT e as condicoes de rede mudam constantemente.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>CLI Encontra a Rede: Comandos Publish, Fetch e Status</title>
- <published>2026-02-15T00:00:00+00:00</published>
- <updated>2026-02-15T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/cli-daemon-rpc/"/>
- <id>https://tesseras.net/pt-br/news/cli-daemon-rpc/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/cli-daemon-rpc/">&lt;p&gt;Até agora o CLI operava isoladamente: criar uma tessera, verificar, exportar,
-listar o que você tem. Tudo ficava na sua máquina. Com esta atualização, o &lt;code&gt;tes&lt;&#x2F;code&gt;
-ganha três comandos que fazem a ponte entre o armazenamento local e a rede P2P —
-&lt;code&gt;publish&lt;&#x2F;code&gt;, &lt;code&gt;fetch&lt;&#x2F;code&gt; e &lt;code&gt;status&lt;&#x2F;code&gt; — comunicando-se com um &lt;code&gt;tesd&lt;&#x2F;code&gt; em execução através
-de um socket Unix.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Crate &lt;code&gt;tesseras-rpc&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Um novo crate compartilhado entre CLI e daemon.
-Define o protocolo RPC usando serialização MessagePack com enquadramento
-prefixado por tamanho (cabeçalho big-endian de 4 bytes, máximo de 64 MiB). Três
-tipos de requisição (&lt;code&gt;Publish&lt;&#x2F;code&gt;, &lt;code&gt;Fetch&lt;&#x2F;code&gt;, &lt;code&gt;Status&lt;&#x2F;code&gt;) e suas respostas
-correspondentes. Um &lt;code&gt;DaemonClient&lt;&#x2F;code&gt; síncrono gerencia a conexão do socket Unix
-com timeouts configuráveis. O protocolo é deliberadamente simples — uma
-requisição, uma resposta, conexão fechada — para manter a implementação
-auditável.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes publish &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Publica uma tessera na rede. Aceita hashes completos
-ou prefixos curtos (ex.: &lt;code&gt;tes publish a1b2&lt;&#x2F;code&gt;), que são resolvidos no banco de
-dados local. O daemon lê todos os arquivos da tessera do armazenamento, empacota
-em um único buffer MessagePack e entrega ao motor de replicação. Tesseras
-pequenas (&amp;lt; 4 MB) são replicadas como um único fragmento; maiores passam por
-codificação de apagamento Reed-Solomon. A saída mostra o hash curto e a contagem
-de fragmentos:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;Published tessera 9f2c4a1b (24 fragments created)
-Distribution in progress — use `tes status 9f2c4a1b` to track.
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes fetch &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Busca uma tessera da rede usando o hash de conteúdo
-completo. O daemon coleta fragmentos disponíveis localmente, reconstrói os dados
-originais via decodificação de apagamento se necessário, desempacota os arquivos
-e armazena no CAS (content-addressable store). Retorna o número de memórias e o
-tamanho total buscado.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes status &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Exibe a saúde de replicação de uma tessera. A saída
-mapeia diretamente o modelo interno de saúde do motor de replicação:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Estado&lt;&#x2F;th&gt;&lt;th&gt;Significado&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;Local&lt;&#x2F;td&gt;&lt;td&gt;Ainda não publicada — existe apenas na sua máquina&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Publishing&lt;&#x2F;td&gt;&lt;td&gt;Fragmentos sendo distribuídos, redundância crítica&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Replicated&lt;&#x2F;td&gt;&lt;td&gt;Distribuída, mas abaixo da redundância alvo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Healthy&lt;&#x2F;td&gt;&lt;td&gt;Redundância completa alcançada&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;&lt;strong&gt;Listener RPC no daemon&lt;&#x2F;strong&gt; — O daemon agora escuta em um socket Unix (padrão:
-&lt;code&gt;$XDG_RUNTIME_DIR&#x2F;tesseras&#x2F;daemon.sock&lt;&#x2F;code&gt;) com permissões de diretório adequadas
-(0700), limpeza de sockets obsoletos e shutdown gracioso. Cada conexão é tratada
-em uma task Tokio — o listener converte o stream assíncrono para I&#x2F;O síncrono
-para a camada de enquadramento, despacha para o handler RPC e escreve a resposta
-de volta.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Pack&#x2F;unpack no &lt;code&gt;tesseras-core&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Um módulo pequeno que serializa uma lista
-de entradas de arquivo (caminho + dados) em um único buffer MessagePack e
-vice-versa. Esta é a ponte entre a estrutura de diretórios da tessera e os blobs
-opacos do motor de replicação.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Socket Unix ao invés de TCP&lt;&#x2F;strong&gt;: a comunicação RPC entre CLI e daemon acontece
-na mesma máquina. Sockets Unix são mais rápidos, não precisam de alocação de
-porta, e as permissões do sistema de arquivos fornecem controle de acesso sem
-TLS.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;MessagePack ao invés de JSON&lt;&#x2F;strong&gt;: o mesmo formato wire usado em todo o
-Tesseras. Compacto, sem schema, e já é uma dependência do workspace. Uma
-ida-e-volta típica de publish request&#x2F;response ocupa menos de 200 bytes.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Cliente síncrono, daemon assíncrono&lt;&#x2F;strong&gt;: o &lt;code&gt;DaemonClient&lt;&#x2F;code&gt; usa I&#x2F;O bloqueante
-porque o CLI não precisa de concorrência — envia uma requisição e espera. O
-listener do daemon é assíncrono (Tokio) para tratar múltiplas conexões. A
-camada de enquadramento funciona com qualquer impl &lt;code&gt;Read&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Write&lt;&#x2F;code&gt;, conectando
-ambos os mundos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Resolução de prefixo no lado do cliente&lt;&#x2F;strong&gt;: &lt;code&gt;publish&lt;&#x2F;code&gt; e &lt;code&gt;status&lt;&#x2F;code&gt; resolvem
-prefixos curtos localmente antes de enviar o hash completo ao daemon. Isso
-mantém o daemon stateless — ele não precisa acessar o banco de dados do CLI.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Alinhamento do diretório de dados padrão&lt;&#x2F;strong&gt;: o padrão do CLI mudou de
-&lt;code&gt;~&#x2F;.tesseras&lt;&#x2F;code&gt; para &lt;code&gt;~&#x2F;.local&#x2F;share&#x2F;tesseras&lt;&#x2F;code&gt; (via &lt;code&gt;dirs::data_dir()&lt;&#x2F;code&gt;) para
-coincidir com o daemon. Um aviso de migração é exibido quando dados no caminho
-antigo são detectados.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;proximos-passos&quot;&gt;Próximos passos&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Contagem de peers no DHT&lt;&#x2F;strong&gt;: o comando &lt;code&gt;status&lt;&#x2F;code&gt; atualmente reporta 0 peers —
-conectar a contagem real do DHT é o próximo passo&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;&lt;code&gt;tes show&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: exibir o conteúdo de uma tessera (memórias, metadados) sem
-exportar&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fetch com streaming&lt;&#x2F;strong&gt;: para tesseras grandes, transmitir fragmentos conforme
-chegam ao invés de esperar por todos&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Recuperação de Chaves por Herdeiros com Shamir&#x27;s Secret Sharing</title>
- <published>2026-02-15T00:00:00+00:00</published>
- <updated>2026-02-15T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-shamir-heir-recovery/"/>
- <id>https://tesseras.net/pt-br/news/phase4-shamir-heir-recovery/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-shamir-heir-recovery/">&lt;p&gt;O que acontece com suas memórias quando você morre? Até agora, Tesseras
-conseguia preservar conteúdo ao longo de milênios — mas as chaves privadas e
-seladas morriam com o dono. A Fase 4 continua com uma solução: Shamir&#x27;s Secret
-Sharing, um esquema criptográfico que permite dividir sua identidade em
-fragmentos e distribuí-los para as pessoas em quem você mais confia.&lt;&#x2F;p&gt;
-&lt;p&gt;A matemática é elegante: você escolhe um limiar T e um total N. Qualquer T
-fragmentos reconstroem o segredo completo; T-1 fragmentos não revelam
-absolutamente nada. Isso não é &quot;quase nada&quot; — é informação-teoricamente seguro.
-Um atacante com um fragmento a menos que o limiar tem exatamente zero bits de
-informação sobre o segredo, independentemente do poder computacional que tenha.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Aritmética de corpo finito GF(256)&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;shamir&#x2F;gf256.rs&lt;&#x2F;code&gt;) —
-Shamir&#x27;s Secret Sharing requer aritmética em um corpo finito. Implementamos
-GF(256) usando o mesmo polinômio irredutível do AES (x^8 + x^4 + x^3 + x + 1),
-com tabelas de lookup para logaritmo e exponenciação computadas em tempo de
-compilação. Todas as operações são em tempo constante via consulta a tabelas —
-sem ramificações baseadas em dados secretos. O módulo inclui o método de Horner
-para avaliação de polinômios e interpolação de Lagrange em x=0 para recuperação
-do segredo. 233 linhas, exaustivamente testado: todos os 256 elementos para
-propriedades de identidade&#x2F;inverso, comutatividade e associatividade.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;ShamirSplitter&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;shamir&#x2F;mod.rs&lt;&#x2F;code&gt;) — A API principal de
-split&#x2F;reconstruct. &lt;code&gt;split()&lt;&#x2F;code&gt; recebe uma fatia de bytes do segredo, uma
-configuração (limiar T, total N) e a chave pública Ed25519 do dono. Para cada
-byte do segredo, constrói um polinômio aleatório de grau T-1 sobre GF(256) com o
-byte do segredo como termo constante, e então o avalia em N pontos distintos.
-&lt;code&gt;reconstruct()&lt;&#x2F;code&gt; recebe T ou mais fragmentos e recupera o segredo via
-interpolação de Lagrange. Ambas as operações incluem validação extensiva:
-limites do limiar, consistência de sessão, correspondência de impressão digital
-do dono e verificação de checksum BLAKE3.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Formato HeirShare&lt;&#x2F;strong&gt; — Cada fragmento é um artefato autocontido e serializável
-com:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Versão do formato (v1) para compatibilidade futura&lt;&#x2F;li&gt;
-&lt;li&gt;Índice do fragmento (1..N) e metadados de limiar&#x2F;total&lt;&#x2F;li&gt;
-&lt;li&gt;ID de sessão (8 bytes aleatórios) — impede mistura de fragmentos de sessões
-diferentes&lt;&#x2F;li&gt;
-&lt;li&gt;Impressão digital do dono (primeiros 8 bytes do hash BLAKE3 da chave pública
-Ed25519)&lt;&#x2F;li&gt;
-&lt;li&gt;Dados do fragmento (os y-values de Shamir, mesmo comprimento do segredo)&lt;&#x2F;li&gt;
-&lt;li&gt;Checksum BLAKE3 sobre todos os campos anteriores&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Os fragmentos são serializados em dois formatos: &lt;strong&gt;MessagePack&lt;&#x2F;strong&gt; (binário
-compacto, para uso programático) e &lt;strong&gt;texto base64&lt;&#x2F;strong&gt; (legível por humanos, para
-impressão e armazenamento físico). O formato texto inclui um cabeçalho com
-metadados e delimitadores:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;--- TESSERAS HEIR SHARE ---
-Format: v1
-Owner: a1b2c3d4e5f6a7b8 (fingerprint)
-Share: 1 of 3 (threshold: 2)
-Session: 9f8e7d6c5b4a3210
-Created: 2026-02-15
-
-&amp;lt;dados MessagePack codificados em base64&amp;gt;
---- END HEIR SHARE ---
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Este formato é projetado para ser impresso em papel, armazenado em um cofre
-bancário ou gravado em metal. O cabeçalho é informacional — apenas o payload
-base64 é analisado durante a reconstrução.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Integração com CLI&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;commands&#x2F;heir.rs&lt;&#x2F;code&gt;) — Três novos
-subcomandos:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;tes heir create&lt;&#x2F;code&gt; — divide sua identidade Ed25519 em fragmentos de herdeiros.
-Solicita confirmação (sua identidade completa está em jogo), gera arquivos
-&lt;code&gt;.bin&lt;&#x2F;code&gt; e &lt;code&gt;.txt&lt;&#x2F;code&gt; para cada fragmento e escreve &lt;code&gt;heir_meta.json&lt;&#x2F;code&gt; no diretório de
-identidade.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tes heir reconstruct&lt;&#x2F;code&gt; — carrega arquivos de fragmentos (detecta
-automaticamente formato binário vs texto), valida consistência, reconstrói o
-segredo, deriva o par de chaves Ed25519 e opcionalmente o instala em
-&lt;code&gt;~&#x2F;.tesseras&#x2F;identity&#x2F;&lt;&#x2F;code&gt; (com backup automático da identidade existente).&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tes heir info&lt;&#x2F;code&gt; — exibe metadados do fragmento e verifica o checksum sem expor
-nenhum material secreto.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Formato do blob secreto&lt;&#x2F;strong&gt; — As chaves de identidade são serializadas em um
-blob versionado antes da divisão: um byte de versão (0x01), um byte de flags
-(0x00 para somente Ed25519), seguido da chave secreta Ed25519 de 32 bytes. Isso
-deixa espaço para expansão futura quando as chaves privadas X25519 e ML-KEM-768
-forem integradas ao sistema de fragmentos de herdeiros.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 20 testes unitários para ShamirSplitter (roundtrip, todas as
-combinações de fragmentos, fragmentos insuficientes, dono errado, sessão errada,
-limite threshold-1, segredos grandes até o tamanho de chave ML-KEM-768). 7
-testes unitários para aritmética GF(256) (propriedades de campo exaustivas). 3
-testes baseados em propriedades com proptest (segredos arbitrários até 5000
-bytes, configurações T-de-N arbitrárias, verificação de segurança
-informação-teórica). Testes de roundtrip de serialização para ambos os formatos
-MessagePack e texto base64. 2 testes de integração cobrindo o ciclo de vida
-completo de herdeiros: gerar identidade, dividir em fragmentos, serializar,
-desserializar, reconstruir, verificar par de chaves e assinar&#x2F;verificar com
-chaves reconstruídas.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;GF(256) ao invés de GF(primo)&lt;&#x2F;strong&gt;: usamos GF(256) ao invés de um corpo primo
-porque ele mapeia naturalmente para bytes — cada elemento é um único byte,
-cada fragmento tem o mesmo comprimento do segredo. Sem aritmética de inteiros
-grandes, sem redução modular, sem padding. Esta é a mesma abordagem usada pela
-maioria das implementações reais de Shamir, incluindo SSSS e Hashicorp Vault.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Tabelas de lookup em tempo de compilação&lt;&#x2F;strong&gt;: as tabelas LOG e EXP para
-GF(256) são computadas em tempo de compilação usando &lt;code&gt;const fn&lt;&#x2F;code&gt;. Isso
-significa zero custo de inicialização em tempo de execução e operações em
-tempo constante via consulta a tabelas ao invés de loops.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ID de sessão previne mistura entre sessões&lt;&#x2F;strong&gt;: cada chamada a &lt;code&gt;split()&lt;&#x2F;code&gt; gera
-um novo ID de sessão aleatório. Se um herdeiro acidentalmente usar fragmentos
-de duas sessões diferentes de divisão (por exemplo, antes e depois de uma
-rotação de chaves), a reconstrução falha de forma limpa com um erro de
-validação ao invés de produzir dados corrompidos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Checksums BLAKE3 detectam corrupção&lt;&#x2F;strong&gt;: cada fragmento inclui um checksum
-BLAKE3 sobre seu conteúdo. Isso captura degradação de bits, erros de
-transmissão e truncamento acidental antes de qualquer tentativa de
-reconstrução. Um fragmento impresso em papel e escaneado via OCR vai falhar no
-checksum se um único caractere estiver errado.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Impressão digital do dono para identificação&lt;&#x2F;strong&gt;: os fragmentos incluem os
-primeiros 8 bytes de BLAKE3(chave pública Ed25519) como impressão digital.
-Isso permite aos herdeiros verificar a qual identidade um fragmento pertence
-sem revelar a chave pública completa. Durante a reconstrução, a impressão
-digital é verificada contra a chave recuperada.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Formato duplo para resiliência&lt;&#x2F;strong&gt;: ambos os formatos binário (MessagePack) e
-texto (base64) são gerados porque mídias físicas têm modos de falha diferentes
-de armazenamento digital. Um pendrive pode falhar; papel sobrevive. Um QR code
-pode ficar ilegível; texto base64 pode ser digitado manualmente.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Versionamento do blob&lt;&#x2F;strong&gt;: o segredo é envolvido em um blob versionado
-(versão + flags + material de chave) para que versões futuras possam incluir
-chaves adicionais (X25519, ML-KEM-768) sem quebrar compatibilidade com
-fragmentos existentes.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuada: Resiliência e Escala&lt;&#x2F;strong&gt; — NAT traversal avançado
-(STUN&#x2F;TURN), ajuste de performance (pool de conexões, cache de fragmentos,
-SQLite WAL), auditorias de segurança, integração de nós institucionais,
-empacotamento para sistemas operacionais&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — navegador público de tesseras por
-era&#x2F;localização&#x2F;tema&#x2F;idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Com Shamir&#x27;s Secret Sharing, Tesseras fecha a última lacuna crítica na
-preservação a longo prazo. Suas memórias sobrevivem a falhas de infraestrutura
-através de erasure coding. Sua privacidade sobrevive a computadores quânticos
-através de criptografia híbrida. E agora, sua identidade sobrevive a você —
-passada adiante para as pessoas que você escolheu, exigindo a cooperação delas
-para desbloquear o que você deixou para trás.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Criptografia e Tesseras Seladas</title>
- <published>2026-02-14T16:00:00+00:00</published>
- <updated>2026-02-14T16:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-encryption-sealed/"/>
- <id>https://tesseras.net/pt-br/news/phase4-encryption-sealed/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-encryption-sealed/">&lt;p&gt;Algumas memórias não são para todos. Um diário privado, uma carta para ser
-aberta em 2050, um segredo de família selado até que os netos tenham idade
-suficiente. Até agora, toda tessera na rede era aberta. A Fase 4 muda isso:
-Tesseras agora criptografa conteúdo privado e selado com um esquema
-criptográfico híbrido projetado para resistir tanto a ataques clássicos quanto
-quânticos.&lt;&#x2F;p&gt;
-&lt;p&gt;O princípio continua o mesmo — criptografar o mínimo possível. Memórias públicas
-precisam de disponibilidade, não de sigilo. Mas quando alguém cria uma tessera
-privada ou selada, o conteúdo agora é trancado por criptografia AES-256-GCM com
-chaves protegidas por um mecanismo híbrido de encapsulamento de chaves
-combinando X25519 e ML-KEM-768. Ambos os algoritmos precisam ser quebrados para
-acessar o conteúdo.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Encriptador AES-256-GCM&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;encryption.rs&lt;&#x2F;code&gt;) — Criptografia
-simétrica de conteúdo com nonces aleatórios de 12 bytes e dados autenticados
-associados (AAD). O AAD vincula o texto cifrado ao seu contexto: para tesseras
-privadas, o hash do conteúdo é incluído; para tesseras seladas, tanto o hash do
-conteúdo quanto o timestamp &lt;code&gt;open_after&lt;&#x2F;code&gt; são vinculados no AAD. Isso significa
-que mover texto cifrado entre tesseras com datas de abertura diferentes causa
-falha na decriptação — você não consegue enganar o sistema para abrir uma
-memória selada antecipadamente trocando o texto cifrado para uma tessera com uma
-data de selo anterior.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Mecanismo Híbrido de Encapsulamento de Chaves&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;kem.rs&lt;&#x2F;code&gt;)
-— Troca de chaves usando X25519 (Diffie-Hellman clássico em curva elíptica)
-combinado com ML-KEM-768 (o KEM pós-quântico baseado em reticulados padronizado
-pelo NIST, anteriormente Kyber). Ambos os segredos compartilhados são combinados
-via &lt;code&gt;blake3::derive_key&lt;&#x2F;code&gt; com uma string de contexto fixa (&quot;tesseras hybrid kem
-v1&quot;) para produzir uma única chave de criptografia de conteúdo de 256 bits. Isso
-segue a mesma filosofia &quot;dual desde o início&quot; das assinaturas duplas do projeto
-(Ed25519 + ML-DSA): se qualquer algoritmo for quebrado no futuro, o outro ainda
-protege o conteúdo.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Envelope de Chave Selada&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;sealed.rs&lt;&#x2F;code&gt;) — Encapsula uma
-chave de criptografia de conteúdo usando o KEM híbrido, para que apenas o dono
-da tessera possa recuperá-la. O KEM produz uma chave de transporte, que é XORed
-com a chave de conteúdo para produzir uma chave encapsulada armazenada junto ao
-texto cifrado do KEM. Ao desselar, o dono decapsula o texto cifrado do KEM para
-recuperar a chave de transporte, depois faz XOR novamente para recuperar a chave
-de conteúdo.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Publicação de Chave&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;sealed.rs&lt;&#x2F;code&gt;) — Um artefato assinado
-independente para publicar a chave de conteúdo de uma tessera selada após a data
-&lt;code&gt;open_after&lt;&#x2F;code&gt; ter passado. O dono assina a chave de conteúdo, o hash da tessera e
-o timestamp de publicação com suas chaves duais (Ed25519, com placeholder
-ML-DSA). O manifesto permanece imutável — a publicação da chave é um documento
-separado. Outros nós verificam a assinatura contra a chave pública do dono antes
-de usar a chave publicada para decriptar o conteúdo.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;EncryptionContext&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;enums.rs&lt;&#x2F;code&gt;) — Um tipo de domínio que
-representa o contexto AAD para criptografia. Ele vive em tesseras-core e não em
-tesseras-crypto porque é um conceito de domínio (não um detalhe de implementação
-criptográfica). O método &lt;code&gt;to_aad_bytes()&lt;&#x2F;code&gt; produz serialização determinística: um
-byte de tag (0x00 para Private, 0x01 para Sealed), seguido do hash de conteúdo
-e, para Sealed, o timestamp &lt;code&gt;open_after&lt;&#x2F;code&gt; como i64 little-endian.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Validação de domínio&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) —
-&lt;code&gt;TesseraService::create()&lt;&#x2F;code&gt; agora rejeita tesseras Sealed e Private que não
-fornecem chaves de criptografia. Esta é uma validação no nível de domínio: a
-camada de serviço garante que você não pode criar uma memória selada sem a
-maquinaria criptográfica para protegê-la. A mensagem de erro é clara: &quot;missing
-encryption keys for visibility sealed until 2050-01-01.&quot;&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Atualizações de tipos do core&lt;&#x2F;strong&gt; — &lt;code&gt;TesseraIdentity&lt;&#x2F;code&gt; agora inclui um campo
-opcional &lt;code&gt;encryption_public: Option&amp;lt;HybridEncryptionPublic&amp;gt;&lt;&#x2F;code&gt; contendo tanto as
-chaves públicas X25519 quanto ML-KEM-768. &lt;code&gt;KeyAlgorithm&lt;&#x2F;code&gt; ganhou as variantes
-&lt;code&gt;X25519&lt;&#x2F;code&gt; e &lt;code&gt;MlKem768&lt;&#x2F;code&gt;. O layout do sistema de arquivos de identidade agora
-suporta &lt;code&gt;node.x25519.key&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.pub&lt;&#x2F;code&gt; e &lt;code&gt;node.mlkem768.key&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.pub&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 8 testes unitários para AES-256-GCM (roundtrip, chave errada, texto
-cifrado adulterado, AAD errado, falha de decriptação cross-context, nonces
-únicos, mais 2 testes baseados em propriedades para payloads arbitrários e
-unicidade de nonces). 5 testes unitários para HybridKem (roundtrip, par de
-chaves errado, X25519 adulterado, determinismo do KDF, mais 1 teste baseado em
-propriedades). 4 testes unitários para SealedKeyEnvelope e KeyPublication. 2
-testes de integração cobrindo o ciclo de vida completo de tesseras seladas e
-privadas: gerar chaves, criar chave de conteúdo, criptografar, selar, desselar,
-decriptar, publicar chave e verificar — o ciclo completo.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;KEM híbrido desde o início&lt;&#x2F;strong&gt;: X25519 + ML-KEM-768 segue a mesma filosofia
-das assinaturas duplas. Não sabemos quais suposições criptográficas se
-manterão ao longo dos milênios, então combinamos algoritmos clássicos e
-pós-quânticos. O custo é ~1,2 KB de material de chave adicional por identidade
-— trivial comparado às fotos e vídeos em uma tessera.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 para KDF&lt;&#x2F;strong&gt;: ao invés de adicionar &lt;code&gt;hkdf&lt;&#x2F;code&gt; + &lt;code&gt;sha2&lt;&#x2F;code&gt; como novas
-dependências, usamos &lt;code&gt;blake3::derive_key&lt;&#x2F;code&gt; com uma string de contexto fixa. O
-modo de derivação de chaves do BLAKE3 é especificamente projetado para este
-caso de uso, e o projeto já depende do BLAKE3 para hashing de conteúdo.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Manifestos imutáveis&lt;&#x2F;strong&gt;: quando a data &lt;code&gt;open_after&lt;&#x2F;code&gt; de uma tessera selada
-passa, a chave de conteúdo é publicada como um artefato assinado separado
-(&lt;code&gt;KeyPublication&lt;&#x2F;code&gt;), não modificando o manifesto. Isso preserva a natureza
-append-only e endereçada por conteúdo das tesseras. O manifesto foi assinado
-no momento da criação e nunca muda.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Vinculação AAD previne troca de texto cifrado&lt;&#x2F;strong&gt;: o &lt;code&gt;EncryptionContext&lt;&#x2F;code&gt;
-vincula tanto o hash de conteúdo quanto (para tesseras seladas) o timestamp
-&lt;code&gt;open_after&lt;&#x2F;code&gt; nos dados autenticados do AES-GCM. Um atacante que copie conteúdo
-criptografado de uma tessera &quot;selada até 2050&quot; para uma tessera &quot;selada até
-2025&quot; vai descobrir que a decriptação falha — o AAD não corresponde mais.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Encapsulamento de chave por XOR&lt;&#x2F;strong&gt;: o envelope de chave selada usa um XOR
-simples da chave de conteúdo com a chave de transporte derivada do KEM, ao
-invés de uma camada adicional de AES-GCM. Como a chave de transporte é um
-valor aleatório fresco do KEM e é usada exatamente uma vez, o XOR é
-informação-teoricamente seguro para este caso de uso específico e evita
-complexidade desnecessária.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Validação de domínio, não validação de storage&lt;&#x2F;strong&gt;: a verificação de &quot;chaves
-de criptografia ausentes&quot; vive em &lt;code&gt;TesseraService::create()&lt;&#x2F;code&gt;, não na camada de
-storage. Isso segue o padrão de arquitetura hexagonal: regras de domínio são
-aplicadas na fronteira de serviço, não espalhadas pelos adaptadores.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuada: Resiliência e Escala&lt;&#x2F;strong&gt; — Shamir&#x27;s Secret Sharing para
-distribuição de chaves de herdeiros, NAT traversal avançado (STUN&#x2F;TURN),
-ajuste de performance, auditorias de segurança, empacotamento para sistemas
-operacionais&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — Navegador público de tesseras por
-era&#x2F;localização&#x2F;tema&#x2F;idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Tesseras seladas fazem do Tesseras uma verdadeira cápsula do tempo. Um pai agora
-pode gravar uma mensagem para o neto que ainda não nasceu, selá-la até 2060 e
-saber que o envelope criptográfico vai resistir — mesmo que os computadores
-quânticos do futuro tentem abri-lo antes da hora.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 3: Memórias nas Suas Mãos</title>
- <published>2026-02-14T14:00:00+00:00</published>
- <updated>2026-02-14T14:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase3-api-and-apps/"/>
- <id>https://tesseras.net/pt-br/news/phase3-api-and-apps/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase3-api-and-apps/">&lt;p&gt;As pessoas agora podem segurar suas memórias nas próprias mãos. A Fase 3 entrega
-o que as fases anteriores construíram: um app mobile onde alguém baixa o
-Tesseras, cria uma identidade, tira uma foto, e aquela memória entra na rede de
-preservação. Sem contas na nuvem, sem assinaturas, sem nenhuma empresa entre
-você e suas memórias.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-embedded&lt;&#x2F;strong&gt; — Um nó P2P completo que roda dentro de um app mobile. A
-struct &lt;code&gt;EmbeddedNode&lt;&#x2F;code&gt; é dona de um runtime Tokio, banco SQLite, transporte QUIC,
-engine Kademlia DHT, serviço de replicação e serviço de tessera — a mesma stack
-do daemon desktop, compilada como biblioteca compartilhada. Um padrão singleton
-global (&lt;code&gt;Mutex&amp;lt;Option&amp;lt;EmbeddedNode&amp;gt;&amp;gt;&lt;&#x2F;code&gt;) garante um único nó por ciclo de vida do
-app. Ao iniciar, ele abre o banco de dados, executa migrações, carrega ou gera
-uma identidade Ed25519 com proof-of-work para o node ID, faz bind QUIC numa
-porta efêmera, conecta DHT e replicação, e inicia o loop de reparo. Ao parar,
-envia um sinal de shutdown e drena graciosamente.&lt;&#x2F;p&gt;
-&lt;p&gt;Onze funções FFI são expostas para Dart via flutter_rust_bridge: ciclo de vida
-(&lt;code&gt;node_start&lt;&#x2F;code&gt;, &lt;code&gt;node_stop&lt;&#x2F;code&gt;, &lt;code&gt;node_is_running&lt;&#x2F;code&gt;), identidade (&lt;code&gt;create_identity&lt;&#x2F;code&gt;,
-&lt;code&gt;get_identity&lt;&#x2F;code&gt;), memórias (&lt;code&gt;create_memory&lt;&#x2F;code&gt;, &lt;code&gt;get_timeline&lt;&#x2F;code&gt;, &lt;code&gt;get_memory&lt;&#x2F;code&gt;) e
-status da rede (&lt;code&gt;get_network_stats&lt;&#x2F;code&gt;, &lt;code&gt;get_replication_status&lt;&#x2F;code&gt;). Todos os tipos
-que cruzam a fronteira FFI são structs planas com apenas &lt;code&gt;String&lt;&#x2F;code&gt;,
-&lt;code&gt;Option&amp;lt;String&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;Vec&amp;lt;String&amp;gt;&lt;&#x2F;code&gt; e primitivos — sem trait objects, sem generics,
-sem lifetimes.&lt;&#x2F;p&gt;
-&lt;p&gt;Quatro módulos adaptadores fazem a ponte entre as ports do core e as
-implementações concretas: &lt;code&gt;Blake3HasherAdapter&lt;&#x2F;code&gt;,
-&lt;code&gt;Ed25519SignerAdapter&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Ed25519VerifierAdapter&lt;&#x2F;code&gt; para criptografia,
-&lt;code&gt;DhtPortAdapter&lt;&#x2F;code&gt; para operações DHT, e &lt;code&gt;ReplicationHandlerAdapter&lt;&#x2F;code&gt; para RPCs de
-fragmentos e atestação recebidos.&lt;&#x2F;p&gt;
-&lt;p&gt;A feature flag &lt;code&gt;bundled-sqlite&lt;&#x2F;code&gt; compila o SQLite a partir do código-fonte,
-necessário para Android e iOS onde a biblioteca do sistema pode não estar
-disponível. A configuração do Cargokit passa essa flag automaticamente em builds
-de debug e release.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;App Flutter&lt;&#x2F;strong&gt; — Uma aplicação Material Design 3 com gerenciamento de estado
-Riverpod, direcionada para Android, iOS, Linux, macOS e Windows a partir de uma
-única base de código.&lt;&#x2F;p&gt;
-&lt;p&gt;O &lt;em&gt;fluxo de onboarding&lt;&#x2F;em&gt; são três telas: uma tela de boas-vindas explicando o
-projeto em uma frase (&quot;Preserve suas memórias através dos milênios. Sem nuvem.
-Sem empresa.&quot;), uma tela de criação de identidade que dispara a geração do par
-de chaves Ed25519 em Rust, e uma tela de confirmação mostrando o nome do usuário
-e a identidade criptográfica.&lt;&#x2F;p&gt;
-&lt;p&gt;A &lt;em&gt;tela de timeline&lt;&#x2F;em&gt; exibe memórias em ordem cronológica reversa com previews de
-imagem, texto de contexto e chips para tipo de memória e visibilidade.
-Pull-to-refresh recarrega a partir do nó Rust. Um floating action button abre a
-&lt;em&gt;tela de criação de memória&lt;&#x2F;em&gt;, que suporta seleção de foto da galeria ou câmera
-via &lt;code&gt;image_picker&lt;&#x2F;code&gt;, texto de contexto opcional, dropdowns de tipo de memória e
-visibilidade, e tags separadas por vírgula. Criar uma memória chama o FFI Rust
-sincronamente, depois retorna à timeline.&lt;&#x2F;p&gt;
-&lt;p&gt;A &lt;em&gt;tela de rede&lt;&#x2F;em&gt; mostra dois cards: status do nó (contagem de peers, tamanho da
-DHT, estado de bootstrap, uptime) e saúde da replicação (total de fragmentos,
-fragmentos saudáveis, fragmentos em reparo, fator de replicação). A &lt;em&gt;tela de
-configurações&lt;&#x2F;em&gt; exibe a identidade do usuário — nome, node ID truncado, chave
-pública truncada e data de criação.&lt;&#x2F;p&gt;
-&lt;p&gt;Três providers Riverpod gerenciam o estado: &lt;code&gt;nodeProvider&lt;&#x2F;code&gt; inicia o nó embarcado
-ao abrir o app usando o diretório de documentos e para ao fazer dispose;
-&lt;code&gt;identityProvider&lt;&#x2F;code&gt; carrega o perfil existente ou cria um novo;
-&lt;code&gt;timelineProvider&lt;&#x2F;code&gt; busca a lista de memórias com paginação.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 9 testes unitários Rust em tesseras-embedded cobrindo ciclo de vida
-do nó (start&#x2F;stop sem panic), persistência de identidade entre reinícios, ciclos
-de reinício sem corrupção do SQLite, streaming de eventos de rede, recuperação
-de estatísticas, criação de memória e recuperação da timeline, e busca de
-memória individual por hash. 2 testes Flutter: um teste de integração
-verificando inicialização do Rust e startup do app, e um smoke test de widget.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Nó embarcado, não cliente-servidor&lt;&#x2F;strong&gt;: o celular roda a stack P2P completa,
-não um thin client conversando com um daemon remoto. Isso significa que
-memórias são preservadas mesmo sem internet. Usuários com um Raspberry Pi ou
-VPS podem opcionalmente conectar o app ao seu daemon via GraphQL para maior
-disponibilidade, mas não é obrigatório.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;FFI síncrono&lt;&#x2F;strong&gt;: todas as funções flutter_rust_bridge são marcadas como
-&lt;code&gt;#[frb(sync)]&lt;&#x2F;code&gt; e bloqueiam no runtime Tokio interno. Isso simplifica o lado
-Dart (sem complexidade de bridge assíncrono) enquanto o lado Rust lida com
-concorrência internamente. A UI thread do Flutter permanece responsiva porque
-o Riverpod envolve as chamadas em providers assíncronos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Singleton global&lt;&#x2F;strong&gt;: um global &lt;code&gt;Mutex&amp;lt;Option&amp;lt;EmbeddedNode&amp;gt;&amp;gt;&lt;&#x2F;code&gt; garante que o
-ciclo de vida do nó seja previsível — um start, um stop, sem race conditions.
-Plataformas mobile matam processos agressivamente, então simplicidade no
-gerenciamento de ciclo de vida é uma feature.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Tipos FFI planos&lt;&#x2F;strong&gt;: nenhuma abstração Rust vaza pela fronteira FFI. Todo
-tipo é uma struct plana com strings e números. Isso torna os bindings Dart
-auto-gerados confiáveis e fáceis de debugar.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Onboarding de três telas&lt;&#x2F;strong&gt;: a criação de identidade é o único passo
-obrigatório. Sem email, sem senha, sem registro em servidor. O app gera uma
-identidade criptográfica localmente e está pronto para uso.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4: Resiliência e Escala&lt;&#x2F;strong&gt; — NAT traversal avançado (STUN&#x2F;TURN),
-Shamir&#x27;s Secret Sharing para herdeiros, tesseras seladas com criptografia
-temporal, ajuste de performance, auditorias de segurança, empacotamento para
-Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — Navegador público de tesseras por
-era&#x2F;localização&#x2F;tema&#x2F;idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;A infraestrutura está completa. A rede existe, a replicação funciona, e agora
-qualquer pessoa com um celular pode participar. O que resta é fortalecer o que
-temos e abrir para o mundo.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Reed-Solomon: Como o Tesseras Sobrevive à Perda de Dados</title>
- <published>2026-02-14T14:00:00+00:00</published>
- <updated>2026-02-14T14:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/reed-solomon/"/>
- <id>https://tesseras.net/pt-br/news/reed-solomon/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/reed-solomon/">&lt;p&gt;Seu disco rígido vai morrer. Seu provedor de nuvem vai pivotar. O array RAID no
-seu armário vai sobreviver ao controlador, mas não ao dono. Se uma memória está
-armazenada em exatamente um lugar, ela tem exatamente uma forma de se perder
-para sempre.&lt;&#x2F;p&gt;
-&lt;p&gt;Tesseras é uma rede que mantém memórias humanas vivas através de ajuda mútua. O
-mecanismo central de sobrevivência é a &lt;strong&gt;codificação de apagamento
-Reed-Solomon&lt;&#x2F;strong&gt; — uma técnica emprestada da comunicação espacial profunda que nos
-permite reconstruir dados mesmo quando pedaços desaparecem.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-e-reed-solomon&quot;&gt;O que é Reed-Solomon?&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon é uma família de códigos corretores de erros inventada por Irving
-Reed e Gustave Solomon em 1960. O caso de uso original era corrigir erros em
-dados transmitidos por canais ruidosos — pense na Voyager enviando fotos de
-Júpiter, ou num CD tocando apesar de arranhões.&lt;&#x2F;p&gt;
-&lt;p&gt;A ideia-chave: se você adicionar redundância cuidadosamente calculada aos seus
-dados &lt;em&gt;antes&lt;&#x2F;em&gt; que algo dê errado, você pode recuperar o original mesmo depois de
-perder alguns pedaços.&lt;&#x2F;p&gt;
-&lt;p&gt;Eis a intuição. Suponha que você tenha um polinômio de grau 2 — uma parábola.
-Você precisa de 3 pontos para defini-lo de forma única. Mas se você avaliá-lo em
-5 pontos, pode perder quaisquer 2 desses 5 e ainda reconstruir o polinômio a
-partir dos 3 restantes. Reed-Solomon generaliza essa ideia para trabalhar sobre
-corpos finitos (corpos de Galois), onde o &quot;polinômio&quot; são seus dados e os
-&quot;pontos de avaliação&quot; são seus fragmentos.&lt;&#x2F;p&gt;
-&lt;p&gt;Em termos concretos:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Divida&lt;&#x2F;strong&gt; seus dados em &lt;em&gt;k&lt;&#x2F;em&gt; shards de dados&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Calcule&lt;&#x2F;strong&gt; &lt;em&gt;m&lt;&#x2F;em&gt; shards de paridade a partir dos shards de dados&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Distribua&lt;&#x2F;strong&gt; todos os &lt;em&gt;k + m&lt;&#x2F;em&gt; shards em diferentes locais&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reconstrua&lt;&#x2F;strong&gt; os dados originais a partir de quaisquer &lt;em&gt;k&lt;&#x2F;em&gt; dos &lt;em&gt;k + m&lt;&#x2F;em&gt;
-shards&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;Você pode perder até &lt;em&gt;m&lt;&#x2F;em&gt; shards — quaisquer &lt;em&gt;m&lt;&#x2F;em&gt;, de dados ou paridade, em
-qualquer combinação — e ainda recuperar tudo.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;por-que-nao-simplesmente-fazer-copias&quot;&gt;Por que não simplesmente fazer cópias?&lt;&#x2F;h2&gt;
-&lt;p&gt;A abordagem ingênua para redundância é a replicação: faça 3 cópias, armazene-as
-em 3 lugares. Isso dá tolerância a 2 falhas ao custo de 3x o seu armazenamento.&lt;&#x2F;p&gt;
-&lt;p&gt;Reed-Solomon é dramaticamente mais eficiente:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Estratégia&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Overhead de armazenamento&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Falhas toleradas&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;Replicação 3x&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;200%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2 de 3&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Reed-Solomon (16,8)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;50%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;8 de 24&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Reed-Solomon (48,24)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;50%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24 de 72&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;Com 16 shards de dados e 8 de paridade, você usa 50% de armazenamento extra mas
-pode sobreviver à perda de um terço de todos os fragmentos. Para alcançar a
-mesma tolerância a falhas só com replicação, você precisaria de 3x o
-armazenamento.&lt;&#x2F;p&gt;
-&lt;p&gt;Para uma rede que visa preservar memórias ao longo de décadas e séculos, essa
-eficiência não é um luxo — é a diferença entre um sistema viável e um que se
-afoga no próprio overhead.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;como-o-tesseras-usa-reed-solomon&quot;&gt;Como o Tesseras usa Reed-Solomon&lt;&#x2F;h2&gt;
-&lt;p&gt;Nem todos os dados merecem o mesmo tratamento. Uma memória de texto de 500 bytes
-e um vídeo de 100 MB têm necessidades de redundância muito diferentes. O
-Tesseras usa uma estratégia de fragmentação em três camadas:&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Small (&amp;lt; 4 MB)&lt;&#x2F;strong&gt; — Replicação do arquivo inteiro para 7 pares. Para tesseras
-pequenas, o overhead da codificação de apagamento (tempo de codificação,
-gerenciamento de fragmentos, lógica de reconstrução) supera seus benefícios.
-Cópias simples são mais rápidas e mais simples.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Medium (4–256 MB)&lt;&#x2F;strong&gt; — 16 shards de dados + 8 de paridade = 24 fragmentos no
-total. Cada fragmento tem aproximadamente 1&#x2F;16 do tamanho original. Quaisquer 16
-dos 24 fragmentos reconstroem o original. Distribuídos entre 7 pares.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Large (≥ 256 MB)&lt;&#x2F;strong&gt; — 48 shards de dados + 24 de paridade = 72 fragmentos no
-total. Maior contagem de shards significa fragmentos individuais menores (mais
-fáceis de transferir e armazenar) e maior tolerância absoluta a falhas. Também
-distribuídos entre 7 pares.&lt;&#x2F;p&gt;
-&lt;p&gt;A implementação usa o crate &lt;code&gt;reed-solomon-erasure&lt;&#x2F;code&gt; operando sobre GF(2⁸) — o
-mesmo corpo de Galois usado em códigos QR e CDs. Cada fragmento carrega um
-checksum BLAKE3 para que a corrupção seja detectada imediatamente, não propagada
-silenciosamente.&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;Tessera (álbum de fotos de 120 MB)
- ↓ codificar
-16 shards de dados (7,5 MB cada) + 8 shards de paridade (7,5 MB cada)
- ↓ distribuir
-24 fragmentos entre 7 pares (diversidade de sub-rede)
- ↓ quaisquer 16 fragmentos
-Tessera original recuperada
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;os-desafios&quot;&gt;Os desafios&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon resolve o problema matemático da redundância. Os desafios de
-engenharia estão em tudo ao redor.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;rastreamento-de-fragmentos&quot;&gt;Rastreamento de fragmentos&lt;&#x2F;h3&gt;
-&lt;p&gt;Cada fragmento precisa ser localizável. O Tesseras usa uma DHT Kademlia para
-descoberta de pares e mapeamento de fragmentos para pares. Quando um nó fica
-offline, seus fragmentos precisam ser recriados e distribuídos para novos pares.
-Isso significa rastrear quais fragmentos existem, onde estão e se ainda estão
-intactos — numa rede sem autoridade central.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;corrupcao-silenciosa&quot;&gt;Corrupção silenciosa&lt;&#x2F;h3&gt;
-&lt;p&gt;Um fragmento que retorna dados errados é pior que um ausente — pelo menos um
-fragmento ausente é honestamente ausente. O Tesseras aborda isso com
-verificações de saúde baseadas em atestação: o loop de reparo periodicamente
-pede aos detentores de fragmentos que provem posse retornando checksums BLAKE3.
-Se um checksum não bater, o fragmento é tratado como perdido.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;falhas-correlacionadas&quot;&gt;Falhas correlacionadas&lt;&#x2F;h3&gt;
-&lt;p&gt;Se todos os 24 fragmentos de uma tessera caírem em máquinas no mesmo datacenter,
-uma única queda de energia os elimina todos. A matemática do Reed-Solomon assume
-falhas independentes. O Tesseras impõe &lt;strong&gt;diversidade de sub-rede&lt;&#x2F;strong&gt; durante a
-distribuição: no máximo 2 fragmentos por sub-rede &#x2F;24 IPv4 (ou prefixo &#x2F;48
-IPv6). Isso espalha fragmentos por diferentes infraestruturas físicas.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;velocidade-de-reparo-vs-carga-na-rede&quot;&gt;Velocidade de reparo vs. carga na rede&lt;&#x2F;h3&gt;
-&lt;p&gt;Quando um par fica offline, o relógio começa a contar. Fragmentos perdidos
-precisam ser recriados antes que mais falhas se acumulem. Mas reparo agressivo
-inunda a rede. O Tesseras equilibra isso com um loop de reparo configurável
-(padrão: a cada 24 horas com 2 horas de jitter) e limites de transferências
-simultâneas (padrão: 4 transferências simultâneas). O jitter previne tempestades
-de reparo onde cada nó verifica seus fragmentos no mesmo momento.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;gerenciamento-de-chaves-a-longo-prazo&quot;&gt;Gerenciamento de chaves a longo prazo&lt;&#x2F;h3&gt;
-&lt;p&gt;Reed-Solomon protege contra perda de dados, não contra perda de acesso. Se uma
-tessera é criptografada (visibilidade privada ou selada), você precisa da chave
-de descriptografia para tornar os dados recuperados úteis. O Tesseras separa
-essas preocupações: codificação de apagamento cuida da disponibilidade, enquanto
-o Compartilhamento de Segredo de Shamir (uma fase futura) cuidará da
-distribuição de chaves entre herdeiros. A filosofia de design do projeto —
-criptografar o mínimo possível — mantém o problema de gerenciamento de chaves
-pequeno.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;limitacoes-do-corpo-de-galois&quot;&gt;Limitações do corpo de Galois&lt;&#x2F;h3&gt;
-&lt;p&gt;O corpo GF(2⁸) limita o número total de shards a 255 (dados + paridade
-combinados). Para o Tesseras, isso não é uma restrição prática — mesmo a camada
-Large usa apenas 72 shards. Mas significa que arquivos extremamente grandes com
-milhares de fragmentos exigiriam um corpo diferente ou um esquema de codificação
-em camadas.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;compatibilidade-evolutiva-do-codec&quot;&gt;Compatibilidade evolutiva do codec&lt;&#x2F;h3&gt;
-&lt;p&gt;Uma tessera codificada hoje precisa ser decodificável em 50 anos. Reed-Solomon
-sobre GF(2⁸) é um dos algoritmos mais amplamente implementados na computação —
-está em todo leitor de CD, em todo scanner de código QR, em toda sonda espacial.
-Essa ubiquidade é em si uma estratégia de sobrevivência. O algoritmo não será
-esquecido porque metade da infraestrutura do mundo depende dele.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-quadro-geral&quot;&gt;O quadro geral&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon é uma peça de um quebra-cabeça maior. Ele trabalha em conjunto com:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;DHT Kademlia&lt;&#x2F;strong&gt; para encontrar pares e rotear fragmentos&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Checksums BLAKE3&lt;&#x2F;strong&gt; para verificação de integridade&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reciprocidade bilateral&lt;&#x2F;strong&gt; para troca justa de armazenamento (sem blockchain)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Diversidade de sub-rede&lt;&#x2F;strong&gt; para independência de falhas&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reparo automático&lt;&#x2F;strong&gt; para manter a redundância ao longo do tempo&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Nenhuma técnica isolada faz memórias sobreviverem. Reed-Solomon garante que
-dados &lt;em&gt;podem&lt;&#x2F;em&gt; ser recuperados. A DHT garante que fragmentos &lt;em&gt;podem ser
-encontrados&lt;&#x2F;em&gt;. A reciprocidade garante que pares &lt;em&gt;querem ajudar&lt;&#x2F;em&gt;. O reparo
-garante que nada disso se degrade com o tempo.&lt;&#x2F;p&gt;
-&lt;p&gt;Uma tessera é uma aposta de que a soma desses mecanismos, rodando em muitas
-máquinas independentes operadas por muitas pessoas independentes, é mais durável
-que qualquer instituição isolada. Reed-Solomon é a fundação matemática dessa
-aposta.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 2: Memórias Sobrevivem</title>
- <published>2026-02-14T12:00:00+00:00</published>
- <updated>2026-02-14T12:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase2-replication/"/>
- <id>https://tesseras.net/pt-br/news/phase2-replication/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase2-replication/">&lt;p&gt;Uma tessera não está mais presa a uma única máquina. A Fase 2 entrega a camada
-de replicação: os dados são divididos em fragmentos com codificação de
-apagamento, distribuídos entre múltiplos pares e reparados automaticamente
-quando nós ficam offline. Um livro-razão de reciprocidade bilateral garante
-troca justa de armazenamento — sem blockchain, sem tokens.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; (atualizado) — Novos tipos de domínio de replicação:
-&lt;code&gt;FragmentPlan&lt;&#x2F;code&gt; (seleciona a camada de fragmentação baseada no tamanho da
-tessera), &lt;code&gt;FragmentId&lt;&#x2F;code&gt; (hash da tessera + índice + contagem de shards +
-checksum), &lt;code&gt;FragmentEnvelope&lt;&#x2F;code&gt; (fragmento com seus metadados para transporte na
-rede), &lt;code&gt;FragmentationTier&lt;&#x2F;code&gt; (Small&#x2F;Medium&#x2F;Large), &lt;code&gt;Attestation&lt;&#x2F;code&gt; (prova de que um
-nó possui um fragmento em um dado momento) e &lt;code&gt;ReplicateAck&lt;&#x2F;code&gt; (confirmação de
-recebimento de fragmento). Três novas traits de porta definem os limites
-hexagonais: &lt;code&gt;DhtPort&lt;&#x2F;code&gt; (encontrar pares, replicar fragmentos, solicitar
-atestações, ping), &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; (armazenar&#x2F;ler&#x2F;deletar&#x2F;listar&#x2F;verificar
-fragmentos) e &lt;code&gt;ReciprocityLedger&lt;&#x2F;code&gt; (registrar trocas de armazenamento, consultar
-saldos, encontrar melhores pares). O tamanho máximo de uma tessera é 1 GB.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-crypto&lt;&#x2F;strong&gt; (atualizado) — O &lt;code&gt;ReedSolomonCoder&lt;&#x2F;code&gt; existente agora alimenta
-a codificação de fragmentos. Os dados são divididos em shards, shards de
-paridade são computados, e qualquer combinação de shards de dados pode
-reconstruir o original — desde que o número de shards ausentes não exceda a
-contagem de paridade.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-storage&lt;&#x2F;strong&gt; (atualizado) — Dois novos adaptadores:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt; — armazena dados de fragmentos como arquivos em disco
-(&lt;code&gt;{raiz}&#x2F;{hash_tessera}&#x2F;{indice:03}.shard&lt;&#x2F;code&gt;) com um índice de metadados SQLite
-rastreando hash da tessera, índice do shard, contagem de shards, checksum e
-tamanho em bytes. A verificação recalcula o hash BLAKE3 e compara com o
-checksum armazenado.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;SqliteReciprocityLedger&lt;&#x2F;code&gt; — contabilidade bilateral de armazenamento em
-SQLite. Cada par tem uma linha rastreando bytes armazenados para eles e bytes
-que eles armazenam para nós. A coluna &lt;code&gt;balance&lt;&#x2F;code&gt; é uma coluna gerada
-(&lt;code&gt;bytes_they_store_for_us - bytes_stored_for_them&lt;&#x2F;code&gt;). UPSERT garante incremento
-atômico dos contadores.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Nova migração (&lt;code&gt;002_replication.sql&lt;&#x2F;code&gt;) adiciona tabelas para fragmentos, planos
-de fragmentação, detentores, mapeamentos detentor-fragmento e saldos de
-reciprocidade.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-dht&lt;&#x2F;strong&gt; (atualizado) — Quatro novas variantes de mensagem: &lt;code&gt;Replicate&lt;&#x2F;code&gt;
-(enviar um envelope de fragmento), &lt;code&gt;ReplicateAck&lt;&#x2F;code&gt; (confirmar recebimento),
-&lt;code&gt;AttestRequest&lt;&#x2F;code&gt; (pedir a um nó que prove que possui os fragmentos de uma
-tessera) e &lt;code&gt;AttestResponse&lt;&#x2F;code&gt; (retornar atestação com checksums e timestamp). O
-engine trata essas mensagens em seu loop de despacho.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-replication&lt;&#x2F;strong&gt; — O novo crate, com cinco módulos:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Codificação de fragmentos&lt;&#x2F;em&gt; (&lt;code&gt;fragment.rs&lt;&#x2F;code&gt;): &lt;code&gt;encode_tessera()&lt;&#x2F;code&gt; seleciona a
-camada de fragmentação baseada no tamanho e então chama a codificação
-Reed-Solomon para as camadas Medium e Large. Três camadas:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Small&lt;&#x2F;strong&gt; (&amp;lt; 4 MB): replicação do arquivo inteiro para r=7 pares, sem
-codificação de apagamento&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Medium&lt;&#x2F;strong&gt; (4–256 MB): 16 shards de dados + 8 de paridade, distribuídos
-entre r=7 pares&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Large&lt;&#x2F;strong&gt; (≥ 256 MB): 48 shards de dados + 24 de paridade, distribuídos
-entre r=7 pares&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Distribuição&lt;&#x2F;em&gt; (&lt;code&gt;distributor.rs&lt;&#x2F;code&gt;): filtragem de diversidade de sub-rede limita
-pares por sub-rede &#x2F;24 IPv4 (ou prefixo &#x2F;48 IPv6) para evitar falhas
-correlacionadas. Se todos os seus fragmentos caírem no mesmo rack, uma única
-queda de energia os elimina.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Serviço&lt;&#x2F;em&gt; (&lt;code&gt;service.rs&lt;&#x2F;code&gt;): &lt;code&gt;ReplicationService&lt;&#x2F;code&gt; é o orquestrador.
-&lt;code&gt;replicate_tessera()&lt;&#x2F;code&gt; codifica os dados, encontra os pares mais próximos via
-DHT, aplica diversidade de sub-rede e distribui fragmentos em round-robin.
-&lt;code&gt;receive_fragment()&lt;&#x2F;code&gt; valida o checksum BLAKE3, verifica o saldo de
-reciprocidade (rejeita se o déficit do remetente exceder o limite
-configurado), armazena o fragmento e atualiza o livro-razão.
-&lt;code&gt;handle_attestation_request()&lt;&#x2F;code&gt; lista os fragmentos locais e calcula seus
-checksums como prova de posse.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Reparo&lt;&#x2F;em&gt; (&lt;code&gt;repair.rs&lt;&#x2F;code&gt;): &lt;code&gt;check_tessera_health()&lt;&#x2F;code&gt; solicita atestações dos
-detentores conhecidos, recorre ao ping para nós não responsivos, verifica a
-integridade local dos fragmentos e retorna uma de três ações: &lt;code&gt;Healthy&lt;&#x2F;code&gt;,
-&lt;code&gt;NeedsReplication { deficit }&lt;&#x2F;code&gt; ou &lt;code&gt;CorruptLocal { fragment_index }&lt;&#x2F;code&gt;. O loop de
-reparo roda a cada 24 horas (com 2 horas de jitter) via &lt;code&gt;tokio::select!&lt;&#x2F;code&gt; com
-integração de desligamento.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Configuração&lt;&#x2F;em&gt; (&lt;code&gt;config.rs&lt;&#x2F;code&gt;): &lt;code&gt;ReplicationConfig&lt;&#x2F;code&gt; com padrões para intervalo
-de reparo (24h), jitter (2h), transferências simultâneas (4), espaço livre
-mínimo (1 GB), tolerância de déficit (256 MB) e limite de armazenamento por
-par (1 GB).&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;tesd&lt;&#x2F;strong&gt; (atualizado) — O daemon agora abre um banco de dados SQLite
-(&lt;code&gt;db&#x2F;tesseras.db&lt;&#x2F;code&gt;), executa migrações, cria instâncias de &lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt;,
-&lt;code&gt;SqliteReciprocityLedger&lt;&#x2F;code&gt; e &lt;code&gt;FsBlobStore&lt;&#x2F;code&gt;, envolve o engine DHT em um
-&lt;code&gt;DhtPortAdapter&lt;&#x2F;code&gt;, constrói um &lt;code&gt;ReplicationService&lt;&#x2F;code&gt; e lança o loop de reparo como
-tarefa em segundo plano com desligamento gracioso.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 193 testes em todo o workspace:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;15 testes unitários em tesseras-replication (camadas de codificação de
-fragmentos, validação de checksum, diversidade de sub-rede, verificações de
-saúde do reparo, fluxos de recebimento&#x2F;replicação do serviço)&lt;&#x2F;li&gt;
-&lt;li&gt;3 testes de integração com armazenamento real (ciclo completo
-codificar→distribuir→receber para tessera média, replicação de arquivo inteiro
-para tessera pequena, rejeição de fragmento adulterado)&lt;&#x2F;li&gt;
-&lt;li&gt;Testes usam SQLite em memória + diretório temporário para fragmentos com mocks
-mockall para DHT e BlobStore&lt;&#x2F;li&gt;
-&lt;li&gt;Zero avisos do clippy, formatação limpa&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fragmentação em três camadas&lt;&#x2F;strong&gt;: arquivos pequenos não precisam de
-codificação de apagamento — o overhead não compensa. Arquivos médios e grandes
-recebem progressivamente mais shards de paridade. Isso evita desperdiçar
-armazenamento em tesseras pequenas enquanto oferece redundância forte para as
-grandes.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Distribuição por push do dono&lt;&#x2F;strong&gt;: o dono da tessera codifica os fragmentos e
-os envia aos pares, em vez dos pares puxarem. Isso simplifica o protocolo (sem
-fase de negociação) e garante que os fragmentos são distribuídos
-imediatamente.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reciprocidade bilateral sem consenso&lt;&#x2F;strong&gt;: cada nó rastreia seu próprio saldo
-com cada par localmente. Sem livro-razão global, sem token, sem blockchain. Se
-o par A armazena 500 MB para o par B, o par B deveria armazenar
-aproximadamente 500 MB para o par A. Free riders perdem redundância
-gradualmente — seus fragmentos são despriorizados para reparo, mas nunca
-deletados.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Diversidade de sub-rede&lt;&#x2F;strong&gt;: os fragmentos são espalhados por diferentes
-sub-redes para sobreviver a falhas correlacionadas. Uma queda de datacenter
-não deveria eliminar todas as cópias de uma tessera.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Verificações de saúde por atestação primeiro&lt;&#x2F;strong&gt;: o loop de reparo pede aos
-detentores que provem posse (atestação com checksums) antes de declarar uma
-tessera degradada. Apenas quando a atestação falha é que ele recorre a um
-simples ping. Isso detecta corrupção silenciosa de dados, não apenas partida
-de nós.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 3: API e Apps&lt;&#x2F;strong&gt; — App Flutter mobile&#x2F;desktop via flutter_rust_bridge,
-API GraphQL (async-graphql), nó WASM no navegador&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4: Resiliência e Escala&lt;&#x2F;strong&gt; — Assinaturas pós-quânticas ML-DSA, travessia
-avançada de NAT, Compartilhamento de Segredo de Shamir para herdeiros,
-empacotamento para Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI no SourceHut&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — navegador público de tesseras, curadoria
-institucional, integração genealógica, exportação para mídia física&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Os nós conseguem se encontrar e manter vivas as memórias uns dos outros. Em
-seguida, damos às pessoas uma forma de segurar suas memórias nas mãos.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 1: Nós Se Encontram</title>
- <published>2026-02-14T11:00:00+00:00</published>
- <updated>2026-02-14T11:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase1-basic-network/"/>
- <id>https://tesseras.net/pt-br/news/phase1-basic-network/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase1-basic-network/">&lt;p&gt;Tesseras não é mais uma ferramenta apenas local. A Fase 1 entrega a camada de
-rede: nós se descobrem através de uma DHT Kademlia, comunicam-se sobre QUIC e
-publicam ponteiros de tesseras que qualquer par na rede pode encontrar. Uma
-tessera criada no nó A agora pode ser encontrada a partir do nó C.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; (atualizado) — Novos tipos de domínio de rede:
-&lt;code&gt;TesseraPointer&lt;&#x2F;code&gt; (referência leve aos detentores de uma tessera e localização
-dos fragmentos), &lt;code&gt;NodeIdentity&lt;&#x2F;code&gt; (ID do nó + chave pública + nonce de prova de
-trabalho), &lt;code&gt;NodeInfo&lt;&#x2F;code&gt; (identidade + endereço + capacidades) e &lt;code&gt;Capabilities&lt;&#x2F;code&gt;
-(bitflags do que um nó suporta: DHT, armazenamento, relay, replicação).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-net&lt;&#x2F;strong&gt; — A camada de transporte, construída sobre QUIC via quinn. A
-trait &lt;code&gt;Transport&lt;&#x2F;code&gt; define a porta: &lt;code&gt;send&lt;&#x2F;code&gt;, &lt;code&gt;recv&lt;&#x2F;code&gt;, &lt;code&gt;disconnect&lt;&#x2F;code&gt;, &lt;code&gt;local_addr&lt;&#x2F;code&gt;.
-Dois adaptadores a implementam:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;QuinnTransport&lt;&#x2F;code&gt; — QUIC real com TLS auto-assinado, negociação ALPN
-(&lt;code&gt;tesseras&#x2F;1&lt;&#x2F;code&gt;), pool de conexões via DashMap e um loop de aceitação em
-background que trata streams recebidas.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;MemTransport&lt;&#x2F;code&gt; + &lt;code&gt;SimNetwork&lt;&#x2F;code&gt; — canais em memória para testes determinísticos
-sem I&#x2F;O de rede. Cada teste de integração no crate DHT roda contra este
-adaptador.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;O protocolo de fio usa MessagePack com prefixo de comprimento: um cabeçalho de 4
-bytes big-endian seguido de um payload rmp-serde. &lt;code&gt;WireMessage&lt;&#x2F;code&gt; carrega um byte
-de versão, ID de requisição e um corpo que pode ser requisição, resposta ou erro
-de protocolo. Tamanho máximo de mensagem é 64 KiB.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-dht&lt;&#x2F;strong&gt; — Uma implementação completa de Kademlia:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;em&gt;Tabela de roteamento&lt;&#x2F;em&gt;: 160 k-buckets com k=20. Evicção do menos recentemente
-visto, mover-para-trás ao atualizar, verificação por ping antes de substituir
-a entrada mais antiga de um bucket cheio.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Distância XOR&lt;&#x2F;em&gt;: métrica XOR de 160 bits com indexação de bucket pelo bit mais
-significativo diferente.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Prova de trabalho&lt;&#x2F;em&gt;: nós iteram um nonce até que
-&lt;code&gt;BLAKE3(pubkey || nonce)[..20]&lt;&#x2F;code&gt; tenha 8 bits zero iniciais (~256 tentativas de
-hash em média). Barato o suficiente para qualquer dispositivo, caro o
-suficiente para tornar ataques Sybil impraticáveis em escala.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Mensagens de protocolo&lt;&#x2F;em&gt;: Ping&#x2F;Pong, FindNode&#x2F;FindNodeResponse,
-FindValue&#x2F;FindValueResult, Store — todos serializados com MessagePack via
-serde.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Armazenamento de ponteiros&lt;&#x2F;em&gt;: armazenamento em memória limitado com TTL
-configurável (24 horas padrão) e máximo de entradas (10.000 padrão). Quando
-cheio, remove ponteiros mais distantes do ID do nó local, seguindo o modelo de
-responsabilidade baseado em distância do Kademlia.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;DhtEngine&lt;&#x2F;em&gt;: o orquestrador principal. Trata RPCs recebidos, executa buscas
-iterativas (paralelismo alpha=3), bootstrap, publicação e busca. O método
-&lt;code&gt;run()&lt;&#x2F;code&gt; dirige um loop &lt;code&gt;tokio::select!&lt;&#x2F;code&gt; com timers de manutenção: refresh da
-tabela de roteamento a cada 60 segundos, expiração de ponteiros a cada 5
-minutos.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;tesd&lt;&#x2F;strong&gt; — Um binário de nó completo. Analisa argumentos de CLI (endereço de
-bind, pares de bootstrap, diretório de dados), gera uma identidade de nó válida
-por PoW, abre um endpoint QUIC, faz bootstrap na rede e roda o motor DHT.
-Desligamento gracioso com Ctrl+C via tratamento de sinais do tokio.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Infraestrutura&lt;&#x2F;strong&gt; — Configuração OpenTofu para dois nós bootstrap no Hetzner
-Cloud (instâncias cx22 em Falkenstein, Alemanha e Helsinki, Finlândia). Script
-de provisionamento cloud-init cria um usuário dedicado &lt;code&gt;tesseras&lt;&#x2F;code&gt;, escreve um
-arquivo de configuração e configura um serviço systemd. Regras de firewall abrem
-UDP 4433 (QUIC) e restringem métricas a acesso interno.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 139 testes em todo o workspace:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;47 testes unitários em tesseras-dht (tabela de roteamento, distância, PoW,
-armazenamento de ponteiros, serialização de mensagens, RPCs do engine)&lt;&#x2F;li&gt;
-&lt;li&gt;5 testes de integração multi-nó (bootstrap de 3 nós, convergência de lookup
-com 10 nós, publicar-e-encontrar, detecção de partida de nó, rejeição de PoW)&lt;&#x2F;li&gt;
-&lt;li&gt;14 testes em tesseras-net (roundtrips de codec, send&#x2F;recv de transporte,
-backpressure, disconnect)&lt;&#x2F;li&gt;
-&lt;li&gt;Testes de fumaça com Docker Compose usando 3 nós containerizados comunicando
-sobre QUIC real&lt;&#x2F;li&gt;
-&lt;li&gt;Zero avisos do clippy, formatação limpa&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Transport como porta&lt;&#x2F;strong&gt;: a trait &lt;code&gt;Transport&lt;&#x2F;code&gt; é a única interface entre o
-motor DHT e a rede. Trocar QUIC por qualquer outro protocolo significa
-implementar quatro métodos. Todos os testes de DHT usam o adaptador em
-memória, tornando-os rápidos e determinísticos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Um stream por RPC&lt;&#x2F;strong&gt;: cada par requisição-resposta DHT usa um stream
-bidirecional QUIC novo. Sem complexidade de multiplexação, sem bloqueio
-head-of-line entre operações independentes. O QUIC trata a multiplexação no
-nível da conexão.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;MessagePack em vez de Protobuf&lt;&#x2F;strong&gt;: codificação binária compacta sem geração
-de código ou arquivos de esquema. Integração com serde significa que adicionar
-um campo a uma mensagem é uma mudança de uma linha. Trade-off: sem garantias
-de evolução de esquema embutidas, mas neste estágio velocidade importa mais.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;PoW em vez de stake ou reputação&lt;&#x2F;strong&gt;: uma identidade de nó custa ~256 hashes
-BLAKE3. Isso roda em menos de um segundo em qualquer hardware, incluindo um
-Raspberry Pi, mas gerar milhares de identidades para um ataque Sybil se torna
-caro. Sem tokens, sem blockchain, sem dependências externas.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Busca iterativa com atualização da tabela de roteamento&lt;&#x2F;strong&gt;: nós descobertos
-são adicionados à tabela de roteamento conforme encontrados durante buscas
-iterativas, seguindo o comportamento padrão do Kademlia. Isso garante que a
-tabela de roteamento melhore organicamente conforme os nós interagem.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 2: Replicação&lt;&#x2F;strong&gt; — Codificação de apagamento Reed-Solomon pela rede,
-distribuição de fragmentos, loops de reparo automáticos, livro-razão de
-reciprocidade bilateral (sem blockchain, sem tokens)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 3: API e Apps&lt;&#x2F;strong&gt; — App Flutter mobile&#x2F;desktop via flutter_rust_bridge,
-API GraphQL (async-graphql), nó WASM no navegador&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4: Resiliência e Escala&lt;&#x2F;strong&gt; — Assinaturas pós-quânticas ML-DSA, travessia
-avançada de NAT, Compartilhamento de Segredo de Shamir para herdeiros,
-empacotamento para Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI no SourceHut&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — navegador público de tesseras, curadoria
-institucional, integração genealógica, exportação para mídia física&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Os nós conseguem se encontrar. Em seguida, aprendem a manter vivas as memórias
-uns dos outros.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 0: Fundação Construída</title>
- <published>2026-02-14T10:00:00+00:00</published>
- <updated>2026-02-14T10:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase0-foundation/"/>
- <id>https://tesseras.net/pt-br/news/phase0-foundation/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase0-foundation/">&lt;p&gt;O primeiro marco do projeto Tesseras está completo. A Fase 0 estabelece a
-fundação sobre a qual cada componente futuro será construído: tipos de domínio,
-criptografia, armazenamento e uma interface de linha de comando funcional.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; — A camada de domínio define o formato tessera: &lt;code&gt;ContentHash&lt;&#x2F;code&gt;
-(BLAKE3, 32 bytes), &lt;code&gt;NodeId&lt;&#x2F;code&gt; (Kademlia, 20 bytes), tipos de memória (Moment,
-Reflection, Daily, Relation, Object), modos de visibilidade (Private, Circle,
-Public, PublicAfterDeath, Sealed) e um formato de manifesto em texto plano que
-pode ser interpretado por qualquer linguagem de programação pelos próximos mil
-anos. A camada de serviço (&lt;code&gt;TesseraService&lt;&#x2F;code&gt;) gerencia operações de criação,
-verificação, exportação e listagem através de port traits, seguindo arquitetura
-hexagonal.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-crypto&lt;&#x2F;strong&gt; — Geração de chaves Ed25519, assinatura e verificação. Um
-framework de assinatura dual (Ed25519 + placeholder ML-DSA) pronto para migração
-pós-quântica. Hashing de conteúdo com BLAKE3. Codificação de apagamento
-Reed-Solomon atrás de uma feature flag para futura replicação.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-storage&lt;&#x2F;strong&gt; — Índice SQLite via rusqlite com migrações em SQL puro.
-Blob store no sistema de arquivos com layout endereçável por conteúdo
-(&lt;code&gt;blobs&#x2F;&amp;lt;tessera_hash&amp;gt;&#x2F;&amp;lt;memory_hash&amp;gt;&#x2F;&amp;lt;filename&amp;gt;&lt;&#x2F;code&gt;). Persistência de chaves de
-identidade em disco.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-cli&lt;&#x2F;strong&gt; — Um binário &lt;code&gt;tesseras&lt;&#x2F;code&gt; funcional com cinco comandos:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;init&lt;&#x2F;code&gt; — gera identidade Ed25519, cria banco de dados SQLite&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;create &amp;lt;dir&amp;gt;&lt;&#x2F;code&gt; — varre um diretório por arquivos de mídia, cria uma tessera
-assinada&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;verify &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt; — verifica assinatura e integridade dos arquivos&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;export &amp;lt;hash&amp;gt; &amp;lt;dest&amp;gt;&lt;&#x2F;code&gt; — escreve um diretório tessera autocontido&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;list&lt;&#x2F;code&gt; — mostra uma tabela das tesseras armazenadas&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 67+ testes em todo o workspace: testes unitários em cada módulo,
-testes baseados em propriedades (proptest) para roundtrips hex e serialização de
-manifesto, testes de integração cobrindo o ciclo completo de
-criação-verificação-exportação incluindo detecção de arquivos adulterados e
-assinaturas inválidas. Zero avisos do clippy.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Arquitetura hexagonal&lt;&#x2F;strong&gt;: operações criptográficas são injetadas via trait
-objects (&lt;code&gt;Box&amp;lt;dyn Hasher&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;Box&amp;lt;dyn ManifestSigner&amp;gt;&lt;&#x2F;code&gt;,
-&lt;code&gt;Box&amp;lt;dyn ManifestVerifier&amp;gt;&lt;&#x2F;code&gt;), mantendo o crate core livre de dependências
-criptográficas concretas.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Feature flags&lt;&#x2F;strong&gt;: a feature &lt;code&gt;service&lt;&#x2F;code&gt; no tesseras-core controla a camada de
-aplicação assíncrona. As features &lt;code&gt;classical&lt;&#x2F;code&gt; e &lt;code&gt;erasure&lt;&#x2F;code&gt; no tesseras-crypto
-controlam quais algoritmos são compilados.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Manifesto em texto plano&lt;&#x2F;strong&gt;: interpretável sem qualquer biblioteca de formato
-binário, com prefixos de hash explícitos &lt;code&gt;blake3:&lt;&#x2F;code&gt; e layout legível por
-humanos.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;p&gt;A Fase 0 é a fundação local. O caminho adiante:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 1: Rede&lt;&#x2F;strong&gt; — Transporte QUIC (quinn), DHT Kademlia para descoberta de
-pares, travessia de NAT&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 2: Replicação&lt;&#x2F;strong&gt; — Codificação de apagamento Reed-Solomon pela rede,
-loops de reparo, reciprocidade bilateral (sem blockchain, sem tokens)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 3: Clientes&lt;&#x2F;strong&gt; — App Flutter mobile&#x2F;desktop via flutter_rust_bridge, API
-GraphQL, nó WASM no navegador&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4: Endurecimento&lt;&#x2F;strong&gt; — Assinaturas pós-quânticas ML-DSA, empacotamento
-para Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI no SourceHut&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;O formato tessera é estável. Tudo construído a partir daqui se conecta e estende
-o que existe hoje.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Olá, Mundo</title>
- <published>2026-02-13T00:00:00+00:00</published>
- <updated>2026-02-13T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/hello-world/"/>
- <id>https://tesseras.net/pt-br/news/hello-world/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/hello-world/">&lt;p&gt;Hoje anunciamos o projeto Tesseras: uma rede peer-to-peer para preservar
-memórias humanas através dos milênios.&lt;&#x2F;p&gt;
-&lt;p&gt;Tesseras é construído sobre uma ideia simples — suas fotos, gravações e escritos
-merecem sobreviver a qualquer empresa, plataforma ou formato de arquivo. Cada
-pessoa cria uma tessera, uma cápsula do tempo autocontida que a rede mantém viva
-através de ajuda mútua e redundância.&lt;&#x2F;p&gt;
-&lt;p&gt;O projeto está em seu estágio mais inicial. Estamos construindo a fundação:
-ferramentas para criar, verificar e exportar tesseras offline. A camada de rede,
-replicação e aplicativos virão em seguida.&lt;&#x2F;p&gt;
-&lt;p&gt;Se essa missão ressoa com você,
-&lt;a href=&quot;&#x2F;pt-br&#x2F;subscriptions&#x2F;&quot;&gt;entre na lista de discussão&lt;&#x2F;a&gt; ou navegue pelo
-&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras&quot;&gt;código-fonte&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
-</feed>
diff --git a/pt-br/atom.xml.gz b/pt-br/atom.xml.gz
deleted file mode 100644
index e577124..0000000
--- a/pt-br/atom.xml.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/contact/index.html b/pt-br/contact/index.html
deleted file mode 100644
index 24f4c23..0000000
--- a/pt-br/contact/index.html
+++ /dev/null
@@ -1,100 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Contato — Tesseras</title>
- <meta name="description" content="Entre em contato com o projeto Tesseras">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="Contato">
- <meta property="og:description" content="Entre em contato com o projeto Tesseras">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Contato">
- <meta name="twitter:description" content="Entre em contato com o projeto Tesseras">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;contact&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Contato</h2>
- <h3 id="listas-de-discussao">Listas de Discussão</h3>
-<p>A melhor forma de contatar o projeto é através das
-<a href="/pt-br/subscriptions/">listas de discussão</a>:</p>
-<ul>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-discuss">tesseras-discuss</a> — perguntas,
-suporte, discussão geral</li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-devel">tesseras-devel</a> — patches e
-desenvolvimento</li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-announce">tesseras-announce</a> —
-lançamentos e marcos</li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-security">tesseras-security</a> — relatos de
-vulnerabilidades</li>
-</ul>
-<h3 id="irc">IRC</h3>
-<p>Participe no <a rel="external" href="https://libera.chat/">Libera.Chat</a> no canal <strong>#tesseras</strong>
-(<a rel="external" href="https://web.libera.chat/#tesseras">webchat</a>).</p>
-<h3 id="relatorios-de-bugs">Relatórios de Bugs</h3>
-<p>Registre bugs e pedidos de funcionalidades no
-<a rel="external" href="https://todo.sr.ht/~ijanc/tesseras">ticket tracker</a>.</p>
-<h3 id="codigo-fonte">Código-Fonte</h3>
-<ul>
-<li><a rel="external" href="https://git.sr.ht/~ijanc/tesseras">SourceHut</a> (primário)</li>
-<li><a rel="external" href="https://github.com/ijanc/tesseras">GitHub</a> (espelho)</li>
-</ul>
-<h3 id="recursos">Recursos</h3>
-<ul>
-<li><a rel="external" href="https://tesseras.net/book/pt-br/">Livro</a> — documentação para usuários (em
-breve)</li>
-<li><a href="/pt-br/atom.xml">Feed Atom</a> — notícias do projeto</li>
-<li><a rel="external" href="https://sr.ht/~ijanc/tesseras/feed.rss">Feed SourceHut</a> — commits, tickets e
-atividade das listas</li>
-</ul>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/contact/index.html.gz b/pt-br/contact/index.html.gz
deleted file mode 100644
index 4bd847a..0000000
--- a/pt-br/contact/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/faq/index.html b/pt-br/faq/index.html
deleted file mode 100644
index 9c44e16..0000000
--- a/pt-br/faq/index.html
+++ /dev/null
@@ -1,121 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>FAQ — Tesseras</title>
- <meta name="description" content="Perguntas frequentes sobre o Tesseras">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="FAQ">
- <meta property="og:description" content="Perguntas frequentes sobre o Tesseras">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="FAQ">
- <meta name="twitter:description" content="Perguntas frequentes sobre o Tesseras">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;faq&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>FAQ</h2>
- <h3 id="o-que-e-uma-tessera">O que é uma tessera?</h3>
-<p>Uma tessera é uma cápsula do tempo autocontida de memórias — fotos, gravações de
-áudio, vídeo e texto — empacotada em um formato projetado para sobreviver
-independentemente de qualquer software, empresa ou infraestrutura. O nome vem
-das pequenas peças usadas em mosaicos romanos: cada peça é simples, mas juntas
-formam algo que perdura.</p>
-<h3 id="como-meus-dados-sobrevivem-se-meu-computador-morrer">Como meus dados sobrevivem se meu computador morrer?</h3>
-<p>Sua tessera é replicada em múltiplos nós na rede peer-to-peer do Tesseras.
-Utiliza codificação por apagamento (Reed-Solomon) para dividir seus dados em
-fragmentos redundantes. Mesmo que vários nós fiquem offline permanentemente, sua
-tessera pode ser reconstruída a partir dos fragmentos restantes.</p>
-<h3 id="meus-dados-sao-criptografados">Meus dados são criptografados?</h3>
-<p>Por padrão, não. O Tesseras prioriza disponibilidade sobre sigilo — o objetivo é
-que suas memórias sobrevivam, mesmo que o software para descriptografá-las não
-exista mais. Você pode marcar memórias individuais como privadas (criptografadas
-com AES-256-GCM) ou seladas (para serem abertas após uma data específica), mas
-memórias públicas e de círculo são armazenadas sem criptografia para maximizar
-suas chances de sobrevivência a longo prazo.</p>
-<h3 id="preciso-pagar-alguma-coisa">Preciso pagar alguma coisa?</h3>
-<p>Não. A rede funciona com ajuda mútua: você armazena fragmentos das tesseras de
-outras pessoas, e elas armazenam as suas. Não há tokens, blockchain ou taxas de
-assinatura. O único custo é o espaço de armazenamento que você contribui para a
-rede.</p>
-<h3 id="em-quais-plataformas-funciona">Em quais plataformas funciona?</h3>
-<p>Tesseras funciona em Linux, macOS, FreeBSD, OpenBSD, Windows, Android e iOS.
-Também há um visualizador no navegador e suporte para dispositivos IoT de baixo
-consumo (ESP32) como nós de armazenamento passivo.</p>
-<h3 id="qual-a-diferenca-do-ipfs-filecoin-ou-arweave">Qual a diferença do IPFS, Filecoin ou Arweave?</h3>
-<p>Tesseras é projetado especificamente para preservação de memórias pessoais, não
-armazenamento de arquivos de propósito geral. Diferenças principais:</p>
-<ul>
-<li><strong>Sem criptomoeda ou tokens</strong> — incentivos são baseados em reciprocidade
-bilateral, não mercados financeiros</li>
-<li><strong>Formato autodescritivo</strong> — cada tessera inclui instruções para decodificar a
-si mesma em múltiplos idiomas, para que possa ser compreendida séculos no
-futuro sem nenhum software especial</li>
-<li><strong>Disponibilidade sobre sigilo</strong> — a maioria dos dados é armazenada sem
-criptografia para maximizar a sobrevivência a longo prazo</li>
-<li><strong>Formatos de mídia mais simples possíveis</strong> — JPEG, WAV, WebM, texto puro —
-escolhidos por durabilidade, não recursos</li>
-</ul>
-<h3 id="quais-formatos-de-midia-sao-suportados">Quais formatos de mídia são suportados?</h3>
-<ul>
-<li><strong>Fotos:</strong> JPEG</li>
-<li><strong>Áudio:</strong> WAV PCM</li>
-<li><strong>Vídeo:</strong> WebM</li>
-<li><strong>Texto:</strong> UTF-8 texto puro</li>
-</ul>
-<p>Esses formatos foram escolhidos por máxima longevidade e amplo suporte.</p>
-<h3 id="posso-exportar-minha-tessera">Posso exportar minha tessera?</h3>
-<p>Sim. Uma tessera é um diretório padrão de arquivos. Você pode copiá-la para um
-pendrive, gravar em mídia óptica ou imprimir as partes de texto. O formato é
-projetado para ser legível sem nenhum software especial.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/faq/index.html.gz b/pt-br/faq/index.html.gz
deleted file mode 100644
index 9c826b1..0000000
--- a/pt-br/faq/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/index.html b/pt-br/index.html
deleted file mode 100644
index e9bb5d6..0000000
--- a/pt-br/index.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Tesseras — Preserve Your Memories Across Millennia</title>
- <meta name="description" content="Rede P2P para preservar memórias humanas através dos milênios">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="Tesseras">
- <meta property="og:description" content="Rede P2P para preservar memórias humanas através dos milênios">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Tesseras">
- <meta name="twitter:description" content="Rede P2P para preservar memórias humanas através dos milênios">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<p>Tesseras é uma rede peer-to-peer para preservar memórias humanas através dos
-milênios.</p>
-<h2 id="por-que-tesseras-existe">Por Que Tesseras Existe</h2>
-<p>Todos os anos, plataformas fecham, empresas falham e formatos de arquivo se
-tornam ilegíveis. Fotos pessoais desaparecem quando um serviço de nuvem encerra.
-Vídeos caseiros apodrecem em mídias obsoletas. Cartas se perdem em contas de
-e-mail abandonadas. Nossas memórias merecem mais do que depender de qualquer
-empresa, formato ou infraestrutura.</p>
-<h2 id="como-funciona">Como Funciona</h2>
-<p>Cada pessoa cria uma <strong>tessera</strong> — uma cápsula do tempo autocontida de memórias
-(fotos, áudio, vídeo, texto) que sobrevive independentemente.</p>
-<ul>
-<li><strong>Peer-to-peer</strong> — sua tessera é replicada através de uma rede de voluntários,
-não armazenada em servidores corporativos</li>
-<li><strong>Codificação por apagamento</strong> — seus dados são divididos em fragmentos
-redundantes para sobreviver a falhas de nós individuais</li>
-<li><strong>Sem dependência de empresa</strong> — a rede funciona com protocolos abertos,
-software livre e ajuda mútua</li>
-<li><strong>Formato autodescritivo</strong> — cada tessera contém tudo necessário para
-decodificar a si mesma, mesmo séculos no futuro</li>
-<li><strong>Código aberto</strong> — licença ISC, construído em Rust</li>
-</ul>
-<h2 id="status-atual">Status Atual</h2>
-<p>Tesseras está na Fase 4 — Resiliência e Escala. O formato base, as fundações
-criptográficas, a rede peer-to-peer, a replicação, a API GraphQL e o app Flutter
-estão construídos. Estamos agora trabalhando em Shamir's Secret Sharing para
-recuperação de chaves por herdeiros, NAT traversal avançado e ajuste de
-performance.</p>
-<p>Veja <a href="/pt-br/releases/">Lançamentos</a> para informações de download.</p>
-<h2 id="participe">Participe</h2>
-<ul>
-<li>Entre nas <a href="/pt-br/subscriptions/">listas de discussão</a></li>
-<li>Navegue pelo <a rel="external" href="https://git.sr.ht/~ijanc/tesseras">código-fonte</a></li>
-<li>Leia o <a href="/pt-br/faq/">FAQ</a></li>
-<li><a href="/pt-br/contact/">Fale conosco</a></li>
-</ul>
-
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/index.html.gz b/pt-br/index.html.gz
deleted file mode 100644
index cba8483..0000000
--- a/pt-br/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/atom.xml b/pt-br/news/atom.xml
deleted file mode 100644
index 99f3061..0000000
--- a/pt-br/news/atom.xml
+++ /dev/null
@@ -1,2101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-br">
- <title>Tesseras - Notícias</title>
- <subtitle>Rede P2P para preservar memórias humanas através dos milênios</subtitle>
- <link rel="self" type="application/atom+xml" href="https://tesseras.net/pt-br/news/atom.xml"/>
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/"/>
- <generator uri="https://www.getzola.org/">Zola</generator>
- <updated>2026-02-16T10:00:00+00:00</updated>
- <id>https://tesseras.net/pt-br/news/atom.xml</id>
- <entry xml:lang="pt-br">
- <title>Empacotando o Tesseras para Debian</title>
- <published>2026-02-16T10:00:00+00:00</published>
- <updated>2026-02-16T10:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/packaging-debian/"/>
- <id>https://tesseras.net/pt-br/news/packaging-debian/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/packaging-debian/">&lt;p&gt;O Tesseras agora inclui um pacote &lt;code&gt;.deb&lt;&#x2F;code&gt; para Debian e Ubuntu. Este post explica
-como compilar e instalar o pacote a partir do código-fonte usando &lt;code&gt;cargo-deb&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;pre-requisitos&quot;&gt;Pré-requisitos&lt;&#x2F;h2&gt;
-&lt;p&gt;Você precisa de uma toolchain Rust funcional e das bibliotecas de sistema
-necessárias:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo apt install build-essential pkg-config libsqlite3-dev
-rustup toolchain install stable
-cargo install cargo-deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;compilando&quot;&gt;Compilando&lt;&#x2F;h2&gt;
-&lt;p&gt;Clone o repositório e execute a recipe &lt;code&gt;just deb&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git clone https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras
-cd tesseras
-just deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Essa recipe faz três coisas:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Compila&lt;&#x2F;strong&gt; &lt;code&gt;tesd&lt;&#x2F;code&gt; (o daemon) e &lt;code&gt;tes&lt;&#x2F;code&gt; (o CLI) em modo release com
-&lt;code&gt;cargo build --release&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Gera completions de shell&lt;&#x2F;strong&gt; para bash, zsh e fish a partir do binário &lt;code&gt;tes&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Empacota&lt;&#x2F;strong&gt; tudo em um arquivo &lt;code&gt;.deb&lt;&#x2F;code&gt; com
-&lt;code&gt;cargo deb -p tesseras-daemon --no-build&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;O resultado é um arquivo &lt;code&gt;.deb&lt;&#x2F;code&gt; em &lt;code&gt;target&#x2F;debian&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;instalando&quot;&gt;Instalando&lt;&#x2F;h2&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo dpkg -i target&#x2F;debian&#x2F;tesseras-daemon_*.deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Se houver dependências faltando, corrija com:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo apt install -f
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;configuracao-pos-instalacao&quot;&gt;Configuração pós-instalação&lt;&#x2F;h2&gt;
-&lt;p&gt;O script &lt;code&gt;postinst&lt;&#x2F;code&gt; cria automaticamente um usuário de sistema &lt;code&gt;tesseras&lt;&#x2F;code&gt; e o
-diretório de dados &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;. Para usar o CLI sem sudo, adicione seu
-usuário ao grupo:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo usermod -aG tesseras $USER
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Faça logout e login novamente, depois inicie o daemon:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo systemctl enable --now tesd
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;o-que-o-pacote-inclui&quot;&gt;O que o pacote inclui&lt;&#x2F;h2&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Caminho&lt;&#x2F;th&gt;&lt;th&gt;Descrição&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tesd&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Daemon do nó completo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tes&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Cliente CLI&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;etc&#x2F;tesseras&#x2F;config.toml&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Configuração padrão (marcado como conffile)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;lib&#x2F;systemd&#x2F;system&#x2F;tesd.service&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Unit systemd com hardening de segurança&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Completions de shell&lt;&#x2F;td&gt;&lt;td&gt;bash, zsh e fish&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;h2 id=&quot;como-o-cargo-deb-funciona&quot;&gt;Como o cargo-deb funciona&lt;&#x2F;h2&gt;
-&lt;p&gt;Os metadados de empacotamento ficam em &lt;code&gt;crates&#x2F;tesseras-daemon&#x2F;Cargo.toml&lt;&#x2F;code&gt; na
-seção &lt;code&gt;[package.metadata.deb]&lt;&#x2F;code&gt;. Essa seção define:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;depends&lt;&#x2F;strong&gt; — dependências em tempo de execução: &lt;code&gt;libc6&lt;&#x2F;code&gt; e &lt;code&gt;libsqlite3-0&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;assets&lt;&#x2F;strong&gt; — arquivos incluídos no pacote (binários, config, unit systemd,
-completions de shell)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;conf-files&lt;&#x2F;strong&gt; — arquivos tratados como configuração (preservados na
-atualização)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;maintainer-scripts&lt;&#x2F;strong&gt; — scripts &lt;code&gt;postinst&lt;&#x2F;code&gt; e &lt;code&gt;postrm&lt;&#x2F;code&gt; em
-&lt;code&gt;packaging&#x2F;debian&#x2F;scripts&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;systemd-units&lt;&#x2F;strong&gt; — integração automática com systemd&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;O script &lt;code&gt;postinst&lt;&#x2F;code&gt; cria o usuário de sistema &lt;code&gt;tesseras&lt;&#x2F;code&gt; e o diretório de dados
-na instalação. O script &lt;code&gt;postrm&lt;&#x2F;code&gt; remove o usuário, grupo e diretório de dados
-apenas no &lt;code&gt;purge&lt;&#x2F;code&gt; (não na remoção simples).&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;hardening-do-systemd&quot;&gt;Hardening do systemd&lt;&#x2F;h2&gt;
-&lt;p&gt;A unit &lt;code&gt;tesd.service&lt;&#x2F;code&gt; inclui diretivas de hardening de segurança:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;ini&quot;&gt;NoNewPrivileges=true
-ProtectSystem=strict
-ProtectHome=true
-ReadWritePaths=&#x2F;var&#x2F;lib&#x2F;tesseras
-PrivateTmp=true
-PrivateDevices=true
-ProtectKernelTunables=true
-ProtectControlGroups=true
-RestrictSUIDSGID=true
-MemoryDenyWriteExecute=true
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;O daemon roda como o usuário não-privilegiado &lt;code&gt;tesseras&lt;&#x2F;code&gt; e só pode escrever em
-&lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;deploy-para-um-servidor-remoto&quot;&gt;Deploy para um servidor remoto&lt;&#x2F;h2&gt;
-&lt;p&gt;O justfile inclui uma recipe &lt;code&gt;deploy&lt;&#x2F;code&gt; para enviar o &lt;code&gt;.deb&lt;&#x2F;code&gt; a um host remoto:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;just deploy bootstrap1.tesseras.net
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Isso compila o &lt;code&gt;.deb&lt;&#x2F;code&gt;, copia via &lt;code&gt;scp&lt;&#x2F;code&gt;, instala com &lt;code&gt;dpkg -i&lt;&#x2F;code&gt; e reinicia o
-serviço &lt;code&gt;tesd&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;atualizando&quot;&gt;Atualizando&lt;&#x2F;h2&gt;
-&lt;p&gt;Depois de baixar novas mudanças, basta rodar &lt;code&gt;just deb&lt;&#x2F;code&gt; novamente e reinstalar:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git pull
-just deb
-sudo dpkg -i target&#x2F;debian&#x2F;tesseras-daemon_*.deb
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Empacotando o Tesseras para Arch Linux</title>
- <published>2026-02-16T09:00:00+00:00</published>
- <updated>2026-02-16T09:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/packaging-archlinux/"/>
- <id>https://tesseras.net/pt-br/news/packaging-archlinux/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/packaging-archlinux/">&lt;p&gt;O Tesseras agora inclui um PKGBUILD para Arch Linux. Este post explica como
-compilar e instalar o pacote a partir do código-fonte.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;pre-requisitos&quot;&gt;Pré-requisitos&lt;&#x2F;h2&gt;
-&lt;p&gt;Você precisa de uma toolchain Rust funcional e do grupo base-devel:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo pacman -S --needed base-devel sqlite
-rustup toolchain install stable
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;compilando&quot;&gt;Compilando&lt;&#x2F;h2&gt;
-&lt;p&gt;Clone o repositório e execute a recipe &lt;code&gt;just arch&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git clone https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras
-cd tesseras
-just arch
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Isso executa &lt;code&gt;makepkg -sf&lt;&#x2F;code&gt; dentro de &lt;code&gt;packaging&#x2F;archlinux&#x2F;&lt;&#x2F;code&gt;, que:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;prepare&lt;&#x2F;strong&gt; — baixa as dependências Cargo com &lt;code&gt;cargo fetch --locked&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;build&lt;&#x2F;strong&gt; — compila &lt;code&gt;tesd&lt;&#x2F;code&gt; e &lt;code&gt;tes&lt;&#x2F;code&gt; (o CLI) em modo release&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;package&lt;&#x2F;strong&gt; — instala binários, serviço systemd, configs sysusers&#x2F;tmpfiles,
-completions de shell (bash, zsh, fish) e um arquivo de configuração padrão&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;O resultado é um arquivo &lt;code&gt;.pkg.tar.zst&lt;&#x2F;code&gt; em &lt;code&gt;packaging&#x2F;archlinux&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;instalando&quot;&gt;Instalando&lt;&#x2F;h2&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo pacman -U packaging&#x2F;archlinux&#x2F;tesseras-*.pkg.tar.zst
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;configuracao-pos-instalacao&quot;&gt;Configuração pós-instalação&lt;&#x2F;h2&gt;
-&lt;p&gt;O pacote cria automaticamente um usuário e grupo de sistema &lt;code&gt;tesseras&lt;&#x2F;code&gt; via
-systemd-sysusers. Para usar o CLI sem sudo, adicione seu usuário ao grupo:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo usermod -aG tesseras $USER
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Faça logout e login novamente, depois inicie o daemon:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;sudo systemctl enable --now tesd
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;o-que-o-pacote-inclui&quot;&gt;O que o pacote inclui&lt;&#x2F;h2&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Caminho&lt;&#x2F;th&gt;&lt;th&gt;Descrição&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tesd&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Daemon do nó completo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;bin&#x2F;tes&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Cliente CLI&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;etc&#x2F;tesseras&#x2F;config.toml&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Configuração padrão (marcado como backup)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;systemd&#x2F;system&#x2F;tesd.service&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Unit systemd com hardening de segurança&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;sysusers.d&#x2F;tesseras.conf&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Definição do usuário de sistema&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;tmpfiles.d&#x2F;tesseras.conf&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Diretório de dados &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;tesseras&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Completions de shell&lt;&#x2F;td&gt;&lt;td&gt;bash, zsh e fish&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;h2 id=&quot;detalhes-do-pkgbuild&quot;&gt;Detalhes do PKGBUILD&lt;&#x2F;h2&gt;
-&lt;p&gt;O PKGBUILD compila diretamente a partir do checkout git local em vez de baixar
-um tarball. A variável de ambiente &lt;code&gt;TESSERAS_ROOT&lt;&#x2F;code&gt; aponta o makepkg para a raiz
-do workspace. O diretório target do Cargo é configurado para &lt;code&gt;$srcdir&#x2F;target&lt;&#x2F;code&gt;
-para manter os artefatos de build dentro do sandbox do makepkg.&lt;&#x2F;p&gt;
-&lt;p&gt;O pacote depende apenas de &lt;code&gt;sqlite&lt;&#x2F;code&gt; em tempo de execução e &lt;code&gt;cargo&lt;&#x2F;code&gt; em tempo de
-build.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;atualizando&quot;&gt;Atualizando&lt;&#x2F;h2&gt;
-&lt;p&gt;Depois de baixar novas mudanças, basta rodar &lt;code&gt;just arch&lt;&#x2F;code&gt; novamente e reinstalar:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git pull
-just arch
-sudo pacman -U packaging&#x2F;archlinux&#x2F;tesseras-*.pkg.tar.zst
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Deduplicacao de Armazenamento</title>
- <published>2026-02-15T23:00:00+00:00</published>
- <updated>2026-02-15T23:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-storage-deduplication/"/>
- <id>https://tesseras.net/pt-br/news/phase4-storage-deduplication/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-storage-deduplication/">&lt;p&gt;Quando multiplas tesseras compartilham a mesma foto, o mesmo clipe de audio ou
-os mesmos dados de fragmento, a camada de armazenamento antiga mantinha copias
-separadas de cada. Em um no armazenando milhares de tesseras para a rede, essa
-duplicacao se acumula rapidamente. A Fase 4 continua com deduplicacao de
-armazenamento: um armazenamento enderecavel por conteudo (CAS) que garante que
-cada dado unico seja armazenado exatamente uma vez em disco, independentemente
-de quantas tesseras o referenciam.&lt;&#x2F;p&gt;
-&lt;p&gt;O design e simples e comprovado: hash do conteudo com BLAKE3, usar o hash como
-nome do arquivo e manter uma contagem de referencias no SQLite. Quando duas
-tesseras incluem a mesma foto de 5 MB, um arquivo existe em disco com
-refcount 2. Quando uma tessera e deletada, o refcount cai para 1 e o arquivo
-permanece. Quando a ultima referencia e liberada, uma varredura periodica limpa
-o orfao.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construido&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Migracao do esquema CAS&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;migrations&#x2F;004_dedup.sql&lt;&#x2F;code&gt;) — Tres
-novas tabelas:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;cas_objects&lt;&#x2F;code&gt; — rastreia cada objeto no armazenamento: hash BLAKE3 (chave
-primaria), tamanho em bytes, contagem de referencias e timestamp de criacao&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;blob_refs&lt;&#x2F;code&gt; — mapeia identificadores logicos de blobs (hash da tessera + hash
-da memoria + nome do arquivo) para hashes CAS, substituindo a convencao antiga
-de caminhos no sistema de arquivos&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;fragment_refs&lt;&#x2F;code&gt; — mapeia identificadores logicos de fragmentos (hash da
-tessera + indice do fragmento) para hashes CAS, substituindo o antigo layout
-do diretorio &lt;code&gt;fragments&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Indices nas colunas de hash garantem lookups O(1) durante leituras e contagem de
-referencias.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;CasStore&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;cas.rs&lt;&#x2F;code&gt;) — O motor central de armazenamento
-enderecavel por conteudo. Arquivos sao armazenados sob um diretorio de prefixo
-de dois niveis: &lt;code&gt;&amp;lt;raiz&amp;gt;&#x2F;&amp;lt;prefixo-hex-2-chars&amp;gt;&#x2F;&amp;lt;hash-completo&amp;gt;.blob&lt;&#x2F;code&gt;. O
-armazenamento fornece cinco operacoes:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;put(hash, data)&lt;&#x2F;code&gt; — escreve dados em disco se ainda nao presente, incrementa o
-refcount. Retorna se ocorreu um hit de deduplicacao.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;get(hash)&lt;&#x2F;code&gt; — le dados do disco pelo hash&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;release(hash)&lt;&#x2F;code&gt; — decrementa o refcount. Se chegar a zero, o arquivo em disco
-e deletado imediatamente.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;contains(hash)&lt;&#x2F;code&gt; — verifica existencia sem ler&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;ref_count(hash)&lt;&#x2F;code&gt; — retorna a contagem de referencias atual&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Todas as operacoes sao atomicas dentro de uma unica transacao SQLite. O refcount
-e a fonte de verdade — se o refcount diz que o objeto existe, o arquivo deve
-estar em disco.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;FsBlobStore com CAS&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;blob.rs&lt;&#x2F;code&gt;) — Reescrito para
-delegar todo armazenamento ao CAS. Quando um blob e escrito, seu hash BLAKE3 e
-computado e passado para &lt;code&gt;cas.put()&lt;&#x2F;code&gt;. Uma linha em &lt;code&gt;blob_refs&lt;&#x2F;code&gt; mapeia o caminho
-logico (tessera + memoria + arquivo) para o hash CAS. Leituras buscam o hash CAS
-via &lt;code&gt;blob_refs&lt;&#x2F;code&gt; e leem de &lt;code&gt;cas.get()&lt;&#x2F;code&gt;. Deletar uma tessera libera todas as suas
-referencias de blob em uma unica transacao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;FsFragmentStore com CAS&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;fragment.rs&lt;&#x2F;code&gt;) — Mesmo padrao
-para fragmentos codificados com erasure coding. O checksum BLAKE3 de cada
-fragmento ja e computado durante a codificacao Reed-Solomon, entao e usado
-diretamente como chave CAS. A verificacao de fragmentos agora checa o hash CAS
-ao inves de recomputar do zero — se o CAS diz que os dados estao intactos,
-estao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Coletor de lixo sweep&lt;&#x2F;strong&gt; (&lt;code&gt;cas.rs:sweep()&lt;&#x2F;code&gt;) — Uma passagem periodica de GC que
-trata tres casos limite que o caminho normal de refcount nao consegue:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Arquivos orfaos&lt;&#x2F;strong&gt; — arquivos em disco sem linha correspondente em
-&lt;code&gt;cas_objects&lt;&#x2F;code&gt;. Pode acontecer apos um crash durante escrita. Arquivos com
-menos de 1 hora sao pulados (periodo de graca para escritas em andamento);
-orfaos mais antigos sao deletados.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Refcounts vazados&lt;&#x2F;strong&gt; — linhas em &lt;code&gt;cas_objects&lt;&#x2F;code&gt; com refcount zero que nao
-foram limpas (ex: se o processo morreu entre decrementar e deletar). Essas
-linhas sao removidas.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Idempotente&lt;&#x2F;strong&gt; — executar sweep duas vezes produz o mesmo resultado.&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;O sweep e conectado ao loop de reparo existente em &lt;code&gt;tesseras-replication&lt;&#x2F;code&gt;, entao
-roda automaticamente a cada 24 horas junto com as verificacoes de saude dos
-fragmentos.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Migracao do layout antigo&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;migration.rs&lt;&#x2F;code&gt;) — Uma
-estrategia de migracao copy-first que move dados do layout antigo baseado em
-diretorios (&lt;code&gt;blobs&#x2F;&amp;lt;tessera&amp;gt;&#x2F;&amp;lt;memoria&amp;gt;&#x2F;&amp;lt;arquivo&amp;gt;&lt;&#x2F;code&gt; e
-&lt;code&gt;fragments&#x2F;&amp;lt;tessera&amp;gt;&#x2F;&amp;lt;indice&amp;gt;.shard&lt;&#x2F;code&gt;) para o CAS. A migracao:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;Verifica a versao de armazenamento em &lt;code&gt;storage_meta&lt;&#x2F;code&gt; (versao 1 = layout
-antigo, versao 2 = CAS)&lt;&#x2F;li&gt;
-&lt;li&gt;Percorre os diretorios antigos &lt;code&gt;blobs&#x2F;&lt;&#x2F;code&gt; e &lt;code&gt;fragments&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;Computa hashes BLAKE3 e insere no CAS via &lt;code&gt;put()&lt;&#x2F;code&gt; — duplicatas sao
-automaticamente deduplicadas&lt;&#x2F;li&gt;
-&lt;li&gt;Cria entradas correspondentes em &lt;code&gt;blob_refs&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;fragment_refs&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;Remove diretorios antigos somente apos todos os dados estarem seguros no CAS&lt;&#x2F;li&gt;
-&lt;li&gt;Atualiza a versao de armazenamento para 2&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;A migracao roda na inicializacao do daemon, e idempotente (segura para
-re-executar) e reporta estatisticas: arquivos migrados, duplicatas encontradas,
-bytes economizados.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Metricas Prometheus&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — Dez novas metricas
-para observabilidade:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metrica&lt;&#x2F;th&gt;&lt;th&gt;Descricao&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_objects_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Total de objetos unicos no CAS&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_bytes_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Total de bytes armazenados&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_dedup_hits_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Numero de escritas que encontraram um objeto existente&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_bytes_saved_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bytes economizados por deduplicacao&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_refcount_deletions_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Objetos deletados quando refcount chegou a zero&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_orphans_cleaned_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Arquivos orfaos removidos pelo sweep&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_leaked_refs_cleaned_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Linhas de refcount vazadas limpas&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_skipped_young_total&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Orfaos jovens pulados (periodo de graca)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;cas_gc_sweep_duration_seconds&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Tempo gasto no sweep GC&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;&lt;strong&gt;Testes baseados em propriedades&lt;&#x2F;strong&gt; — Dois testes proptest verificam invariantes
-do CAS sob entradas aleatorias:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;refcount_matches_actual_refs&lt;&#x2F;code&gt; — apos N operacoes aleatorias de put&#x2F;release, o
-refcount sempre corresponde ao numero real de referencias pendentes&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;cas_path_is_deterministic&lt;&#x2F;code&gt; — o mesmo hash sempre produz o mesmo caminho no
-sistema de arquivos&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Atualizacao de testes de integracao&lt;&#x2F;strong&gt; — Todos os testes de integracao em
-&lt;code&gt;tesseras-core&lt;&#x2F;code&gt;, &lt;code&gt;tesseras-replication&lt;&#x2F;code&gt;, &lt;code&gt;tesseras-embedded&lt;&#x2F;code&gt; e &lt;code&gt;tesseras-cli&lt;&#x2F;code&gt;
-atualizados para os novos construtores com CAS. Testes de deteccao de
-adulteracao atualizados para funcionar com o layout de diretorio CAS.&lt;&#x2F;p&gt;
-&lt;p&gt;347 testes passam em todo o workspace. Clippy limpo com &lt;code&gt;-D warnings&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisoes de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 como chave CAS&lt;&#x2F;strong&gt;: o hash de conteudo que ja computamos para
-verificacao de integridade serve tambem como chave de deduplicacao. Nenhuma
-etapa adicional de hashing — o hash computado durante &lt;code&gt;create&lt;&#x2F;code&gt; ou &lt;code&gt;replicate&lt;&#x2F;code&gt;
-e reutilizado como endereco CAS.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Refcount SQLite ao inves de reflinks do sistema de arquivos&lt;&#x2F;strong&gt;: consideramos
-usar copy-on-write no nivel do sistema de arquivos (reflinks em btrfs&#x2F;XFS),
-mas isso amarraria o Tesseras a sistemas de arquivos especificos. Refcounting
-em SQLite funciona em qualquer sistema de arquivos, incluindo FAT32 em
-pendrives baratos e ext4 em Raspberry Pis.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Diretorios de prefixo hexadecimal de dois niveis&lt;&#x2F;strong&gt;: armazenar todos os
-objetos CAS em um diretorio plano desaceleraria sistemas de arquivos com
-milhoes de entradas. A divisao &lt;code&gt;&amp;lt;prefixo 2 chars&amp;gt;&#x2F;&lt;&#x2F;code&gt; limita qualquer diretorio
-individual a ~65k entradas antes de um segundo nivel ser necessario. Isso
-segue a abordagem usada pelo object store do Git.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Periodo de graca para arquivos orfaos&lt;&#x2F;strong&gt;: o sweep GC pula arquivos com menos
-de 1 hora para evitar deletar objetos sendo escritos por uma operacao
-concorrente. Esta e uma escolha pragmatica — troca uma pequena janela de
-potenciais orfaos por seguranca contra crashes sem exigir fsync ou commit de
-duas fases.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Migracao copy-first&lt;&#x2F;strong&gt;: a migracao copia dados para o CAS antes de remover
-diretorios antigos. Se o processo for interrompido, os dados antigos
-permanecem intactos e a migracao pode ser re-executada. Isso e mais lento que
-mover arquivos mas garante zero perda de dados.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Sweep no loop de reparo&lt;&#x2F;strong&gt;: ao inves de adicionar um timer separado de GC, o
-sweep CAS aproveita o loop de reparo existente de 24 horas. Isso mantem o
-daemon simples — um unico ciclo de manutencao em segundo plano cuida tanto da
-saude dos fragmentos quanto da limpeza de armazenamento.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuacao&lt;&#x2F;strong&gt; — auditorias de seguranca, empacotamento para OS
-(Alpine, Arch, Debian, OpenBSD, FreeBSD)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploracao e Cultura&lt;&#x2F;strong&gt; — navegador publico de tesseras por
-era&#x2F;localizacao&#x2F;tema&#x2F;idioma, curadoria institucional, integracao genealogica
-(FamilySearch, Ancestry), exportacao para midia fisica (M-DISC, microfilme,
-papel livre de acido com QR), contexto assistido por IA&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;A deduplicacao de armazenamento completa a historia de eficiencia de
-armazenamento do Tesseras. Um no que armazena fragmentos para milhares de
-usuarios — comum para nos institucionais e nos completos sempre ligados — agora
-paga o custo de disco apenas por dados unicos. Combinado com codificacao de
-apagamento Reed-Solomon (que ja minimiza redundancia no nivel da rede), o
-sistema alcanca armazenamento eficiente tanto nas camadas local quanto
-distribuida.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Onboarding de Nos Institucionais</title>
- <published>2026-02-15T22:00:00+00:00</published>
- <updated>2026-02-15T22:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-institutional-onboarding/"/>
- <id>https://tesseras.net/pt-br/news/phase4-institutional-onboarding/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-institutional-onboarding/">&lt;p&gt;Uma rede P2P composta apenas por individuos e fragil. Discos rigidos morrem,
-celulares sao perdidos, pessoas perdem interesse. A sobrevivencia a longo prazo
-das memorias da humanidade depende de instituicoes — bibliotecas, arquivos,
-museus, universidades — que medem seus tempos de vida em seculos. A Fase 4
-continua com o onboarding de nos institucionais: organizacoes verificadas agora
-podem prometer armazenamento, manter indices de busca e participar da rede com
-uma identidade distinta.&lt;&#x2F;p&gt;
-&lt;p&gt;O design segue um principio de confiar mas verificar: instituicoes se
-identificam via registros DNS TXT (o mesmo mecanismo usado por SPF, DKIM e DMARC
-para email), prometem um orcamento de armazenamento e recebem isencoes de
-reciprocidade para que possam armazenar fragmentos para outros sem esperar nada
-em troca. Em contrapartida, a rede trata seus fragmentos como replicas de maior
-qualidade e limita a dependencia excessiva de qualquer instituicao individual
-atraves de restricoes de diversidade.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construido&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Bits de capacidade&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;network.rs&lt;&#x2F;code&gt;) — Dois novos flags
-adicionados ao bitfield &lt;code&gt;Capabilities&lt;&#x2F;code&gt;: &lt;code&gt;INSTITUTIONAL&lt;&#x2F;code&gt; (bit 7) e &lt;code&gt;SEARCH_INDEX&lt;&#x2F;code&gt;
-(bit 8). Um novo construtor &lt;code&gt;institutional_default()&lt;&#x2F;code&gt; retorna o conjunto
-completo de capacidades da Fase 2 mais esses dois bits e &lt;code&gt;RELAY&lt;&#x2F;code&gt;. Nos normais
-anunciam &lt;code&gt;phase2_default()&lt;&#x2F;code&gt; que nao inclui flags institucionais. Testes de
-roundtrip de serializacao verificam que os novos bits sobrevivem a codificacao
-MessagePack.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Tipos de busca&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;search.rs&lt;&#x2F;code&gt;) — Tres novos tipos de dominio
-para o subsistema de busca:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;SearchFilters&lt;&#x2F;code&gt; — parametros de consulta: &lt;code&gt;memory_type&lt;&#x2F;code&gt;, &lt;code&gt;visibility&lt;&#x2F;code&gt;,
-&lt;code&gt;language&lt;&#x2F;code&gt;, &lt;code&gt;date_range&lt;&#x2F;code&gt;, &lt;code&gt;geo&lt;&#x2F;code&gt; (bounding box), &lt;code&gt;page&lt;&#x2F;code&gt;, &lt;code&gt;page_size&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;SearchHit&lt;&#x2F;code&gt; — um resultado individual: hash do conteudo mais um
-&lt;code&gt;MetadataExcerpt&lt;&#x2F;code&gt; (titulo, descricao, tipo de memoria, data de criacao,
-visibilidade, idioma, tags)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;GeoFilter&lt;&#x2F;code&gt; — bounding box com &lt;code&gt;min_lat&lt;&#x2F;code&gt;, &lt;code&gt;max_lat&lt;&#x2F;code&gt;, &lt;code&gt;min_lon&lt;&#x2F;code&gt;, &lt;code&gt;max_lon&lt;&#x2F;code&gt; para
-consultas espaciais&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Todos os tipos derivam &lt;code&gt;Serialize&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Deserialize&lt;&#x2F;code&gt; para transporte e
-&lt;code&gt;Clone&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Debug&lt;&#x2F;code&gt; para diagnostico.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Configuracao institucional do daemon&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;) — Uma nova secao
-&lt;code&gt;[institutional]&lt;&#x2F;code&gt; no TOML com &lt;code&gt;domain&lt;&#x2F;code&gt; (o dominio DNS a verificar),
-&lt;code&gt;pledge_bytes&lt;&#x2F;code&gt; (compromisso de armazenamento em bytes) e &lt;code&gt;search_enabled&lt;&#x2F;code&gt;
-(toggle para o indice FTS5). O metodo &lt;code&gt;to_dht_config()&lt;&#x2F;code&gt; agora define
-&lt;code&gt;Capabilities::institutional_default()&lt;&#x2F;code&gt; quando a configuracao institucional esta
-presente, para que nos institucionais anunciem os bits de capacidade corretos em
-respostas Pong.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Verificacao DNS TXT&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;institutional.rs&lt;&#x2F;code&gt;) — Resolucao DNS assincrona
-usando &lt;code&gt;hickory-resolver&lt;&#x2F;code&gt; para verificar identidade institucional. O daemon
-consulta registros TXT em &lt;code&gt;_tesseras.&amp;lt;dominio&amp;gt;&lt;&#x2F;code&gt; e analisa campos chave-valor:
-&lt;code&gt;v&lt;&#x2F;code&gt; (versao), &lt;code&gt;node&lt;&#x2F;code&gt; (node ID em hexadecimal) e &lt;code&gt;pledge&lt;&#x2F;code&gt; (compromisso de
-armazenamento em bytes). A verificacao checa:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;Um registro TXT existe em &lt;code&gt;_tesseras.&amp;lt;dominio&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;O campo &lt;code&gt;node&lt;&#x2F;code&gt; corresponde ao node ID do proprio daemon&lt;&#x2F;li&gt;
-&lt;li&gt;O campo &lt;code&gt;pledge&lt;&#x2F;code&gt; esta presente e e valido&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;Na inicializacao, o daemon tenta a verificacao DNS. Se bem-sucedida, o no roda
-com capacidades institucionais. Se falhar, o no registra um aviso e faz
-downgrade para um no completo normal — sem crash, sem intervencao manual.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Comando CLI de setup&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;institutional.rs&lt;&#x2F;code&gt;) — Um novo
-subcomando &lt;code&gt;institutional setup&lt;&#x2F;code&gt; que guia operadores pelo onboarding:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;Le a identidade do no a partir do diretorio de dados&lt;&#x2F;li&gt;
-&lt;li&gt;Solicita nome de dominio e tamanho do pledge&lt;&#x2F;li&gt;
-&lt;li&gt;Gera o registro DNS TXT exato a adicionar:
-&lt;code&gt;v=tesseras1 node=&amp;lt;hex&amp;gt; pledge=&amp;lt;bytes&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
-&lt;li&gt;Escreve a secao institucional no arquivo de configuracao do daemon&lt;&#x2F;li&gt;
-&lt;li&gt;Imprime os proximos passos: adicionar o registro TXT, reiniciar o daemon&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;&lt;strong&gt;Indice de busca SQLite&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&lt;&#x2F;code&gt;) — Uma migracao
-(&lt;code&gt;003_institutional.sql&lt;&#x2F;code&gt;) que cria tres estruturas:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;search_content&lt;&#x2F;code&gt; — uma tabela virtual FTS5 para busca full-text sobre
-metadados de tesseras (titulo, descricao, criador, tags, idioma)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;geo_index&lt;&#x2F;code&gt; — uma tabela virtual R-tree para consultas espaciais de bounding
-box sobre latitude&#x2F;longitude&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;geo_map&lt;&#x2F;code&gt; — uma tabela de mapeamento ligando IDs de linhas do R-tree a hashes
-de conteudo&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;O adaptador &lt;code&gt;SqliteSearchIndex&lt;&#x2F;code&gt; implementa o port trait &lt;code&gt;SearchIndex&lt;&#x2F;code&gt; com
-&lt;code&gt;index_tessera()&lt;&#x2F;code&gt; (inserir&#x2F;atualizar) e &lt;code&gt;search()&lt;&#x2F;code&gt; (consultar com filtros).
-Consultas FTS5 suportam busca em linguagem natural; consultas geo usam
-&lt;code&gt;INTERSECT&lt;&#x2F;code&gt; do R-tree para lookups de bounding box. Resultados sao ranqueados
-por score de relevancia do FTS5.&lt;&#x2F;p&gt;
-&lt;p&gt;A migracao tambem adiciona uma coluna &lt;code&gt;is_institutional&lt;&#x2F;code&gt; a tabela &lt;code&gt;reciprocity&lt;&#x2F;code&gt;,
-tratada de forma idempotente via checagens &lt;code&gt;pragma_table_info&lt;&#x2F;code&gt; (o
-&lt;code&gt;ALTER TABLE ADD COLUMN&lt;&#x2F;code&gt; do SQLite nao tem &lt;code&gt;IF NOT EXISTS&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Bypass de reciprocidade&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-replication&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) — Nos
-institucionais sao isentos de checagens de reciprocidade. Quando
-&lt;code&gt;receive_fragment()&lt;&#x2F;code&gt; e chamado, se o node ID do remetente esta marcado como
-institucional no ledger de reciprocidade, a checagem de saldo e ignorada
-completamente. Isso significa que instituicoes podem armazenar fragmentos para
-toda a rede sem precisar &quot;ganhar&quot; creditos primeiro — sua identidade verificada
-por DNS e compromisso de armazenamento servem como credencial.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Restricao de diversidade por tipo de no&lt;&#x2F;strong&gt;
-(&lt;code&gt;tesseras-replication&#x2F;src&#x2F;distributor.rs&lt;&#x2F;code&gt;) — Uma nova funcao
-&lt;code&gt;apply_institutional_diversity()&lt;&#x2F;code&gt; limita quantas replicas de uma unica tessera
-podem ir para nos institucionais. O limite e &lt;code&gt;ceil(fator_replicacao &#x2F; 3.5)&lt;&#x2F;code&gt; —
-com o padrao &lt;code&gt;r=7&lt;&#x2F;code&gt;, no maximo 2 de 7 replicas vao para instituicoes. Isso impede
-que a rede se torne dependente de um pequeno numero de grandes instituicoes: se
-os servidores de uma universidade cairem, pelo menos 5 replicas permanecem em
-nos independentes.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Extensoes de mensagens DHT&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;message.rs&lt;&#x2F;code&gt;) — Duas novas
-variantes de mensagem:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Mensagem&lt;&#x2F;th&gt;&lt;th&gt;Proposito&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;Search&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Cliente envia string de consulta, filtros e numero da pagina&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;SearchResult&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;No institucional responde com resultados e contagem total&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;A funcao &lt;code&gt;encode()&lt;&#x2F;code&gt; foi trocada de serializacao MessagePack posicional para
-nomeada (&lt;code&gt;rmp_serde::to_vec_named&lt;&#x2F;code&gt;) para lidar corretamente com campos opcionais
-de &lt;code&gt;SearchFilters&lt;&#x2F;code&gt; — a codificacao posicional quebra quando
-&lt;code&gt;skip_serializing_if&lt;&#x2F;code&gt; omite campos.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Metricas Prometheus&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — Oito metricas especificas
-institucionais:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_pledge_bytes&lt;&#x2F;code&gt; — compromisso de armazenamento
-configurado&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_stored_bytes&lt;&#x2F;code&gt; — bytes realmente armazenados&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_pledge_utilization_ratio&lt;&#x2F;code&gt; — razao armazenado&#x2F;prometido&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_peers_served&lt;&#x2F;code&gt; — peers unicos que receberam fragmentos&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_search_index_total&lt;&#x2F;code&gt; — tesseras no indice de busca&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_search_queries_total&lt;&#x2F;code&gt; — consultas de busca recebidas&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_dns_verification_status&lt;&#x2F;code&gt; — 1 se verificado por DNS, 0
-caso contrario&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tesseras_institutional_dns_verification_last&lt;&#x2F;code&gt; — timestamp Unix da ultima
-verificacao&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Testes de integracao&lt;&#x2F;strong&gt; — Dois testes em
-&lt;code&gt;tesseras-replication&#x2F;tests&#x2F;integration.rs&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;institutional_peer_bypasses_reciprocity&lt;&#x2F;code&gt; — verifica que um peer institucional
-com deficit massivo (-999.999 de saldo) ainda pode armazenar fragmentos,
-enquanto um peer nao institucional com o mesmo deficit e rejeitado&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;institutional_node_accepts_fragment_despite_deficit&lt;&#x2F;code&gt; — teste async completo
-usando &lt;code&gt;ReplicationService&lt;&#x2F;code&gt; com DHT, fragment store, reciprocity ledger e blob
-store mockados: envia um fragmento de um remetente institucional e verifica
-que e aceito&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;322 testes passam em todo o workspace. Clippy limpo com &lt;code&gt;-D warnings&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisoes de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;DNS TXT ao inves de PKI ou blockchain&lt;&#x2F;strong&gt;: DNS e universalmente implantado,
-universalmente compreendido e ja usado para verificacao de dominio (SPF, DKIM,
-Let&#x27;s Encrypt). Instituicoes ja gerenciam DNS. Nenhuma autoridade
-certificadora, nenhum token, nenhuma transacao on-chain — apenas um registro
-TXT. Se uma instituicao perder controle de seu dominio, a verificacao
-naturalmente falha na proxima checagem.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Degradacao graciosa em falha DNS&lt;&#x2F;strong&gt;: se a verificacao DNS falha na
-inicializacao, o daemon faz downgrade para um no completo normal ao inves de
-recusar iniciar. Isso previne incidentes operacionais — uma misconfiguracao
-DNS nao deveria tirar um no do ar.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Limite de diversidade em &lt;code&gt;ceil(r &#x2F; 3.5)&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: com &lt;code&gt;r=7&lt;&#x2F;code&gt;, no maximo 2 replicas
-vao para instituicoes. Isso e conservador — garante que a rede nunca dependa
-de instituicoes para quorum majoritario, enquanto ainda se beneficia de sua
-capacidade de armazenamento e uptime.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Codificacao MessagePack nomeada&lt;&#x2F;strong&gt;: trocar de codificacao posicional para
-nomeada adiciona ~15% de overhead por mensagem mas elimina uma classe de bugs
-de serializacao quando campos opcionais estao presentes. O DHT nao e limitado
-por largura de banda no nivel de mensagem, entao o tradeoff vale a pena.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Isencao de reciprocidade ao inves de concessao de creditos&lt;&#x2F;strong&gt;: ao inves de
-dar as instituicoes um saldo inicial grande de creditos (que e arbitrario e
-precisa de ajuste), isentamos completamente. Sua identidade verificada por DNS
-e compromisso publico de armazenamento substituem o mecanismo de reciprocidade
-bilateral.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;FTS5 + R-tree no SQLite&lt;&#x2F;strong&gt;: busca full-text e indexacao espacial sao
-embutidas no SQLite como extensoes carregaveis. Nenhum motor de busca externo
-(Elasticsearch, Meilisearch) necessario. Isso mantem o deploy como um unico
-binario com um unico arquivo de banco de dados — critico para operadores
-institucionais que podem nao ter uma equipe de DevOps.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuacao&lt;&#x2F;strong&gt; — deduplicacao de armazenamento (armazenamento
-enderecavel por conteudo com BLAKE3), auditorias de seguranca, empacotamento
-para OS (Alpine, Arch, Debian, OpenBSD, FreeBSD)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploracao e Cultura&lt;&#x2F;strong&gt; — navegador publico de tesseras por
-era&#x2F;localizacao&#x2F;tema&#x2F;idioma, curadoria institucional, integracao genealogica
-(FamilySearch, Ancestry), exportacao para midia fisica (M-DISC, microfilme,
-papel livre de acido com QR), contexto assistido por IA&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;O onboarding institucional fecha uma lacuna critica no modelo de preservacao do
-Tesseras. Nos individuais fornecem resiliencia de base — milhares de
-dispositivos ao redor do globo, cada um armazenando alguns fragmentos. Nos
-institucionais fornecem ancoragem — organizacoes com infraestrutura
-profissional, armazenamento redundante e horizontes operacionais de multiplas
-decadas. Juntos, formam uma rede onde memorias podem sobreviver tanto a
-dispositivos individuais quanto a instituicoes individuais.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Tuning de Performance</title>
- <published>2026-02-15T20:00:00+00:00</published>
- <updated>2026-02-15T20:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-performance-tuning/"/>
- <id>https://tesseras.net/pt-br/news/phase4-performance-tuning/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-performance-tuning/">&lt;p&gt;Uma rede P2P que atravessa NATs mas engasga com seu proprio I&#x2F;O nao serve de
-muito. A Fase 4 continua com tuning de performance: centralizacao da
-configuracao do banco de dados, cache de blobs de fragmentos em memoria,
-gerenciamento de ciclo de vida de conexoes QUIC e eliminacao de leituras
-desnecessarias de disco no hot path de atestacao.&lt;&#x2F;p&gt;
-&lt;p&gt;O principio orientador foi o mesmo do resto do Tesseras: fazer a coisa mais
-simples que realmente funciona. Sem alocadores customizados, sem estruturas de
-dados lock-free, sem complexidade prematura. Um &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; centralizado, um
-cache LRU, um reaper de conexoes e uma correcao pontual para evitar reler blobs
-que ja tinham checksum calculado.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construido&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Configuracao SQLite centralizada&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;database.rs&lt;&#x2F;code&gt;) — Um
-novo struct &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; e funcoes &lt;code&gt;open_database()&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;open_in_memory()&lt;&#x2F;code&gt; que
-aplicam todos os pragmas SQLite em um unico lugar: journal mode WAL, foreign
-keys, modo synchronous (NORMAL por padrao, FULL para hardware instavel como
-RPi + cartao SD), busy timeout, tamanho do cache de paginas e intervalo de
-autocheckpoint WAL. Anteriormente, cada ponto de chamada abria uma conexao e
-aplicava pragmas ad hoc. Agora o daemon, CLI e testes passam todos pelo mesmo
-caminho. 7 testes cobrindo foreign keys, busy timeout, journal mode, migracoes,
-modos synchronous e criacao de arquivos WAL em disco.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Cache LRU de fragmentos&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;cache.rs&lt;&#x2F;code&gt;) — Um
-&lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt; que envolve qualquer &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; com um cache LRU
-ciente de bytes. Blobs de fragmentos sao cacheados na leitura e invalidados na
-escrita ou exclusao. Quando o cache excede seu limite de bytes configurado, as
-entradas menos recentemente usadas sao removidas. O cache e transparente: ele
-proprio implementa &lt;code&gt;FragmentStore&lt;&#x2F;code&gt;, entao o resto da pilha nao sabe que esta la.
-Metricas Prometheus opcionais rastreiam hits, misses e uso atual de bytes. 3
-testes: hit no cache evita leitura interna, store invalida cache, remocao quando
-excede bytes maximos.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Metricas Prometheus de storage&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-storage&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — Um
-struct &lt;code&gt;StorageMetrics&lt;&#x2F;code&gt; com tres contadores&#x2F;gauges: &lt;code&gt;fragment_cache_hits&lt;&#x2F;code&gt;,
-&lt;code&gt;fragment_cache_misses&lt;&#x2F;code&gt; e &lt;code&gt;fragment_cache_bytes&lt;&#x2F;code&gt;. Registrado no registry
-Prometheus e conectado ao cache de fragmentos via &lt;code&gt;with_metrics()&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Correcao do hot path de atestacao&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-replication&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) —
-O fluxo de atestacao anteriormente lia cada blob de fragmento do disco e
-recalculava seu checksum BLAKE3. Como &lt;code&gt;list_fragments()&lt;&#x2F;code&gt; ja retorna &lt;code&gt;FragmentId&lt;&#x2F;code&gt;
-com um checksum armazenado, a correcao e trivial: usar &lt;code&gt;frag.checksum&lt;&#x2F;code&gt; ao inves
-de &lt;code&gt;blake3::hash(&amp;amp;data)&lt;&#x2F;code&gt;. Isso elimina uma leitura de disco por fragmento
-durante atestacao — para uma tessera com 100 fragmentos, sao 100 leituras a
-menos. Um teste com &lt;code&gt;expect_read_fragment().never()&lt;&#x2F;code&gt; verifica que nenhuma
-leitura de blob acontece durante atestacao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Ciclo de vida do pool de conexoes QUIC&lt;&#x2F;strong&gt;
-(&lt;code&gt;tesseras-net&#x2F;src&#x2F;quinn_transport.rs&lt;&#x2F;code&gt;) — Um struct &lt;code&gt;PoolConfig&lt;&#x2F;code&gt; controlando
-maximo de conexoes, timeout de inatividade e intervalo do reaper.
-&lt;code&gt;PooledConnection&lt;&#x2F;code&gt; envolve cada &lt;code&gt;quinn::Connection&lt;&#x2F;code&gt; com um timestamp
-&lt;code&gt;last_used&lt;&#x2F;code&gt;. Quando o pool atinge capacidade maxima, a conexao inativa mais
-antiga e removida antes de abrir uma nova. Uma tarefa reaper em background
-(Tokio spawn) periodicamente fecha conexoes que ficaram inativas alem do
-timeout. 4 novas metricas de pool: &lt;code&gt;tesseras_conn_pool_size&lt;&#x2F;code&gt;, &lt;code&gt;pool_hits_total&lt;&#x2F;code&gt;,
-&lt;code&gt;pool_misses_total&lt;&#x2F;code&gt;, &lt;code&gt;pool_evictions_total&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Integracao no daemon&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;, &lt;code&gt;main.rs&lt;&#x2F;code&gt;) — Uma nova secao
-&lt;code&gt;[performance]&lt;&#x2F;code&gt; na configuracao TOML com campos para tamanho de cache SQLite,
-modo synchronous, busy timeout, tamanho de cache de fragmentos, maximo de
-conexoes, timeout de inatividade e intervalo do reaper. O &lt;code&gt;main()&lt;&#x2F;code&gt; do daemon
-agora chama &lt;code&gt;open_database()&lt;&#x2F;code&gt; com o &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; configurado, envolve
-&lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt; com &lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt; e vincula QUIC com o &lt;code&gt;PoolConfig&lt;&#x2F;code&gt;
-configurado. A dependencia direta de &lt;code&gt;rusqlite&lt;&#x2F;code&gt; foi removida do crate do daemon.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Migracao do CLI&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;commands&#x2F;init.rs&lt;&#x2F;code&gt;, &lt;code&gt;create.rs&lt;&#x2F;code&gt;) — Ambos
-os comandos &lt;code&gt;init&lt;&#x2F;code&gt; e &lt;code&gt;create&lt;&#x2F;code&gt; agora usam &lt;code&gt;tesseras_storage::open_database()&lt;&#x2F;code&gt; com
-o &lt;code&gt;StorageConfig&lt;&#x2F;code&gt; padrao ao inves de abrir conexoes &lt;code&gt;rusqlite&lt;&#x2F;code&gt; diretamente. A
-dependencia de &lt;code&gt;rusqlite&lt;&#x2F;code&gt; foi removida do crate do CLI.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisoes de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Padrao decorator para cache&lt;&#x2F;strong&gt;: &lt;code&gt;CachedFragmentStore&lt;&#x2F;code&gt; envolve
-&lt;code&gt;Box&amp;lt;dyn FragmentStore&amp;gt;&lt;&#x2F;code&gt; e implementa &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; ele proprio. Isso
-significa que cache e opt-in, composavel e invisivel para consumidores. O
-daemon habilita; testes podem pular.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Remocao ciente de bytes&lt;&#x2F;strong&gt;: o cache LRU rastreia bytes totais, nao contagem
-de entradas. Blobs de fragmentos variam muito em tamanho (um fragmento de
-texto de 4KB vs um shard de foto de 2MB), entao contar entradas daria uma
-visao enganosa do uso de memoria.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Sem crate de pool de conexoes&lt;&#x2F;strong&gt;: ao inves de trazer uma biblioteca generica
-de pool, o pool de conexoes e um wrapper fino sobre
-&lt;code&gt;DashMap&amp;lt;SocketAddr, PooledConnection&amp;gt;&lt;&#x2F;code&gt; com um reaper Tokio. Conexoes QUIC sao
-multiplexadas, entao o &quot;pool&quot; e realmente sobre gerenciamento de ciclo de vida
-(limpeza de inativos, maximo de conexoes) e nao sobre emprestar&#x2F;devolver.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Checksums armazenados ao inves de releituras&lt;&#x2F;strong&gt;: a correcao de atestacao e
-intencionalmente minima — uma linha alterada, uma leitura de disco removida
-por fragmento. Os checksums ja estavam armazenados no SQLite por
-&lt;code&gt;store_fragment()&lt;&#x2F;code&gt;, apenas nao estavam sendo usados.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Configuracao centralizada de pragmas&lt;&#x2F;strong&gt;: um unico struct &lt;code&gt;StorageConfig&lt;&#x2F;code&gt;
-substitui chamadas &lt;code&gt;PRAGMA&lt;&#x2F;code&gt; espalhadas. O flag &lt;code&gt;sqlite_synchronous_full&lt;&#x2F;code&gt;
-existe especificamente para implantacoes em Raspberry Pi onde o kernel pode
-crashar e perder transacoes WAL nao checkpointadas.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuacao&lt;&#x2F;strong&gt; — Shamir&#x27;s Secret Sharing para herdeiros, tesseras
-seladas (criptografia time-lock), auditorias de seguranca, onboarding de nos
-institucionais, deduplicacao de storage, empacotamento para OS&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploracao e Cultura&lt;&#x2F;strong&gt; — navegador publico de tesseras por
-era&#x2F;localizacao&#x2F;tema&#x2F;idioma, curadoria institucional, integracao genealogica,
-exportacao para midia fisica (M-DISC, microfilme, papel livre de acido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Com tuning de performance implementado, Tesseras lida com o caso comum de forma
-eficiente: leituras de fragmentos acertam o cache LRU, atestacao pula I&#x2F;O de
-disco, conexoes QUIC inativas sao removidas automaticamente e o SQLite e
-configurado consistentemente em toda a pilha. Os proximos passos focam em
-funcionalidades criptograficas (Shamir, time-lock) e hardening para implantacao
-em producao.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Verificar Sem Instalar Nada</title>
- <published>2026-02-15T20:00:00+00:00</published>
- <updated>2026-02-15T20:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-wasm-browser-verification/"/>
- <id>https://tesseras.net/pt-br/news/phase4-wasm-browser-verification/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-wasm-browser-verification/">&lt;p&gt;Confiança não deveria exigir instalação de software. Se alguém te envia uma
-tessera — um pacote de memórias preservadas — você deveria poder verificar que é
-genuína e não foi modificada sem baixar um app, criar uma conta, ou confiar em
-um servidor. É isso que o &lt;code&gt;tesseras-wasm&lt;&#x2F;code&gt; entrega: arraste um arquivo tessera
-para uma página web, e a verificação criptográfica acontece inteiramente no seu
-navegador.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-wasm&lt;&#x2F;strong&gt; — Um crate Rust que compila para WebAssembly via wasm-pack,
-expondo quatro funções stateless para JavaScript. O crate depende do
-&lt;code&gt;tesseras-core&lt;&#x2F;code&gt; para parsing do manifesto e chama primitivas criptográficas
-diretamente (blake3, ed25519-dalek) ao invés de depender do &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt;,
-que puxa bibliotecas pós-quânticas baseadas em C que não compilam para
-&lt;code&gt;wasm32-unknown-unknown&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;parse_manifest&lt;&#x2F;code&gt; recebe os bytes brutos do MANIFEST (texto UTF-8 plano, não
-MessagePack), delega para &lt;code&gt;tesseras_core::manifest::Manifest::parse()&lt;&#x2F;code&gt;, e
-retorna uma string JSON com a chave pública Ed25519 do criador, caminhos dos
-arquivos de assinatura, e uma lista de arquivos com seus hashes BLAKE3
-esperados, tamanhos e tipos MIME. Structs internas (&lt;code&gt;ManifestJson&lt;&#x2F;code&gt;,
-&lt;code&gt;CreatorPubkey&lt;&#x2F;code&gt;, &lt;code&gt;SignatureFiles&lt;&#x2F;code&gt;, &lt;code&gt;FileEntry&lt;&#x2F;code&gt;) são serializadas com serde_json.
-Os campos de chave pública ML-DSA e arquivo de assinatura estão presentes no
-contrato JSON mas definidos como &lt;code&gt;null&lt;&#x2F;code&gt; — prontos para quando a assinatura
-pós-quântica for implementada no lado nativo.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;hash_blake3&lt;&#x2F;code&gt; computa um hash BLAKE3 de bytes arbitrários e retorna uma string
-hexadecimal de 64 caracteres. É chamada uma vez por arquivo na tessera para
-verificar integridade contra o MANIFEST.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;verify_ed25519&lt;&#x2F;code&gt; recebe uma mensagem, uma assinatura de 64 bytes e uma chave
-pública de 32 bytes, constrói uma &lt;code&gt;ed25519_dalek::VerifyingKey&lt;&#x2F;code&gt;, e retorna se a
-assinatura é válida. A validação de comprimento retorna erros descritivos
-(&quot;Ed25519 public key must be 32 bytes&quot;) ao invés de causar panic.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;code&gt;verify_ml_dsa&lt;&#x2F;code&gt; é um stub que retorna um erro explicando que verificação ML-DSA
-ainda não está disponível. Isso é deliberado: o crate &lt;code&gt;ml-dsa&lt;&#x2F;code&gt; no crates.io está
-na v0.1.0-rc.7 (pré-release), e o &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt; usa &lt;code&gt;pqcrypto-dilithium&lt;&#x2F;code&gt;
-(CRYSTALS-Dilithium baseado em C) que é incompatível em nível de bytes com FIPS
-204 ML-DSA. Ambos os lados precisam usar a mesma implementação em Rust puro
-antes que a verificação cruzada funcione. Verificação Ed25519 é suficiente —
-toda tessera é assinada com Ed25519.&lt;&#x2F;p&gt;
-&lt;p&gt;Todas as quatro funções usam um padrão de duas camadas para testabilidade:
-funções internas retornam &lt;code&gt;Result&amp;lt;T, String&amp;gt;&lt;&#x2F;code&gt; e são testadas nativamente,
-enquanto wrappers finos &lt;code&gt;#[wasm_bindgen]&lt;&#x2F;code&gt; convertem erros para &lt;code&gt;JsError&lt;&#x2F;code&gt;. Isso
-evita que &lt;code&gt;JsError::new()&lt;&#x2F;code&gt; cause panic em targets não-WASM durante os testes.&lt;&#x2F;p&gt;
-&lt;p&gt;O binário WASM compilado tem 109 KB bruto e 44 KB com gzip — bem abaixo do
-orçamento de 200 KB. O wasm-opt aplica otimização &lt;code&gt;-Oz&lt;&#x2F;code&gt; após o wasm-pack
-compilar com &lt;code&gt;opt-level = &quot;z&quot;&lt;&#x2F;code&gt;, LTO e uma única unidade de codegen.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;@tesseras&#x2F;verify&lt;&#x2F;strong&gt; — Um pacote npm TypeScript (&lt;code&gt;crates&#x2F;tesseras-wasm&#x2F;js&#x2F;&lt;&#x2F;code&gt;) que
-orquestra a verificação no lado do navegador. A API pública é uma única função:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code data-lang=&quot;typescript&quot;&gt;async function verifyTessera(
- archive: Uint8Array,
- onProgress?: (current: number, total: number, file: string) =&amp;gt; void
-): Promise&amp;lt;VerificationResult&amp;gt;
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;O tipo &lt;code&gt;VerificationResult&lt;&#x2F;code&gt; fornece tudo que uma UI precisa: validade geral,
-hash da tessera, chaves públicas do criador, status das assinaturas
-(valid&#x2F;invalid&#x2F;missing para Ed25519 e ML-DSA), resultados de integridade por
-arquivo com hashes esperados e reais, uma lista de arquivos inesperados não
-presentes no MANIFEST, e um array de erros.&lt;&#x2F;p&gt;
-&lt;p&gt;A descompactação de arquivos (&lt;code&gt;unpack.ts&lt;&#x2F;code&gt;) lida com três formatos: tar
-comprimido com gzip (detectado pelos magic bytes &lt;code&gt;\x1f\x8b&lt;&#x2F;code&gt;, descomprimido com
-fflate e depois parseado como tar), ZIP (magic &lt;code&gt;PK\x03\x04&lt;&#x2F;code&gt;, descompactado com
-&lt;code&gt;unzipSync&lt;&#x2F;code&gt; do fflate), e tar bruto (&lt;code&gt;ustar&lt;&#x2F;code&gt; no offset 257). Uma função
-&lt;code&gt;normalizePath&lt;&#x2F;code&gt; remove o prefixo &lt;code&gt;tessera-&amp;lt;hash&amp;gt;&#x2F;&lt;&#x2F;code&gt; para que os caminhos internos
-correspondam às entradas do MANIFEST.&lt;&#x2F;p&gt;
-&lt;p&gt;A verificação roda em um Web Worker (&lt;code&gt;worker.ts&lt;&#x2F;code&gt;) para manter a thread da UI
-responsiva. O worker inicializa o módulo WASM, descompacta o arquivo, parseia o
-MANIFEST, verifica a assinatura Ed25519 contra a chave pública do criador,
-depois faz hash de cada arquivo com BLAKE3 e compara com os valores esperados.
-Mensagens de progresso são transmitidas de volta para a thread principal após
-cada arquivo. Se qualquer assinatura é inválida, a verificação para
-imediatamente sem fazer hash dos arquivos — falhando rápido na verificação mais
-crítica.&lt;&#x2F;p&gt;
-&lt;p&gt;O arquivo é transferido para o worker com zero-copy
-(&lt;code&gt;worker.postMessage({ type: &quot;verify&quot;, archive }, [archive.buffer])&lt;&#x2F;code&gt;) para
-evitar duplicar arquivos de tessera potencialmente grandes na memória.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Pipeline de build&lt;&#x2F;strong&gt; — Três novos targets no justfile: &lt;code&gt;wasm-build&lt;&#x2F;code&gt; executa
-wasm-pack com &lt;code&gt;--target web --release&lt;&#x2F;code&gt; e otimiza com wasm-opt; &lt;code&gt;wasm-size&lt;&#x2F;code&gt;
-reporta o tamanho do binário bruto e com gzip; &lt;code&gt;test-wasm&lt;&#x2F;code&gt; executa a suíte de
-testes nativos.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 9 testes unitários nativos cobrem hashing BLAKE3 (entrada vazia,
-valor conhecido), verificação Ed25519 (assinatura válida, assinatura inválida,
-chave errada, comprimento de chave inválido), e parsing do MANIFEST (manifesto
-válido, UTF-8 inválido, lixo). 3 testes de integração WASM rodam em Chrome
-headless via &lt;code&gt;wasm-pack test --headless --chrome&lt;&#x2F;code&gt;, verificando que
-&lt;code&gt;hash_blake3&lt;&#x2F;code&gt;, &lt;code&gt;verify_ed25519&lt;&#x2F;code&gt; e &lt;code&gt;parse_manifest&lt;&#x2F;code&gt; funcionam corretamente quando
-compilados para &lt;code&gt;wasm32-unknown-unknown&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Sem dependência do tesseras-crypto&lt;&#x2F;strong&gt;: o crate WASM chama blake3 e
-ed25519-dalek diretamente. O &lt;code&gt;tesseras-crypto&lt;&#x2F;code&gt; depende do &lt;code&gt;pqcrypto-kyber&lt;&#x2F;code&gt;
-(ML-KEM baseado em C via pqcrypto-traits) que requer um toolchain de
-compilador C e não tem target wasm32. Dependendo apenas de crates Rust puros,
-o build WASM tem zero dependências C e compila sem problemas para WebAssembly.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ML-DSA adiado, não fingido&lt;&#x2F;strong&gt;: ao invés de silenciosamente pular a
-verificação pós-quântica, o stub retorna um erro explícito. Isso garante que
-se uma tessera contiver uma assinatura ML-DSA, o resultado da verificação
-reportará &lt;code&gt;ml_dsa: &quot;missing&quot;&lt;&#x2F;code&gt; ao invés de fingir que foi verificada. O
-orquestrador JS lida com isso graciosamente — uma tessera é válida se Ed25519
-passar e ML-DSA estiver ausente (ainda não implementado em nenhum dos lados).&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Padrão de função interna&lt;&#x2F;strong&gt;: &lt;code&gt;JsError&lt;&#x2F;code&gt; não pode ser construído em targets
-não-WASM (causa panic). Dividir cada função em
-&lt;code&gt;foo_inner() -&amp;gt; Result&amp;lt;T, String&amp;gt;&lt;&#x2F;code&gt; e &lt;code&gt;foo() -&amp;gt; Result&amp;lt;T, JsError&amp;gt;&lt;&#x2F;code&gt; permite que
-a suíte de testes nativa exercite toda a lógica sem tocar em tipos JavaScript.
-Os testes de integração WASM em Chrome headless testam a superfície completa
-do &lt;code&gt;#[wasm_bindgen]&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Isolamento em Web Worker&lt;&#x2F;strong&gt;: operações criptográficas (especialmente BLAKE3
-sobre arquivos de mídia grandes) podem levar centenas de milissegundos. Rodar
-em um Worker previne travamentos na UI. O protocolo de progresso com streaming
-(&lt;code&gt;{ type: &quot;progress&quot;, current, total, file }&lt;&#x2F;code&gt;) permite que a UI mostre uma
-barra de progresso durante a verificação de tesseras com muitos arquivos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Transferência zero-copy&lt;&#x2F;strong&gt;: &lt;code&gt;archive.buffer&lt;&#x2F;code&gt; é transferido para o Worker, não
-copiado. Para um arquivo tessera de 50 MB, isso evita dobrar o uso de memória
-durante a verificação.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;MANIFEST em texto plano, não MessagePack&lt;&#x2F;strong&gt;: o crate WASM parseia o mesmo
-formato de MANIFEST em texto plano que o CLI. Isso é por design — o MANIFEST é
-a Pedra de Rosetta da tessera, legível por qualquer pessoa com um editor de
-texto. A dependência &lt;code&gt;rmp-serde&lt;&#x2F;code&gt; no Cargo.toml não é usada e será removida.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4: Resiliência e Escala&lt;&#x2F;strong&gt; — Empacotamento para sistemas operacionais
-(Alpine, Arch, Debian, FreeBSD, OpenBSD), CI no SourceHut e GitHub Actions,
-auditorias de segurança, explorador de tesseras no navegador em tesseras.net
-usando @tesseras&#x2F;verify&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — Navegador público de tesseras por
-era&#x2F;localização&#x2F;tema&#x2F;idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;A verificação não exige mais confiança em software. Um arquivo tessera arrastado
-para um navegador é verificado com o mesmo rigor criptográfico do CLI — mesmos
-hashes BLAKE3, mesmas assinaturas Ed25519, mesmo parser de MANIFEST. A diferença
-é que agora qualquer pessoa pode fazer isso.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Furando NATs</title>
- <published>2026-02-15T18:00:00+00:00</published>
- <updated>2026-02-15T18:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-nat-traversal/"/>
- <id>https://tesseras.net/pt-br/news/phase4-nat-traversal/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-nat-traversal/">&lt;p&gt;A maioria dos dispositivos das pessoas ficam atras de um NAT — um tradutor de
-enderecos de rede que permite acessar a internet mas impede conexoes de entrada.
-Para uma rede P2P, isso e um problema existencial: se dois nos atras de NATs nao
-conseguem se comunicar, a rede se fragmenta. A Fase 4 continua com uma pilha
-completa de travessia de NAT: descoberta via STUN, hole punching coordenado e
-fallback por relay.&lt;&#x2F;p&gt;
-&lt;p&gt;A abordagem segue o mesmo padrao da maioria dos sistemas P2P consolidados
-(WebRTC, BitTorrent, IPFS): tente a opcao mais barata primeiro, escale apenas
-quando necessario. Conectividade direta nao custa nada. Hole punching custa
-alguns pacotes coordenados. Relay custa largura de banda sustentada de um
-terceiro. Tesseras tenta nessa ordem.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construido&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Classificacao NatType&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;network.rs&lt;&#x2F;code&gt;) — Um novo enum
-&lt;code&gt;NatType&lt;&#x2F;code&gt; (Public, Cone, Symmetric, Unknown) adicionado a camada de dominio
-core. Esse tipo e compartilhado por toda a pilha: o cliente STUN o escreve, o
-DHT o divulga em mensagens Pong, e o coordenador de punch o le para decidir se
-hole punching vale a pena tentar (Cone-para-Cone funciona ~80% das vezes;
-Symmetric-para-Symmetric quase nunca funciona).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Cliente STUN&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;stun.rs&lt;&#x2F;code&gt;) — Uma implementacao STUN minima
-(RFC 5389 Binding Request&#x2F;Response) que descobre o endereco externo de um no. O
-codec codifica requisicoes de 20 bytes com um ID de transacao aleatorio e
-decodifica respostas XOR-MAPPED-ADDRESS. A funcao &lt;code&gt;discover_nat()&lt;&#x2F;code&gt; consulta
-multiplos servidores STUN em paralelo (Google, Cloudflare por padrao), compara
-os enderecos mapeados e classifica o tipo de NAT:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Mesmo IP e porta de todos os servidores → &lt;strong&gt;Public&lt;&#x2F;strong&gt; (sem NAT)&lt;&#x2F;li&gt;
-&lt;li&gt;Mesmo endereco mapeado de todos os servidores → &lt;strong&gt;Cone&lt;&#x2F;strong&gt; (hole punching
-funciona)&lt;&#x2F;li&gt;
-&lt;li&gt;Enderecos mapeados diferentes → &lt;strong&gt;Symmetric&lt;&#x2F;strong&gt; (hole punching nao confiavel)&lt;&#x2F;li&gt;
-&lt;li&gt;Sem respostas → &lt;strong&gt;Unknown&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Retentativas com backoff exponencial e timeouts configuraveis. 12 testes
-cobrindo roundtrips de codec, todos os caminhos de classificacao e consultas
-async em loopback.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Coordenacao de punch assinada&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;punch.rs&lt;&#x2F;code&gt;) — Assinatura e
-verificacao Ed25519 para mensagens &lt;code&gt;PunchIntro&lt;&#x2F;code&gt;, &lt;code&gt;RelayRequest&lt;&#x2F;code&gt; e
-&lt;code&gt;RelayMigrate&lt;&#x2F;code&gt;. Cada introducao e assinada pelo iniciador com uma janela de
-timestamp de 30 segundos, prevenindo ataques de reflexao (onde um atacante
-reproduz uma introducao antiga para redirecionar trafego). O formato do payload
-e &lt;code&gt;target || external_addr || timestamp&lt;&#x2F;code&gt; — alterar qualquer campo invalida a
-assinatura. 6 testes unitarios mais 3 testes baseados em propriedades com
-proptest (IDs de no, portas e tokens de sessao arbitrarios).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Gerenciador de sessoes de relay&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;relay.rs&lt;&#x2F;code&gt;) — Gerencia
-sessoes de relay UDP transparente entre nos com NAT. Cada sessao tem um token
-aleatorio de 16 bytes; os nos prefixam seus pacotes com o token, o relay remove
-e encaminha. Funcionalidades:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Encaminhamento bidirecional (A→R→B e B→R→A)&lt;&#x2F;li&gt;
-&lt;li&gt;Limite de taxa: 256 KB&#x2F;s para nos reciprocos, 64 KB&#x2F;s para nao reciprocos&lt;&#x2F;li&gt;
-&lt;li&gt;Duracao maxima de 10 minutos para sessoes bootstrap (nao reciprocas)&lt;&#x2F;li&gt;
-&lt;li&gt;Migracao de endereco: quando o IP de um no muda (Wi-Fi para celular), um
-&lt;code&gt;RelayMigrate&lt;&#x2F;code&gt; assinado atualiza a sessao sem derruba-la&lt;&#x2F;li&gt;
-&lt;li&gt;Limpeza por inatividade com timeout configuravel&lt;&#x2F;li&gt;
-&lt;li&gt;8 testes unitarios mais 2 testes baseados em propriedades&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Extensoes de mensagens DHT&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;message.rs&lt;&#x2F;code&gt;) — Sete novas
-variantes de mensagem adicionadas ao protocolo DHT:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Mensagem&lt;&#x2F;th&gt;&lt;th&gt;Proposito&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchIntro&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&quot;Quero conectar ao no X, aqui esta meu endereco externo assinado&quot;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchRequest&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;O introdutor encaminha a requisicao ao destino&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;PunchReady&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;O destino confirma prontidao, envia seu endereco externo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayRequest&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&quot;Crie uma sessao de relay para o no X&quot;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayOffer&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;O relay responde com seu endereco e token de sessao&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayClose&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Encerrar uma sessao de relay&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;&lt;code&gt;RelayMigrate&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Atualizar sessao apos mudanca de rede&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;A mensagem &lt;code&gt;Pong&lt;&#x2F;code&gt; foi estendida com metadados NAT: &lt;code&gt;nat_type&lt;&#x2F;code&gt;,
-&lt;code&gt;relay_slots_available&lt;&#x2F;code&gt; e &lt;code&gt;relay_bandwidth_used_kbps&lt;&#x2F;code&gt;. Todos os novos campos
-usam &lt;code&gt;#[serde(default)]&lt;&#x2F;code&gt; para compatibilidade retroativa — nos antigos ignoram o
-que nao reconhecem, nos novos usam defaults. 9 novos testes de roundtrip de
-serializacao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Trait NatHandler e dispatch&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-dht&#x2F;src&#x2F;engine.rs&lt;&#x2F;code&gt;) — Uma nova trait
-async &lt;code&gt;NatHandler&lt;&#x2F;code&gt; (5 metodos) injetada no engine DHT, seguindo o mesmo padrao
-de injecao de dependencia do &lt;code&gt;ReplicationHandler&lt;&#x2F;code&gt; existente. O loop de dispatch
-de mensagens do engine agora roteia todas as mensagens punch&#x2F;relay para o
-handler. Isso mantem o engine DHT agnóstico ao protocolo enquanto permite que a
-logica de travessia de NAT viva em &lt;code&gt;tesseras-net&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Tipos de reconexao mobile&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-embedded&#x2F;src&#x2F;reconnect.rs&lt;&#x2F;code&gt;) — Uma
-maquina de estados de reconexao em tres fases para dispositivos moveis:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;QuicMigration&lt;&#x2F;strong&gt; (0-2s) — tenta migracao de conexao QUIC para todos os peers
-ativos&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ReStun&lt;&#x2F;strong&gt; (2-5s) — redescobre endereco externo via STUN&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ReEstablish&lt;&#x2F;strong&gt; (5-10s) — reconecta peers que a migracao nao conseguiu salvar&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;Peers sao reconectados em ordem de prioridade: nos bootstrap primeiro, depois
-nos que guardam nossos fragmentos, depois nos cujos fragmentos guardamos, depois
-vizinhos DHT gerais. Uma nova variante de evento &lt;code&gt;NetworkChanged&lt;&#x2F;code&gt; foi adicionada
-ao stream de eventos FFI para que o app Flutter possa mostrar progresso de
-reconexao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Configuracao NAT do daemon&lt;&#x2F;strong&gt; (&lt;code&gt;tesd&#x2F;src&#x2F;config.rs&lt;&#x2F;code&gt;) — Uma nova secao &lt;code&gt;[nat]&lt;&#x2F;code&gt;
-na configuracao TOML com lista de servidores STUN, toggle de relay, maximo de
-sessoes relay, limites de largura de banda (reciproco vs bootstrap) e timeout de
-inatividade. Todos os campos tem defaults sensiveis; relay e desabilitado por
-padrao.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Metricas Prometheus&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-net&#x2F;src&#x2F;metrics.rs&lt;&#x2F;code&gt;) — 16 metricas em quatro
-subsistemas:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;STUN&lt;&#x2F;strong&gt;: requisicoes, falhas, histograma de latencia&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Punch&lt;&#x2F;strong&gt;: tentativas&#x2F;sucessos&#x2F;falhas (por par de tipo NAT), histograma de
-latencia&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Relay&lt;&#x2F;strong&gt;: sessoes ativas, sessoes totais, bytes encaminhados, timeouts por
-inatividade, hits de rate limit&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reconexao&lt;&#x2F;strong&gt;: mudancas de rede, tentativas&#x2F;sucessos por fase, histograma de
-duracao&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;6 testes verificando registro, incremento, cardinalidade de labels e deteccao de
-registro duplo.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes de integracao&lt;&#x2F;strong&gt; — Dois testes end-to-end usando &lt;code&gt;MemTransport&lt;&#x2F;code&gt; (rede
-simulada em memoria):&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;punch_integration.rs&lt;&#x2F;code&gt; — Fluxo completo de hole-punch com 3 nos: A envia
-&lt;code&gt;PunchIntro&lt;&#x2F;code&gt; assinado ao introdutor I, I verifica e encaminha &lt;code&gt;PunchRequest&lt;&#x2F;code&gt; a
-B, B verifica a assinatura original e envia &lt;code&gt;PunchReady&lt;&#x2F;code&gt; de volta, A e B
-trocam mensagens diretamente. Tambem testa que uma assinatura invalida e
-corretamente rejeitada.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;relay_integration.rs&lt;&#x2F;code&gt; — Fluxo completo de relay com 3 nos: A solicita relay
-de R, R cria sessao e envia &lt;code&gt;RelayOffer&lt;&#x2F;code&gt; a ambos os peers, A e B trocam
-pacotes prefixados com token atraves de R, A migra para um novo endereco no
-meio da sessao, A fecha a sessao, e o teste verifica que a sessao e encerrada
-e encaminhamento posterior falha.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Testes de propriedade&lt;&#x2F;strong&gt; — 7 testes baseados em proptest cobrindo: roundtrips
-de assinatura para todos os tres tipos de mensagem assinada (IDs de no, portas e
-tokens arbitrarios), determinismo de classificacao NAT (mesmas entradas sempre
-produzem mesma saida), validade de binding request STUN, unicidade de tokens de
-sessao, e rejeicao de pacotes curtos pelo relay.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Alvos Justfile&lt;&#x2F;strong&gt; — &lt;code&gt;just test-nat&lt;&#x2F;code&gt; executa todos os testes de travessia NAT em
-&lt;code&gt;tesseras-net&lt;&#x2F;code&gt; e &lt;code&gt;tesseras-dht&lt;&#x2F;code&gt;. &lt;code&gt;just test-chaos&lt;&#x2F;code&gt; e um placeholder para futuros
-testes de caos com Docker Compose e &lt;code&gt;tc netem&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisoes de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;STUN ao inves de TURN&lt;&#x2F;strong&gt;: implementamos STUN (descoberta) e relay customizado
-ao inves de TURN completo. TURN requer alocacao autenticada e foi projetado
-para relay de midia; nosso relay e mais simples — encaminhamento UDP com
-prefixo de token e limites de taxa. Isso mantem o protocolo minimo e evita
-depender de servidores TURN externos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Assinaturas em introducoes&lt;&#x2F;strong&gt;: cada &lt;code&gt;PunchIntro&lt;&#x2F;code&gt; e assinado pelo iniciador.
-Sem isso, um atacante poderia enviar introducoes forjadas para redirecionar as
-tentativas de hole-punch de um no para um endereco controlado pelo atacante
-(ataque de reflexao). A janela de timestamp de 30 segundos limita replay.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Tiers reciprocos de largura de banda&lt;&#x2F;strong&gt;: nos relay dao 4x mais largura de
-banda (256 vs 64 KB&#x2F;s) para peers com boas pontuacoes de reciprocidade. Isso
-incentiva nos a armazenar fragmentos para outros — se voce contribui, recebe
-melhor servico de relay quando precisa.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Extensao Pong retrocompativel&lt;&#x2F;strong&gt;: novos campos NAT em &lt;code&gt;Pong&lt;&#x2F;code&gt; usam
-&lt;code&gt;#[serde(default)]&lt;&#x2F;code&gt; e &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;. Nos antigos que nao entendem esses campos
-simplesmente os pulam durante deserializacao. Nenhum bump de versao de
-protocolo necessario.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;NatHandler como trait async&lt;&#x2F;strong&gt;: a logica de travessia NAT e injetada no
-engine DHT via trait, assim como &lt;code&gt;ReplicationHandler&lt;&#x2F;code&gt;. Isso mantem o engine
-DHT focado em roteamento e gerenciamento de peers, e permite que a
-implementacao NAT seja trocada ou desabilitada sem tocar no codigo core do
-DHT.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuacao&lt;&#x2F;strong&gt; — tuning de performance (pooling de conexoes, cache de
-fragmentos, SQLite WAL), auditorias de seguranca, onboarding de nos
-institucionais, empacotamento para OS&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploracao e Cultura&lt;&#x2F;strong&gt; — navegador publico de tesseras por
-era&#x2F;localizacao&#x2F;tema&#x2F;idioma, curadoria institucional, integracao genealogica,
-exportacao para midia fisica (M-DISC, microfilme, papel livre de acido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Com travessia de NAT, Tesseras pode conectar nos independentemente de sua
-topologia de rede. Nos publicos conversam diretamente. Nos com NAT Cone furam
-com ajuda de um introdutor. Nos com NAT Symmetric ou firewalled usam relay
-atraves de peers voluntarios. A rede se adapta ao mundo real, onde a maioria dos
-dispositivos esta atras de um NAT e as condicoes de rede mudam constantemente.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>CLI Encontra a Rede: Comandos Publish, Fetch e Status</title>
- <published>2026-02-15T00:00:00+00:00</published>
- <updated>2026-02-15T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/cli-daemon-rpc/"/>
- <id>https://tesseras.net/pt-br/news/cli-daemon-rpc/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/cli-daemon-rpc/">&lt;p&gt;Até agora o CLI operava isoladamente: criar uma tessera, verificar, exportar,
-listar o que você tem. Tudo ficava na sua máquina. Com esta atualização, o &lt;code&gt;tes&lt;&#x2F;code&gt;
-ganha três comandos que fazem a ponte entre o armazenamento local e a rede P2P —
-&lt;code&gt;publish&lt;&#x2F;code&gt;, &lt;code&gt;fetch&lt;&#x2F;code&gt; e &lt;code&gt;status&lt;&#x2F;code&gt; — comunicando-se com um &lt;code&gt;tesd&lt;&#x2F;code&gt; em execução através
-de um socket Unix.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Crate &lt;code&gt;tesseras-rpc&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Um novo crate compartilhado entre CLI e daemon.
-Define o protocolo RPC usando serialização MessagePack com enquadramento
-prefixado por tamanho (cabeçalho big-endian de 4 bytes, máximo de 64 MiB). Três
-tipos de requisição (&lt;code&gt;Publish&lt;&#x2F;code&gt;, &lt;code&gt;Fetch&lt;&#x2F;code&gt;, &lt;code&gt;Status&lt;&#x2F;code&gt;) e suas respostas
-correspondentes. Um &lt;code&gt;DaemonClient&lt;&#x2F;code&gt; síncrono gerencia a conexão do socket Unix
-com timeouts configuráveis. O protocolo é deliberadamente simples — uma
-requisição, uma resposta, conexão fechada — para manter a implementação
-auditável.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes publish &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Publica uma tessera na rede. Aceita hashes completos
-ou prefixos curtos (ex.: &lt;code&gt;tes publish a1b2&lt;&#x2F;code&gt;), que são resolvidos no banco de
-dados local. O daemon lê todos os arquivos da tessera do armazenamento, empacota
-em um único buffer MessagePack e entrega ao motor de replicação. Tesseras
-pequenas (&amp;lt; 4 MB) são replicadas como um único fragmento; maiores passam por
-codificação de apagamento Reed-Solomon. A saída mostra o hash curto e a contagem
-de fragmentos:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;Published tessera 9f2c4a1b (24 fragments created)
-Distribution in progress — use `tes status 9f2c4a1b` to track.
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes fetch &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Busca uma tessera da rede usando o hash de conteúdo
-completo. O daemon coleta fragmentos disponíveis localmente, reconstrói os dados
-originais via decodificação de apagamento se necessário, desempacota os arquivos
-e armazena no CAS (content-addressable store). Retorna o número de memórias e o
-tamanho total buscado.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;&lt;code&gt;tes status &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Exibe a saúde de replicação de uma tessera. A saída
-mapeia diretamente o modelo interno de saúde do motor de replicação:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Estado&lt;&#x2F;th&gt;&lt;th&gt;Significado&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;Local&lt;&#x2F;td&gt;&lt;td&gt;Ainda não publicada — existe apenas na sua máquina&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Publishing&lt;&#x2F;td&gt;&lt;td&gt;Fragmentos sendo distribuídos, redundância crítica&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Replicated&lt;&#x2F;td&gt;&lt;td&gt;Distribuída, mas abaixo da redundância alvo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Healthy&lt;&#x2F;td&gt;&lt;td&gt;Redundância completa alcançada&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;&lt;strong&gt;Listener RPC no daemon&lt;&#x2F;strong&gt; — O daemon agora escuta em um socket Unix (padrão:
-&lt;code&gt;$XDG_RUNTIME_DIR&#x2F;tesseras&#x2F;daemon.sock&lt;&#x2F;code&gt;) com permissões de diretório adequadas
-(0700), limpeza de sockets obsoletos e shutdown gracioso. Cada conexão é tratada
-em uma task Tokio — o listener converte o stream assíncrono para I&#x2F;O síncrono
-para a camada de enquadramento, despacha para o handler RPC e escreve a resposta
-de volta.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Pack&#x2F;unpack no &lt;code&gt;tesseras-core&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — Um módulo pequeno que serializa uma lista
-de entradas de arquivo (caminho + dados) em um único buffer MessagePack e
-vice-versa. Esta é a ponte entre a estrutura de diretórios da tessera e os blobs
-opacos do motor de replicação.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Socket Unix ao invés de TCP&lt;&#x2F;strong&gt;: a comunicação RPC entre CLI e daemon acontece
-na mesma máquina. Sockets Unix são mais rápidos, não precisam de alocação de
-porta, e as permissões do sistema de arquivos fornecem controle de acesso sem
-TLS.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;MessagePack ao invés de JSON&lt;&#x2F;strong&gt;: o mesmo formato wire usado em todo o
-Tesseras. Compacto, sem schema, e já é uma dependência do workspace. Uma
-ida-e-volta típica de publish request&#x2F;response ocupa menos de 200 bytes.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Cliente síncrono, daemon assíncrono&lt;&#x2F;strong&gt;: o &lt;code&gt;DaemonClient&lt;&#x2F;code&gt; usa I&#x2F;O bloqueante
-porque o CLI não precisa de concorrência — envia uma requisição e espera. O
-listener do daemon é assíncrono (Tokio) para tratar múltiplas conexões. A
-camada de enquadramento funciona com qualquer impl &lt;code&gt;Read&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Write&lt;&#x2F;code&gt;, conectando
-ambos os mundos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Resolução de prefixo no lado do cliente&lt;&#x2F;strong&gt;: &lt;code&gt;publish&lt;&#x2F;code&gt; e &lt;code&gt;status&lt;&#x2F;code&gt; resolvem
-prefixos curtos localmente antes de enviar o hash completo ao daemon. Isso
-mantém o daemon stateless — ele não precisa acessar o banco de dados do CLI.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Alinhamento do diretório de dados padrão&lt;&#x2F;strong&gt;: o padrão do CLI mudou de
-&lt;code&gt;~&#x2F;.tesseras&lt;&#x2F;code&gt; para &lt;code&gt;~&#x2F;.local&#x2F;share&#x2F;tesseras&lt;&#x2F;code&gt; (via &lt;code&gt;dirs::data_dir()&lt;&#x2F;code&gt;) para
-coincidir com o daemon. Um aviso de migração é exibido quando dados no caminho
-antigo são detectados.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;proximos-passos&quot;&gt;Próximos passos&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Contagem de peers no DHT&lt;&#x2F;strong&gt;: o comando &lt;code&gt;status&lt;&#x2F;code&gt; atualmente reporta 0 peers —
-conectar a contagem real do DHT é o próximo passo&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;&lt;code&gt;tes show&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt;: exibir o conteúdo de uma tessera (memórias, metadados) sem
-exportar&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fetch com streaming&lt;&#x2F;strong&gt;: para tesseras grandes, transmitir fragmentos conforme
-chegam ao invés de esperar por todos&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Recuperação de Chaves por Herdeiros com Shamir&#x27;s Secret Sharing</title>
- <published>2026-02-15T00:00:00+00:00</published>
- <updated>2026-02-15T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-shamir-heir-recovery/"/>
- <id>https://tesseras.net/pt-br/news/phase4-shamir-heir-recovery/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-shamir-heir-recovery/">&lt;p&gt;O que acontece com suas memórias quando você morre? Até agora, Tesseras
-conseguia preservar conteúdo ao longo de milênios — mas as chaves privadas e
-seladas morriam com o dono. A Fase 4 continua com uma solução: Shamir&#x27;s Secret
-Sharing, um esquema criptográfico que permite dividir sua identidade em
-fragmentos e distribuí-los para as pessoas em quem você mais confia.&lt;&#x2F;p&gt;
-&lt;p&gt;A matemática é elegante: você escolhe um limiar T e um total N. Qualquer T
-fragmentos reconstroem o segredo completo; T-1 fragmentos não revelam
-absolutamente nada. Isso não é &quot;quase nada&quot; — é informação-teoricamente seguro.
-Um atacante com um fragmento a menos que o limiar tem exatamente zero bits de
-informação sobre o segredo, independentemente do poder computacional que tenha.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Aritmética de corpo finito GF(256)&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;shamir&#x2F;gf256.rs&lt;&#x2F;code&gt;) —
-Shamir&#x27;s Secret Sharing requer aritmética em um corpo finito. Implementamos
-GF(256) usando o mesmo polinômio irredutível do AES (x^8 + x^4 + x^3 + x + 1),
-com tabelas de lookup para logaritmo e exponenciação computadas em tempo de
-compilação. Todas as operações são em tempo constante via consulta a tabelas —
-sem ramificações baseadas em dados secretos. O módulo inclui o método de Horner
-para avaliação de polinômios e interpolação de Lagrange em x=0 para recuperação
-do segredo. 233 linhas, exaustivamente testado: todos os 256 elementos para
-propriedades de identidade&#x2F;inverso, comutatividade e associatividade.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;ShamirSplitter&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;shamir&#x2F;mod.rs&lt;&#x2F;code&gt;) — A API principal de
-split&#x2F;reconstruct. &lt;code&gt;split()&lt;&#x2F;code&gt; recebe uma fatia de bytes do segredo, uma
-configuração (limiar T, total N) e a chave pública Ed25519 do dono. Para cada
-byte do segredo, constrói um polinômio aleatório de grau T-1 sobre GF(256) com o
-byte do segredo como termo constante, e então o avalia em N pontos distintos.
-&lt;code&gt;reconstruct()&lt;&#x2F;code&gt; recebe T ou mais fragmentos e recupera o segredo via
-interpolação de Lagrange. Ambas as operações incluem validação extensiva:
-limites do limiar, consistência de sessão, correspondência de impressão digital
-do dono e verificação de checksum BLAKE3.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Formato HeirShare&lt;&#x2F;strong&gt; — Cada fragmento é um artefato autocontido e serializável
-com:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;Versão do formato (v1) para compatibilidade futura&lt;&#x2F;li&gt;
-&lt;li&gt;Índice do fragmento (1..N) e metadados de limiar&#x2F;total&lt;&#x2F;li&gt;
-&lt;li&gt;ID de sessão (8 bytes aleatórios) — impede mistura de fragmentos de sessões
-diferentes&lt;&#x2F;li&gt;
-&lt;li&gt;Impressão digital do dono (primeiros 8 bytes do hash BLAKE3 da chave pública
-Ed25519)&lt;&#x2F;li&gt;
-&lt;li&gt;Dados do fragmento (os y-values de Shamir, mesmo comprimento do segredo)&lt;&#x2F;li&gt;
-&lt;li&gt;Checksum BLAKE3 sobre todos os campos anteriores&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Os fragmentos são serializados em dois formatos: &lt;strong&gt;MessagePack&lt;&#x2F;strong&gt; (binário
-compacto, para uso programático) e &lt;strong&gt;texto base64&lt;&#x2F;strong&gt; (legível por humanos, para
-impressão e armazenamento físico). O formato texto inclui um cabeçalho com
-metadados e delimitadores:&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;--- TESSERAS HEIR SHARE ---
-Format: v1
-Owner: a1b2c3d4e5f6a7b8 (fingerprint)
-Share: 1 of 3 (threshold: 2)
-Session: 9f8e7d6c5b4a3210
-Created: 2026-02-15
-
-&amp;lt;dados MessagePack codificados em base64&amp;gt;
---- END HEIR SHARE ---
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;p&gt;Este formato é projetado para ser impresso em papel, armazenado em um cofre
-bancário ou gravado em metal. O cabeçalho é informacional — apenas o payload
-base64 é analisado durante a reconstrução.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Integração com CLI&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-cli&#x2F;src&#x2F;commands&#x2F;heir.rs&lt;&#x2F;code&gt;) — Três novos
-subcomandos:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;tes heir create&lt;&#x2F;code&gt; — divide sua identidade Ed25519 em fragmentos de herdeiros.
-Solicita confirmação (sua identidade completa está em jogo), gera arquivos
-&lt;code&gt;.bin&lt;&#x2F;code&gt; e &lt;code&gt;.txt&lt;&#x2F;code&gt; para cada fragmento e escreve &lt;code&gt;heir_meta.json&lt;&#x2F;code&gt; no diretório de
-identidade.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tes heir reconstruct&lt;&#x2F;code&gt; — carrega arquivos de fragmentos (detecta
-automaticamente formato binário vs texto), valida consistência, reconstrói o
-segredo, deriva o par de chaves Ed25519 e opcionalmente o instala em
-&lt;code&gt;~&#x2F;.tesseras&#x2F;identity&#x2F;&lt;&#x2F;code&gt; (com backup automático da identidade existente).&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;tes heir info&lt;&#x2F;code&gt; — exibe metadados do fragmento e verifica o checksum sem expor
-nenhum material secreto.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Formato do blob secreto&lt;&#x2F;strong&gt; — As chaves de identidade são serializadas em um
-blob versionado antes da divisão: um byte de versão (0x01), um byte de flags
-(0x00 para somente Ed25519), seguido da chave secreta Ed25519 de 32 bytes. Isso
-deixa espaço para expansão futura quando as chaves privadas X25519 e ML-KEM-768
-forem integradas ao sistema de fragmentos de herdeiros.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 20 testes unitários para ShamirSplitter (roundtrip, todas as
-combinações de fragmentos, fragmentos insuficientes, dono errado, sessão errada,
-limite threshold-1, segredos grandes até o tamanho de chave ML-KEM-768). 7
-testes unitários para aritmética GF(256) (propriedades de campo exaustivas). 3
-testes baseados em propriedades com proptest (segredos arbitrários até 5000
-bytes, configurações T-de-N arbitrárias, verificação de segurança
-informação-teórica). Testes de roundtrip de serialização para ambos os formatos
-MessagePack e texto base64. 2 testes de integração cobrindo o ciclo de vida
-completo de herdeiros: gerar identidade, dividir em fragmentos, serializar,
-desserializar, reconstruir, verificar par de chaves e assinar&#x2F;verificar com
-chaves reconstruídas.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;GF(256) ao invés de GF(primo)&lt;&#x2F;strong&gt;: usamos GF(256) ao invés de um corpo primo
-porque ele mapeia naturalmente para bytes — cada elemento é um único byte,
-cada fragmento tem o mesmo comprimento do segredo. Sem aritmética de inteiros
-grandes, sem redução modular, sem padding. Esta é a mesma abordagem usada pela
-maioria das implementações reais de Shamir, incluindo SSSS e Hashicorp Vault.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Tabelas de lookup em tempo de compilação&lt;&#x2F;strong&gt;: as tabelas LOG e EXP para
-GF(256) são computadas em tempo de compilação usando &lt;code&gt;const fn&lt;&#x2F;code&gt;. Isso
-significa zero custo de inicialização em tempo de execução e operações em
-tempo constante via consulta a tabelas ao invés de loops.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;ID de sessão previne mistura entre sessões&lt;&#x2F;strong&gt;: cada chamada a &lt;code&gt;split()&lt;&#x2F;code&gt; gera
-um novo ID de sessão aleatório. Se um herdeiro acidentalmente usar fragmentos
-de duas sessões diferentes de divisão (por exemplo, antes e depois de uma
-rotação de chaves), a reconstrução falha de forma limpa com um erro de
-validação ao invés de produzir dados corrompidos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Checksums BLAKE3 detectam corrupção&lt;&#x2F;strong&gt;: cada fragmento inclui um checksum
-BLAKE3 sobre seu conteúdo. Isso captura degradação de bits, erros de
-transmissão e truncamento acidental antes de qualquer tentativa de
-reconstrução. Um fragmento impresso em papel e escaneado via OCR vai falhar no
-checksum se um único caractere estiver errado.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Impressão digital do dono para identificação&lt;&#x2F;strong&gt;: os fragmentos incluem os
-primeiros 8 bytes de BLAKE3(chave pública Ed25519) como impressão digital.
-Isso permite aos herdeiros verificar a qual identidade um fragmento pertence
-sem revelar a chave pública completa. Durante a reconstrução, a impressão
-digital é verificada contra a chave recuperada.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Formato duplo para resiliência&lt;&#x2F;strong&gt;: ambos os formatos binário (MessagePack) e
-texto (base64) são gerados porque mídias físicas têm modos de falha diferentes
-de armazenamento digital. Um pendrive pode falhar; papel sobrevive. Um QR code
-pode ficar ilegível; texto base64 pode ser digitado manualmente.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Versionamento do blob&lt;&#x2F;strong&gt;: o segredo é envolvido em um blob versionado
-(versão + flags + material de chave) para que versões futuras possam incluir
-chaves adicionais (X25519, ML-KEM-768) sem quebrar compatibilidade com
-fragmentos existentes.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuada: Resiliência e Escala&lt;&#x2F;strong&gt; — NAT traversal avançado
-(STUN&#x2F;TURN), ajuste de performance (pool de conexões, cache de fragmentos,
-SQLite WAL), auditorias de segurança, integração de nós institucionais,
-empacotamento para sistemas operacionais&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — navegador público de tesseras por
-era&#x2F;localização&#x2F;tema&#x2F;idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Com Shamir&#x27;s Secret Sharing, Tesseras fecha a última lacuna crítica na
-preservação a longo prazo. Suas memórias sobrevivem a falhas de infraestrutura
-através de erasure coding. Sua privacidade sobrevive a computadores quânticos
-através de criptografia híbrida. E agora, sua identidade sobrevive a você —
-passada adiante para as pessoas que você escolheu, exigindo a cooperação delas
-para desbloquear o que você deixou para trás.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 4: Criptografia e Tesseras Seladas</title>
- <published>2026-02-14T16:00:00+00:00</published>
- <updated>2026-02-14T16:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase4-encryption-sealed/"/>
- <id>https://tesseras.net/pt-br/news/phase4-encryption-sealed/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase4-encryption-sealed/">&lt;p&gt;Algumas memórias não são para todos. Um diário privado, uma carta para ser
-aberta em 2050, um segredo de família selado até que os netos tenham idade
-suficiente. Até agora, toda tessera na rede era aberta. A Fase 4 muda isso:
-Tesseras agora criptografa conteúdo privado e selado com um esquema
-criptográfico híbrido projetado para resistir tanto a ataques clássicos quanto
-quânticos.&lt;&#x2F;p&gt;
-&lt;p&gt;O princípio continua o mesmo — criptografar o mínimo possível. Memórias públicas
-precisam de disponibilidade, não de sigilo. Mas quando alguém cria uma tessera
-privada ou selada, o conteúdo agora é trancado por criptografia AES-256-GCM com
-chaves protegidas por um mecanismo híbrido de encapsulamento de chaves
-combinando X25519 e ML-KEM-768. Ambos os algoritmos precisam ser quebrados para
-acessar o conteúdo.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;Encriptador AES-256-GCM&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;encryption.rs&lt;&#x2F;code&gt;) — Criptografia
-simétrica de conteúdo com nonces aleatórios de 12 bytes e dados autenticados
-associados (AAD). O AAD vincula o texto cifrado ao seu contexto: para tesseras
-privadas, o hash do conteúdo é incluído; para tesseras seladas, tanto o hash do
-conteúdo quanto o timestamp &lt;code&gt;open_after&lt;&#x2F;code&gt; são vinculados no AAD. Isso significa
-que mover texto cifrado entre tesseras com datas de abertura diferentes causa
-falha na decriptação — você não consegue enganar o sistema para abrir uma
-memória selada antecipadamente trocando o texto cifrado para uma tessera com uma
-data de selo anterior.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Mecanismo Híbrido de Encapsulamento de Chaves&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;kem.rs&lt;&#x2F;code&gt;)
-— Troca de chaves usando X25519 (Diffie-Hellman clássico em curva elíptica)
-combinado com ML-KEM-768 (o KEM pós-quântico baseado em reticulados padronizado
-pelo NIST, anteriormente Kyber). Ambos os segredos compartilhados são combinados
-via &lt;code&gt;blake3::derive_key&lt;&#x2F;code&gt; com uma string de contexto fixa (&quot;tesseras hybrid kem
-v1&quot;) para produzir uma única chave de criptografia de conteúdo de 256 bits. Isso
-segue a mesma filosofia &quot;dual desde o início&quot; das assinaturas duplas do projeto
-(Ed25519 + ML-DSA): se qualquer algoritmo for quebrado no futuro, o outro ainda
-protege o conteúdo.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Envelope de Chave Selada&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;sealed.rs&lt;&#x2F;code&gt;) — Encapsula uma
-chave de criptografia de conteúdo usando o KEM híbrido, para que apenas o dono
-da tessera possa recuperá-la. O KEM produz uma chave de transporte, que é XORed
-com a chave de conteúdo para produzir uma chave encapsulada armazenada junto ao
-texto cifrado do KEM. Ao desselar, o dono decapsula o texto cifrado do KEM para
-recuperar a chave de transporte, depois faz XOR novamente para recuperar a chave
-de conteúdo.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Publicação de Chave&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-crypto&#x2F;src&#x2F;sealed.rs&lt;&#x2F;code&gt;) — Um artefato assinado
-independente para publicar a chave de conteúdo de uma tessera selada após a data
-&lt;code&gt;open_after&lt;&#x2F;code&gt; ter passado. O dono assina a chave de conteúdo, o hash da tessera e
-o timestamp de publicação com suas chaves duais (Ed25519, com placeholder
-ML-DSA). O manifesto permanece imutável — a publicação da chave é um documento
-separado. Outros nós verificam a assinatura contra a chave pública do dono antes
-de usar a chave publicada para decriptar o conteúdo.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;EncryptionContext&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;enums.rs&lt;&#x2F;code&gt;) — Um tipo de domínio que
-representa o contexto AAD para criptografia. Ele vive em tesseras-core e não em
-tesseras-crypto porque é um conceito de domínio (não um detalhe de implementação
-criptográfica). O método &lt;code&gt;to_aad_bytes()&lt;&#x2F;code&gt; produz serialização determinística: um
-byte de tag (0x00 para Private, 0x01 para Sealed), seguido do hash de conteúdo
-e, para Sealed, o timestamp &lt;code&gt;open_after&lt;&#x2F;code&gt; como i64 little-endian.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Validação de domínio&lt;&#x2F;strong&gt; (&lt;code&gt;tesseras-core&#x2F;src&#x2F;service.rs&lt;&#x2F;code&gt;) —
-&lt;code&gt;TesseraService::create()&lt;&#x2F;code&gt; agora rejeita tesseras Sealed e Private que não
-fornecem chaves de criptografia. Esta é uma validação no nível de domínio: a
-camada de serviço garante que você não pode criar uma memória selada sem a
-maquinaria criptográfica para protegê-la. A mensagem de erro é clara: &quot;missing
-encryption keys for visibility sealed until 2050-01-01.&quot;&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Atualizações de tipos do core&lt;&#x2F;strong&gt; — &lt;code&gt;TesseraIdentity&lt;&#x2F;code&gt; agora inclui um campo
-opcional &lt;code&gt;encryption_public: Option&amp;lt;HybridEncryptionPublic&amp;gt;&lt;&#x2F;code&gt; contendo tanto as
-chaves públicas X25519 quanto ML-KEM-768. &lt;code&gt;KeyAlgorithm&lt;&#x2F;code&gt; ganhou as variantes
-&lt;code&gt;X25519&lt;&#x2F;code&gt; e &lt;code&gt;MlKem768&lt;&#x2F;code&gt;. O layout do sistema de arquivos de identidade agora
-suporta &lt;code&gt;node.x25519.key&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.pub&lt;&#x2F;code&gt; e &lt;code&gt;node.mlkem768.key&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;.pub&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 8 testes unitários para AES-256-GCM (roundtrip, chave errada, texto
-cifrado adulterado, AAD errado, falha de decriptação cross-context, nonces
-únicos, mais 2 testes baseados em propriedades para payloads arbitrários e
-unicidade de nonces). 5 testes unitários para HybridKem (roundtrip, par de
-chaves errado, X25519 adulterado, determinismo do KDF, mais 1 teste baseado em
-propriedades). 4 testes unitários para SealedKeyEnvelope e KeyPublication. 2
-testes de integração cobrindo o ciclo de vida completo de tesseras seladas e
-privadas: gerar chaves, criar chave de conteúdo, criptografar, selar, desselar,
-decriptar, publicar chave e verificar — o ciclo completo.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;KEM híbrido desde o início&lt;&#x2F;strong&gt;: X25519 + ML-KEM-768 segue a mesma filosofia
-das assinaturas duplas. Não sabemos quais suposições criptográficas se
-manterão ao longo dos milênios, então combinamos algoritmos clássicos e
-pós-quânticos. O custo é ~1,2 KB de material de chave adicional por identidade
-— trivial comparado às fotos e vídeos em uma tessera.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;BLAKE3 para KDF&lt;&#x2F;strong&gt;: ao invés de adicionar &lt;code&gt;hkdf&lt;&#x2F;code&gt; + &lt;code&gt;sha2&lt;&#x2F;code&gt; como novas
-dependências, usamos &lt;code&gt;blake3::derive_key&lt;&#x2F;code&gt; com uma string de contexto fixa. O
-modo de derivação de chaves do BLAKE3 é especificamente projetado para este
-caso de uso, e o projeto já depende do BLAKE3 para hashing de conteúdo.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Manifestos imutáveis&lt;&#x2F;strong&gt;: quando a data &lt;code&gt;open_after&lt;&#x2F;code&gt; de uma tessera selada
-passa, a chave de conteúdo é publicada como um artefato assinado separado
-(&lt;code&gt;KeyPublication&lt;&#x2F;code&gt;), não modificando o manifesto. Isso preserva a natureza
-append-only e endereçada por conteúdo das tesseras. O manifesto foi assinado
-no momento da criação e nunca muda.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Vinculação AAD previne troca de texto cifrado&lt;&#x2F;strong&gt;: o &lt;code&gt;EncryptionContext&lt;&#x2F;code&gt;
-vincula tanto o hash de conteúdo quanto (para tesseras seladas) o timestamp
-&lt;code&gt;open_after&lt;&#x2F;code&gt; nos dados autenticados do AES-GCM. Um atacante que copie conteúdo
-criptografado de uma tessera &quot;selada até 2050&quot; para uma tessera &quot;selada até
-2025&quot; vai descobrir que a decriptação falha — o AAD não corresponde mais.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Encapsulamento de chave por XOR&lt;&#x2F;strong&gt;: o envelope de chave selada usa um XOR
-simples da chave de conteúdo com a chave de transporte derivada do KEM, ao
-invés de uma camada adicional de AES-GCM. Como a chave de transporte é um
-valor aleatório fresco do KEM e é usada exatamente uma vez, o XOR é
-informação-teoricamente seguro para este caso de uso específico e evita
-complexidade desnecessária.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Validação de domínio, não validação de storage&lt;&#x2F;strong&gt;: a verificação de &quot;chaves
-de criptografia ausentes&quot; vive em &lt;code&gt;TesseraService::create()&lt;&#x2F;code&gt;, não na camada de
-storage. Isso segue o padrão de arquitetura hexagonal: regras de domínio são
-aplicadas na fronteira de serviço, não espalhadas pelos adaptadores.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4 continuada: Resiliência e Escala&lt;&#x2F;strong&gt; — Shamir&#x27;s Secret Sharing para
-distribuição de chaves de herdeiros, NAT traversal avançado (STUN&#x2F;TURN),
-ajuste de performance, auditorias de segurança, empacotamento para sistemas
-operacionais&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — Navegador público de tesseras por
-era&#x2F;localização&#x2F;tema&#x2F;idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Tesseras seladas fazem do Tesseras uma verdadeira cápsula do tempo. Um pai agora
-pode gravar uma mensagem para o neto que ainda não nasceu, selá-la até 2060 e
-saber que o envelope criptográfico vai resistir — mesmo que os computadores
-quânticos do futuro tentem abri-lo antes da hora.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 3: Memórias nas Suas Mãos</title>
- <published>2026-02-14T14:00:00+00:00</published>
- <updated>2026-02-14T14:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase3-api-and-apps/"/>
- <id>https://tesseras.net/pt-br/news/phase3-api-and-apps/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase3-api-and-apps/">&lt;p&gt;As pessoas agora podem segurar suas memórias nas próprias mãos. A Fase 3 entrega
-o que as fases anteriores construíram: um app mobile onde alguém baixa o
-Tesseras, cria uma identidade, tira uma foto, e aquela memória entra na rede de
-preservação. Sem contas na nuvem, sem assinaturas, sem nenhuma empresa entre
-você e suas memórias.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-embedded&lt;&#x2F;strong&gt; — Um nó P2P completo que roda dentro de um app mobile. A
-struct &lt;code&gt;EmbeddedNode&lt;&#x2F;code&gt; é dona de um runtime Tokio, banco SQLite, transporte QUIC,
-engine Kademlia DHT, serviço de replicação e serviço de tessera — a mesma stack
-do daemon desktop, compilada como biblioteca compartilhada. Um padrão singleton
-global (&lt;code&gt;Mutex&amp;lt;Option&amp;lt;EmbeddedNode&amp;gt;&amp;gt;&lt;&#x2F;code&gt;) garante um único nó por ciclo de vida do
-app. Ao iniciar, ele abre o banco de dados, executa migrações, carrega ou gera
-uma identidade Ed25519 com proof-of-work para o node ID, faz bind QUIC numa
-porta efêmera, conecta DHT e replicação, e inicia o loop de reparo. Ao parar,
-envia um sinal de shutdown e drena graciosamente.&lt;&#x2F;p&gt;
-&lt;p&gt;Onze funções FFI são expostas para Dart via flutter_rust_bridge: ciclo de vida
-(&lt;code&gt;node_start&lt;&#x2F;code&gt;, &lt;code&gt;node_stop&lt;&#x2F;code&gt;, &lt;code&gt;node_is_running&lt;&#x2F;code&gt;), identidade (&lt;code&gt;create_identity&lt;&#x2F;code&gt;,
-&lt;code&gt;get_identity&lt;&#x2F;code&gt;), memórias (&lt;code&gt;create_memory&lt;&#x2F;code&gt;, &lt;code&gt;get_timeline&lt;&#x2F;code&gt;, &lt;code&gt;get_memory&lt;&#x2F;code&gt;) e
-status da rede (&lt;code&gt;get_network_stats&lt;&#x2F;code&gt;, &lt;code&gt;get_replication_status&lt;&#x2F;code&gt;). Todos os tipos
-que cruzam a fronteira FFI são structs planas com apenas &lt;code&gt;String&lt;&#x2F;code&gt;,
-&lt;code&gt;Option&amp;lt;String&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;Vec&amp;lt;String&amp;gt;&lt;&#x2F;code&gt; e primitivos — sem trait objects, sem generics,
-sem lifetimes.&lt;&#x2F;p&gt;
-&lt;p&gt;Quatro módulos adaptadores fazem a ponte entre as ports do core e as
-implementações concretas: &lt;code&gt;Blake3HasherAdapter&lt;&#x2F;code&gt;,
-&lt;code&gt;Ed25519SignerAdapter&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Ed25519VerifierAdapter&lt;&#x2F;code&gt; para criptografia,
-&lt;code&gt;DhtPortAdapter&lt;&#x2F;code&gt; para operações DHT, e &lt;code&gt;ReplicationHandlerAdapter&lt;&#x2F;code&gt; para RPCs de
-fragmentos e atestação recebidos.&lt;&#x2F;p&gt;
-&lt;p&gt;A feature flag &lt;code&gt;bundled-sqlite&lt;&#x2F;code&gt; compila o SQLite a partir do código-fonte,
-necessário para Android e iOS onde a biblioteca do sistema pode não estar
-disponível. A configuração do Cargokit passa essa flag automaticamente em builds
-de debug e release.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;App Flutter&lt;&#x2F;strong&gt; — Uma aplicação Material Design 3 com gerenciamento de estado
-Riverpod, direcionada para Android, iOS, Linux, macOS e Windows a partir de uma
-única base de código.&lt;&#x2F;p&gt;
-&lt;p&gt;O &lt;em&gt;fluxo de onboarding&lt;&#x2F;em&gt; são três telas: uma tela de boas-vindas explicando o
-projeto em uma frase (&quot;Preserve suas memórias através dos milênios. Sem nuvem.
-Sem empresa.&quot;), uma tela de criação de identidade que dispara a geração do par
-de chaves Ed25519 em Rust, e uma tela de confirmação mostrando o nome do usuário
-e a identidade criptográfica.&lt;&#x2F;p&gt;
-&lt;p&gt;A &lt;em&gt;tela de timeline&lt;&#x2F;em&gt; exibe memórias em ordem cronológica reversa com previews de
-imagem, texto de contexto e chips para tipo de memória e visibilidade.
-Pull-to-refresh recarrega a partir do nó Rust. Um floating action button abre a
-&lt;em&gt;tela de criação de memória&lt;&#x2F;em&gt;, que suporta seleção de foto da galeria ou câmera
-via &lt;code&gt;image_picker&lt;&#x2F;code&gt;, texto de contexto opcional, dropdowns de tipo de memória e
-visibilidade, e tags separadas por vírgula. Criar uma memória chama o FFI Rust
-sincronamente, depois retorna à timeline.&lt;&#x2F;p&gt;
-&lt;p&gt;A &lt;em&gt;tela de rede&lt;&#x2F;em&gt; mostra dois cards: status do nó (contagem de peers, tamanho da
-DHT, estado de bootstrap, uptime) e saúde da replicação (total de fragmentos,
-fragmentos saudáveis, fragmentos em reparo, fator de replicação). A &lt;em&gt;tela de
-configurações&lt;&#x2F;em&gt; exibe a identidade do usuário — nome, node ID truncado, chave
-pública truncada e data de criação.&lt;&#x2F;p&gt;
-&lt;p&gt;Três providers Riverpod gerenciam o estado: &lt;code&gt;nodeProvider&lt;&#x2F;code&gt; inicia o nó embarcado
-ao abrir o app usando o diretório de documentos e para ao fazer dispose;
-&lt;code&gt;identityProvider&lt;&#x2F;code&gt; carrega o perfil existente ou cria um novo;
-&lt;code&gt;timelineProvider&lt;&#x2F;code&gt; busca a lista de memórias com paginação.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 9 testes unitários Rust em tesseras-embedded cobrindo ciclo de vida
-do nó (start&#x2F;stop sem panic), persistência de identidade entre reinícios, ciclos
-de reinício sem corrupção do SQLite, streaming de eventos de rede, recuperação
-de estatísticas, criação de memória e recuperação da timeline, e busca de
-memória individual por hash. 2 testes Flutter: um teste de integração
-verificando inicialização do Rust e startup do app, e um smoke test de widget.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Nó embarcado, não cliente-servidor&lt;&#x2F;strong&gt;: o celular roda a stack P2P completa,
-não um thin client conversando com um daemon remoto. Isso significa que
-memórias são preservadas mesmo sem internet. Usuários com um Raspberry Pi ou
-VPS podem opcionalmente conectar o app ao seu daemon via GraphQL para maior
-disponibilidade, mas não é obrigatório.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;FFI síncrono&lt;&#x2F;strong&gt;: todas as funções flutter_rust_bridge são marcadas como
-&lt;code&gt;#[frb(sync)]&lt;&#x2F;code&gt; e bloqueiam no runtime Tokio interno. Isso simplifica o lado
-Dart (sem complexidade de bridge assíncrono) enquanto o lado Rust lida com
-concorrência internamente. A UI thread do Flutter permanece responsiva porque
-o Riverpod envolve as chamadas em providers assíncronos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Singleton global&lt;&#x2F;strong&gt;: um global &lt;code&gt;Mutex&amp;lt;Option&amp;lt;EmbeddedNode&amp;gt;&amp;gt;&lt;&#x2F;code&gt; garante que o
-ciclo de vida do nó seja previsível — um start, um stop, sem race conditions.
-Plataformas mobile matam processos agressivamente, então simplicidade no
-gerenciamento de ciclo de vida é uma feature.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Tipos FFI planos&lt;&#x2F;strong&gt;: nenhuma abstração Rust vaza pela fronteira FFI. Todo
-tipo é uma struct plana com strings e números. Isso torna os bindings Dart
-auto-gerados confiáveis e fáceis de debugar.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Onboarding de três telas&lt;&#x2F;strong&gt;: a criação de identidade é o único passo
-obrigatório. Sem email, sem senha, sem registro em servidor. O app gera uma
-identidade criptográfica localmente e está pronto para uso.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4: Resiliência e Escala&lt;&#x2F;strong&gt; — NAT traversal avançado (STUN&#x2F;TURN),
-Shamir&#x27;s Secret Sharing para herdeiros, tesseras seladas com criptografia
-temporal, ajuste de performance, auditorias de segurança, empacotamento para
-Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — Navegador público de tesseras por
-era&#x2F;localização&#x2F;tema&#x2F;idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;A infraestrutura está completa. A rede existe, a replicação funciona, e agora
-qualquer pessoa com um celular pode participar. O que resta é fortalecer o que
-temos e abrir para o mundo.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Reed-Solomon: Como o Tesseras Sobrevive à Perda de Dados</title>
- <published>2026-02-14T14:00:00+00:00</published>
- <updated>2026-02-14T14:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/reed-solomon/"/>
- <id>https://tesseras.net/pt-br/news/reed-solomon/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/reed-solomon/">&lt;p&gt;Seu disco rígido vai morrer. Seu provedor de nuvem vai pivotar. O array RAID no
-seu armário vai sobreviver ao controlador, mas não ao dono. Se uma memória está
-armazenada em exatamente um lugar, ela tem exatamente uma forma de se perder
-para sempre.&lt;&#x2F;p&gt;
-&lt;p&gt;Tesseras é uma rede que mantém memórias humanas vivas através de ajuda mútua. O
-mecanismo central de sobrevivência é a &lt;strong&gt;codificação de apagamento
-Reed-Solomon&lt;&#x2F;strong&gt; — uma técnica emprestada da comunicação espacial profunda que nos
-permite reconstruir dados mesmo quando pedaços desaparecem.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-e-reed-solomon&quot;&gt;O que é Reed-Solomon?&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon é uma família de códigos corretores de erros inventada por Irving
-Reed e Gustave Solomon em 1960. O caso de uso original era corrigir erros em
-dados transmitidos por canais ruidosos — pense na Voyager enviando fotos de
-Júpiter, ou num CD tocando apesar de arranhões.&lt;&#x2F;p&gt;
-&lt;p&gt;A ideia-chave: se você adicionar redundância cuidadosamente calculada aos seus
-dados &lt;em&gt;antes&lt;&#x2F;em&gt; que algo dê errado, você pode recuperar o original mesmo depois de
-perder alguns pedaços.&lt;&#x2F;p&gt;
-&lt;p&gt;Eis a intuição. Suponha que você tenha um polinômio de grau 2 — uma parábola.
-Você precisa de 3 pontos para defini-lo de forma única. Mas se você avaliá-lo em
-5 pontos, pode perder quaisquer 2 desses 5 e ainda reconstruir o polinômio a
-partir dos 3 restantes. Reed-Solomon generaliza essa ideia para trabalhar sobre
-corpos finitos (corpos de Galois), onde o &quot;polinômio&quot; são seus dados e os
-&quot;pontos de avaliação&quot; são seus fragmentos.&lt;&#x2F;p&gt;
-&lt;p&gt;Em termos concretos:&lt;&#x2F;p&gt;
-&lt;ol&gt;
-&lt;li&gt;&lt;strong&gt;Divida&lt;&#x2F;strong&gt; seus dados em &lt;em&gt;k&lt;&#x2F;em&gt; shards de dados&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Calcule&lt;&#x2F;strong&gt; &lt;em&gt;m&lt;&#x2F;em&gt; shards de paridade a partir dos shards de dados&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Distribua&lt;&#x2F;strong&gt; todos os &lt;em&gt;k + m&lt;&#x2F;em&gt; shards em diferentes locais&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reconstrua&lt;&#x2F;strong&gt; os dados originais a partir de quaisquer &lt;em&gt;k&lt;&#x2F;em&gt; dos &lt;em&gt;k + m&lt;&#x2F;em&gt;
-shards&lt;&#x2F;li&gt;
-&lt;&#x2F;ol&gt;
-&lt;p&gt;Você pode perder até &lt;em&gt;m&lt;&#x2F;em&gt; shards — quaisquer &lt;em&gt;m&lt;&#x2F;em&gt;, de dados ou paridade, em
-qualquer combinação — e ainda recuperar tudo.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;por-que-nao-simplesmente-fazer-copias&quot;&gt;Por que não simplesmente fazer cópias?&lt;&#x2F;h2&gt;
-&lt;p&gt;A abordagem ingênua para redundância é a replicação: faça 3 cópias, armazene-as
-em 3 lugares. Isso dá tolerância a 2 falhas ao custo de 3x o seu armazenamento.&lt;&#x2F;p&gt;
-&lt;p&gt;Reed-Solomon é dramaticamente mais eficiente:&lt;&#x2F;p&gt;
-&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Estratégia&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Overhead de armazenamento&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: right&quot;&gt;Falhas toleradas&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
-&lt;tr&gt;&lt;td&gt;Replicação 3x&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;200%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2 de 3&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Reed-Solomon (16,8)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;50%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;8 de 24&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;tr&gt;&lt;td&gt;Reed-Solomon (48,24)&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;50%&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24 de 72&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
-&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
-&lt;p&gt;Com 16 shards de dados e 8 de paridade, você usa 50% de armazenamento extra mas
-pode sobreviver à perda de um terço de todos os fragmentos. Para alcançar a
-mesma tolerância a falhas só com replicação, você precisaria de 3x o
-armazenamento.&lt;&#x2F;p&gt;
-&lt;p&gt;Para uma rede que visa preservar memórias ao longo de décadas e séculos, essa
-eficiência não é um luxo — é a diferença entre um sistema viável e um que se
-afoga no próprio overhead.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;como-o-tesseras-usa-reed-solomon&quot;&gt;Como o Tesseras usa Reed-Solomon&lt;&#x2F;h2&gt;
-&lt;p&gt;Nem todos os dados merecem o mesmo tratamento. Uma memória de texto de 500 bytes
-e um vídeo de 100 MB têm necessidades de redundância muito diferentes. O
-Tesseras usa uma estratégia de fragmentação em três camadas:&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Small (&amp;lt; 4 MB)&lt;&#x2F;strong&gt; — Replicação do arquivo inteiro para 7 pares. Para tesseras
-pequenas, o overhead da codificação de apagamento (tempo de codificação,
-gerenciamento de fragmentos, lógica de reconstrução) supera seus benefícios.
-Cópias simples são mais rápidas e mais simples.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Medium (4–256 MB)&lt;&#x2F;strong&gt; — 16 shards de dados + 8 de paridade = 24 fragmentos no
-total. Cada fragmento tem aproximadamente 1&#x2F;16 do tamanho original. Quaisquer 16
-dos 24 fragmentos reconstroem o original. Distribuídos entre 7 pares.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Large (≥ 256 MB)&lt;&#x2F;strong&gt; — 48 shards de dados + 24 de paridade = 72 fragmentos no
-total. Maior contagem de shards significa fragmentos individuais menores (mais
-fáceis de transferir e armazenar) e maior tolerância absoluta a falhas. Também
-distribuídos entre 7 pares.&lt;&#x2F;p&gt;
-&lt;p&gt;A implementação usa o crate &lt;code&gt;reed-solomon-erasure&lt;&#x2F;code&gt; operando sobre GF(2⁸) — o
-mesmo corpo de Galois usado em códigos QR e CDs. Cada fragmento carrega um
-checksum BLAKE3 para que a corrupção seja detectada imediatamente, não propagada
-silenciosamente.&lt;&#x2F;p&gt;
-&lt;pre&gt;&lt;code&gt;Tessera (álbum de fotos de 120 MB)
- ↓ codificar
-16 shards de dados (7,5 MB cada) + 8 shards de paridade (7,5 MB cada)
- ↓ distribuir
-24 fragmentos entre 7 pares (diversidade de sub-rede)
- ↓ quaisquer 16 fragmentos
-Tessera original recuperada
-&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
-&lt;h2 id=&quot;os-desafios&quot;&gt;Os desafios&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon resolve o problema matemático da redundância. Os desafios de
-engenharia estão em tudo ao redor.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;rastreamento-de-fragmentos&quot;&gt;Rastreamento de fragmentos&lt;&#x2F;h3&gt;
-&lt;p&gt;Cada fragmento precisa ser localizável. O Tesseras usa uma DHT Kademlia para
-descoberta de pares e mapeamento de fragmentos para pares. Quando um nó fica
-offline, seus fragmentos precisam ser recriados e distribuídos para novos pares.
-Isso significa rastrear quais fragmentos existem, onde estão e se ainda estão
-intactos — numa rede sem autoridade central.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;corrupcao-silenciosa&quot;&gt;Corrupção silenciosa&lt;&#x2F;h3&gt;
-&lt;p&gt;Um fragmento que retorna dados errados é pior que um ausente — pelo menos um
-fragmento ausente é honestamente ausente. O Tesseras aborda isso com
-verificações de saúde baseadas em atestação: o loop de reparo periodicamente
-pede aos detentores de fragmentos que provem posse retornando checksums BLAKE3.
-Se um checksum não bater, o fragmento é tratado como perdido.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;falhas-correlacionadas&quot;&gt;Falhas correlacionadas&lt;&#x2F;h3&gt;
-&lt;p&gt;Se todos os 24 fragmentos de uma tessera caírem em máquinas no mesmo datacenter,
-uma única queda de energia os elimina todos. A matemática do Reed-Solomon assume
-falhas independentes. O Tesseras impõe &lt;strong&gt;diversidade de sub-rede&lt;&#x2F;strong&gt; durante a
-distribuição: no máximo 2 fragmentos por sub-rede &#x2F;24 IPv4 (ou prefixo &#x2F;48
-IPv6). Isso espalha fragmentos por diferentes infraestruturas físicas.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;velocidade-de-reparo-vs-carga-na-rede&quot;&gt;Velocidade de reparo vs. carga na rede&lt;&#x2F;h3&gt;
-&lt;p&gt;Quando um par fica offline, o relógio começa a contar. Fragmentos perdidos
-precisam ser recriados antes que mais falhas se acumulem. Mas reparo agressivo
-inunda a rede. O Tesseras equilibra isso com um loop de reparo configurável
-(padrão: a cada 24 horas com 2 horas de jitter) e limites de transferências
-simultâneas (padrão: 4 transferências simultâneas). O jitter previne tempestades
-de reparo onde cada nó verifica seus fragmentos no mesmo momento.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;gerenciamento-de-chaves-a-longo-prazo&quot;&gt;Gerenciamento de chaves a longo prazo&lt;&#x2F;h3&gt;
-&lt;p&gt;Reed-Solomon protege contra perda de dados, não contra perda de acesso. Se uma
-tessera é criptografada (visibilidade privada ou selada), você precisa da chave
-de descriptografia para tornar os dados recuperados úteis. O Tesseras separa
-essas preocupações: codificação de apagamento cuida da disponibilidade, enquanto
-o Compartilhamento de Segredo de Shamir (uma fase futura) cuidará da
-distribuição de chaves entre herdeiros. A filosofia de design do projeto —
-criptografar o mínimo possível — mantém o problema de gerenciamento de chaves
-pequeno.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;limitacoes-do-corpo-de-galois&quot;&gt;Limitações do corpo de Galois&lt;&#x2F;h3&gt;
-&lt;p&gt;O corpo GF(2⁸) limita o número total de shards a 255 (dados + paridade
-combinados). Para o Tesseras, isso não é uma restrição prática — mesmo a camada
-Large usa apenas 72 shards. Mas significa que arquivos extremamente grandes com
-milhares de fragmentos exigiriam um corpo diferente ou um esquema de codificação
-em camadas.&lt;&#x2F;p&gt;
-&lt;h3 id=&quot;compatibilidade-evolutiva-do-codec&quot;&gt;Compatibilidade evolutiva do codec&lt;&#x2F;h3&gt;
-&lt;p&gt;Uma tessera codificada hoje precisa ser decodificável em 50 anos. Reed-Solomon
-sobre GF(2⁸) é um dos algoritmos mais amplamente implementados na computação —
-está em todo leitor de CD, em todo scanner de código QR, em toda sonda espacial.
-Essa ubiquidade é em si uma estratégia de sobrevivência. O algoritmo não será
-esquecido porque metade da infraestrutura do mundo depende dele.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-quadro-geral&quot;&gt;O quadro geral&lt;&#x2F;h2&gt;
-&lt;p&gt;Reed-Solomon é uma peça de um quebra-cabeça maior. Ele trabalha em conjunto com:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;DHT Kademlia&lt;&#x2F;strong&gt; para encontrar pares e rotear fragmentos&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Checksums BLAKE3&lt;&#x2F;strong&gt; para verificação de integridade&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reciprocidade bilateral&lt;&#x2F;strong&gt; para troca justa de armazenamento (sem blockchain)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Diversidade de sub-rede&lt;&#x2F;strong&gt; para independência de falhas&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reparo automático&lt;&#x2F;strong&gt; para manter a redundância ao longo do tempo&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Nenhuma técnica isolada faz memórias sobreviverem. Reed-Solomon garante que
-dados &lt;em&gt;podem&lt;&#x2F;em&gt; ser recuperados. A DHT garante que fragmentos &lt;em&gt;podem ser
-encontrados&lt;&#x2F;em&gt;. A reciprocidade garante que pares &lt;em&gt;querem ajudar&lt;&#x2F;em&gt;. O reparo
-garante que nada disso se degrade com o tempo.&lt;&#x2F;p&gt;
-&lt;p&gt;Uma tessera é uma aposta de que a soma desses mecanismos, rodando em muitas
-máquinas independentes operadas por muitas pessoas independentes, é mais durável
-que qualquer instituição isolada. Reed-Solomon é a fundação matemática dessa
-aposta.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 2: Memórias Sobrevivem</title>
- <published>2026-02-14T12:00:00+00:00</published>
- <updated>2026-02-14T12:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase2-replication/"/>
- <id>https://tesseras.net/pt-br/news/phase2-replication/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase2-replication/">&lt;p&gt;Uma tessera não está mais presa a uma única máquina. A Fase 2 entrega a camada
-de replicação: os dados são divididos em fragmentos com codificação de
-apagamento, distribuídos entre múltiplos pares e reparados automaticamente
-quando nós ficam offline. Um livro-razão de reciprocidade bilateral garante
-troca justa de armazenamento — sem blockchain, sem tokens.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; (atualizado) — Novos tipos de domínio de replicação:
-&lt;code&gt;FragmentPlan&lt;&#x2F;code&gt; (seleciona a camada de fragmentação baseada no tamanho da
-tessera), &lt;code&gt;FragmentId&lt;&#x2F;code&gt; (hash da tessera + índice + contagem de shards +
-checksum), &lt;code&gt;FragmentEnvelope&lt;&#x2F;code&gt; (fragmento com seus metadados para transporte na
-rede), &lt;code&gt;FragmentationTier&lt;&#x2F;code&gt; (Small&#x2F;Medium&#x2F;Large), &lt;code&gt;Attestation&lt;&#x2F;code&gt; (prova de que um
-nó possui um fragmento em um dado momento) e &lt;code&gt;ReplicateAck&lt;&#x2F;code&gt; (confirmação de
-recebimento de fragmento). Três novas traits de porta definem os limites
-hexagonais: &lt;code&gt;DhtPort&lt;&#x2F;code&gt; (encontrar pares, replicar fragmentos, solicitar
-atestações, ping), &lt;code&gt;FragmentStore&lt;&#x2F;code&gt; (armazenar&#x2F;ler&#x2F;deletar&#x2F;listar&#x2F;verificar
-fragmentos) e &lt;code&gt;ReciprocityLedger&lt;&#x2F;code&gt; (registrar trocas de armazenamento, consultar
-saldos, encontrar melhores pares). O tamanho máximo de uma tessera é 1 GB.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-crypto&lt;&#x2F;strong&gt; (atualizado) — O &lt;code&gt;ReedSolomonCoder&lt;&#x2F;code&gt; existente agora alimenta
-a codificação de fragmentos. Os dados são divididos em shards, shards de
-paridade são computados, e qualquer combinação de shards de dados pode
-reconstruir o original — desde que o número de shards ausentes não exceda a
-contagem de paridade.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-storage&lt;&#x2F;strong&gt; (atualizado) — Dois novos adaptadores:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt; — armazena dados de fragmentos como arquivos em disco
-(&lt;code&gt;{raiz}&#x2F;{hash_tessera}&#x2F;{indice:03}.shard&lt;&#x2F;code&gt;) com um índice de metadados SQLite
-rastreando hash da tessera, índice do shard, contagem de shards, checksum e
-tamanho em bytes. A verificação recalcula o hash BLAKE3 e compara com o
-checksum armazenado.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;SqliteReciprocityLedger&lt;&#x2F;code&gt; — contabilidade bilateral de armazenamento em
-SQLite. Cada par tem uma linha rastreando bytes armazenados para eles e bytes
-que eles armazenam para nós. A coluna &lt;code&gt;balance&lt;&#x2F;code&gt; é uma coluna gerada
-(&lt;code&gt;bytes_they_store_for_us - bytes_stored_for_them&lt;&#x2F;code&gt;). UPSERT garante incremento
-atômico dos contadores.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Nova migração (&lt;code&gt;002_replication.sql&lt;&#x2F;code&gt;) adiciona tabelas para fragmentos, planos
-de fragmentação, detentores, mapeamentos detentor-fragmento e saldos de
-reciprocidade.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-dht&lt;&#x2F;strong&gt; (atualizado) — Quatro novas variantes de mensagem: &lt;code&gt;Replicate&lt;&#x2F;code&gt;
-(enviar um envelope de fragmento), &lt;code&gt;ReplicateAck&lt;&#x2F;code&gt; (confirmar recebimento),
-&lt;code&gt;AttestRequest&lt;&#x2F;code&gt; (pedir a um nó que prove que possui os fragmentos de uma
-tessera) e &lt;code&gt;AttestResponse&lt;&#x2F;code&gt; (retornar atestação com checksums e timestamp). O
-engine trata essas mensagens em seu loop de despacho.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-replication&lt;&#x2F;strong&gt; — O novo crate, com cinco módulos:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Codificação de fragmentos&lt;&#x2F;em&gt; (&lt;code&gt;fragment.rs&lt;&#x2F;code&gt;): &lt;code&gt;encode_tessera()&lt;&#x2F;code&gt; seleciona a
-camada de fragmentação baseada no tamanho e então chama a codificação
-Reed-Solomon para as camadas Medium e Large. Três camadas:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Small&lt;&#x2F;strong&gt; (&amp;lt; 4 MB): replicação do arquivo inteiro para r=7 pares, sem
-codificação de apagamento&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Medium&lt;&#x2F;strong&gt; (4–256 MB): 16 shards de dados + 8 de paridade, distribuídos
-entre r=7 pares&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Large&lt;&#x2F;strong&gt; (≥ 256 MB): 48 shards de dados + 24 de paridade, distribuídos
-entre r=7 pares&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Distribuição&lt;&#x2F;em&gt; (&lt;code&gt;distributor.rs&lt;&#x2F;code&gt;): filtragem de diversidade de sub-rede limita
-pares por sub-rede &#x2F;24 IPv4 (ou prefixo &#x2F;48 IPv6) para evitar falhas
-correlacionadas. Se todos os seus fragmentos caírem no mesmo rack, uma única
-queda de energia os elimina.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Serviço&lt;&#x2F;em&gt; (&lt;code&gt;service.rs&lt;&#x2F;code&gt;): &lt;code&gt;ReplicationService&lt;&#x2F;code&gt; é o orquestrador.
-&lt;code&gt;replicate_tessera()&lt;&#x2F;code&gt; codifica os dados, encontra os pares mais próximos via
-DHT, aplica diversidade de sub-rede e distribui fragmentos em round-robin.
-&lt;code&gt;receive_fragment()&lt;&#x2F;code&gt; valida o checksum BLAKE3, verifica o saldo de
-reciprocidade (rejeita se o déficit do remetente exceder o limite
-configurado), armazena o fragmento e atualiza o livro-razão.
-&lt;code&gt;handle_attestation_request()&lt;&#x2F;code&gt; lista os fragmentos locais e calcula seus
-checksums como prova de posse.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Reparo&lt;&#x2F;em&gt; (&lt;code&gt;repair.rs&lt;&#x2F;code&gt;): &lt;code&gt;check_tessera_health()&lt;&#x2F;code&gt; solicita atestações dos
-detentores conhecidos, recorre ao ping para nós não responsivos, verifica a
-integridade local dos fragmentos e retorna uma de três ações: &lt;code&gt;Healthy&lt;&#x2F;code&gt;,
-&lt;code&gt;NeedsReplication { deficit }&lt;&#x2F;code&gt; ou &lt;code&gt;CorruptLocal { fragment_index }&lt;&#x2F;code&gt;. O loop de
-reparo roda a cada 24 horas (com 2 horas de jitter) via &lt;code&gt;tokio::select!&lt;&#x2F;code&gt; com
-integração de desligamento.&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;li&gt;
-&lt;p&gt;&lt;em&gt;Configuração&lt;&#x2F;em&gt; (&lt;code&gt;config.rs&lt;&#x2F;code&gt;): &lt;code&gt;ReplicationConfig&lt;&#x2F;code&gt; com padrões para intervalo
-de reparo (24h), jitter (2h), transferências simultâneas (4), espaço livre
-mínimo (1 GB), tolerância de déficit (256 MB) e limite de armazenamento por
-par (1 GB).&lt;&#x2F;p&gt;
-&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;tesd&lt;&#x2F;strong&gt; (atualizado) — O daemon agora abre um banco de dados SQLite
-(&lt;code&gt;db&#x2F;tesseras.db&lt;&#x2F;code&gt;), executa migrações, cria instâncias de &lt;code&gt;FsFragmentStore&lt;&#x2F;code&gt;,
-&lt;code&gt;SqliteReciprocityLedger&lt;&#x2F;code&gt; e &lt;code&gt;FsBlobStore&lt;&#x2F;code&gt;, envolve o engine DHT em um
-&lt;code&gt;DhtPortAdapter&lt;&#x2F;code&gt;, constrói um &lt;code&gt;ReplicationService&lt;&#x2F;code&gt; e lança o loop de reparo como
-tarefa em segundo plano com desligamento gracioso.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 193 testes em todo o workspace:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;15 testes unitários em tesseras-replication (camadas de codificação de
-fragmentos, validação de checksum, diversidade de sub-rede, verificações de
-saúde do reparo, fluxos de recebimento&#x2F;replicação do serviço)&lt;&#x2F;li&gt;
-&lt;li&gt;3 testes de integração com armazenamento real (ciclo completo
-codificar→distribuir→receber para tessera média, replicação de arquivo inteiro
-para tessera pequena, rejeição de fragmento adulterado)&lt;&#x2F;li&gt;
-&lt;li&gt;Testes usam SQLite em memória + diretório temporário para fragmentos com mocks
-mockall para DHT e BlobStore&lt;&#x2F;li&gt;
-&lt;li&gt;Zero avisos do clippy, formatação limpa&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fragmentação em três camadas&lt;&#x2F;strong&gt;: arquivos pequenos não precisam de
-codificação de apagamento — o overhead não compensa. Arquivos médios e grandes
-recebem progressivamente mais shards de paridade. Isso evita desperdiçar
-armazenamento em tesseras pequenas enquanto oferece redundância forte para as
-grandes.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Distribuição por push do dono&lt;&#x2F;strong&gt;: o dono da tessera codifica os fragmentos e
-os envia aos pares, em vez dos pares puxarem. Isso simplifica o protocolo (sem
-fase de negociação) e garante que os fragmentos são distribuídos
-imediatamente.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Reciprocidade bilateral sem consenso&lt;&#x2F;strong&gt;: cada nó rastreia seu próprio saldo
-com cada par localmente. Sem livro-razão global, sem token, sem blockchain. Se
-o par A armazena 500 MB para o par B, o par B deveria armazenar
-aproximadamente 500 MB para o par A. Free riders perdem redundância
-gradualmente — seus fragmentos são despriorizados para reparo, mas nunca
-deletados.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Diversidade de sub-rede&lt;&#x2F;strong&gt;: os fragmentos são espalhados por diferentes
-sub-redes para sobreviver a falhas correlacionadas. Uma queda de datacenter
-não deveria eliminar todas as cópias de uma tessera.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Verificações de saúde por atestação primeiro&lt;&#x2F;strong&gt;: o loop de reparo pede aos
-detentores que provem posse (atestação com checksums) antes de declarar uma
-tessera degradada. Apenas quando a atestação falha é que ele recorre a um
-simples ping. Isso detecta corrupção silenciosa de dados, não apenas partida
-de nós.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 3: API e Apps&lt;&#x2F;strong&gt; — App Flutter mobile&#x2F;desktop via flutter_rust_bridge,
-API GraphQL (async-graphql), nó WASM no navegador&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4: Resiliência e Escala&lt;&#x2F;strong&gt; — Assinaturas pós-quânticas ML-DSA, travessia
-avançada de NAT, Compartilhamento de Segredo de Shamir para herdeiros,
-empacotamento para Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI no SourceHut&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — navegador público de tesseras, curadoria
-institucional, integração genealógica, exportação para mídia física&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Os nós conseguem se encontrar e manter vivas as memórias uns dos outros. Em
-seguida, damos às pessoas uma forma de segurar suas memórias nas mãos.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 1: Nós Se Encontram</title>
- <published>2026-02-14T11:00:00+00:00</published>
- <updated>2026-02-14T11:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase1-basic-network/"/>
- <id>https://tesseras.net/pt-br/news/phase1-basic-network/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase1-basic-network/">&lt;p&gt;Tesseras não é mais uma ferramenta apenas local. A Fase 1 entrega a camada de
-rede: nós se descobrem através de uma DHT Kademlia, comunicam-se sobre QUIC e
-publicam ponteiros de tesseras que qualquer par na rede pode encontrar. Uma
-tessera criada no nó A agora pode ser encontrada a partir do nó C.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; (atualizado) — Novos tipos de domínio de rede:
-&lt;code&gt;TesseraPointer&lt;&#x2F;code&gt; (referência leve aos detentores de uma tessera e localização
-dos fragmentos), &lt;code&gt;NodeIdentity&lt;&#x2F;code&gt; (ID do nó + chave pública + nonce de prova de
-trabalho), &lt;code&gt;NodeInfo&lt;&#x2F;code&gt; (identidade + endereço + capacidades) e &lt;code&gt;Capabilities&lt;&#x2F;code&gt;
-(bitflags do que um nó suporta: DHT, armazenamento, relay, replicação).&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-net&lt;&#x2F;strong&gt; — A camada de transporte, construída sobre QUIC via quinn. A
-trait &lt;code&gt;Transport&lt;&#x2F;code&gt; define a porta: &lt;code&gt;send&lt;&#x2F;code&gt;, &lt;code&gt;recv&lt;&#x2F;code&gt;, &lt;code&gt;disconnect&lt;&#x2F;code&gt;, &lt;code&gt;local_addr&lt;&#x2F;code&gt;.
-Dois adaptadores a implementam:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;QuinnTransport&lt;&#x2F;code&gt; — QUIC real com TLS auto-assinado, negociação ALPN
-(&lt;code&gt;tesseras&#x2F;1&lt;&#x2F;code&gt;), pool de conexões via DashMap e um loop de aceitação em
-background que trata streams recebidas.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;MemTransport&lt;&#x2F;code&gt; + &lt;code&gt;SimNetwork&lt;&#x2F;code&gt; — canais em memória para testes determinísticos
-sem I&#x2F;O de rede. Cada teste de integração no crate DHT roda contra este
-adaptador.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;O protocolo de fio usa MessagePack com prefixo de comprimento: um cabeçalho de 4
-bytes big-endian seguido de um payload rmp-serde. &lt;code&gt;WireMessage&lt;&#x2F;code&gt; carrega um byte
-de versão, ID de requisição e um corpo que pode ser requisição, resposta ou erro
-de protocolo. Tamanho máximo de mensagem é 64 KiB.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-dht&lt;&#x2F;strong&gt; — Uma implementação completa de Kademlia:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;em&gt;Tabela de roteamento&lt;&#x2F;em&gt;: 160 k-buckets com k=20. Evicção do menos recentemente
-visto, mover-para-trás ao atualizar, verificação por ping antes de substituir
-a entrada mais antiga de um bucket cheio.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Distância XOR&lt;&#x2F;em&gt;: métrica XOR de 160 bits com indexação de bucket pelo bit mais
-significativo diferente.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Prova de trabalho&lt;&#x2F;em&gt;: nós iteram um nonce até que
-&lt;code&gt;BLAKE3(pubkey || nonce)[..20]&lt;&#x2F;code&gt; tenha 8 bits zero iniciais (~256 tentativas de
-hash em média). Barato o suficiente para qualquer dispositivo, caro o
-suficiente para tornar ataques Sybil impraticáveis em escala.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Mensagens de protocolo&lt;&#x2F;em&gt;: Ping&#x2F;Pong, FindNode&#x2F;FindNodeResponse,
-FindValue&#x2F;FindValueResult, Store — todos serializados com MessagePack via
-serde.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;Armazenamento de ponteiros&lt;&#x2F;em&gt;: armazenamento em memória limitado com TTL
-configurável (24 horas padrão) e máximo de entradas (10.000 padrão). Quando
-cheio, remove ponteiros mais distantes do ID do nó local, seguindo o modelo de
-responsabilidade baseado em distância do Kademlia.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;em&gt;DhtEngine&lt;&#x2F;em&gt;: o orquestrador principal. Trata RPCs recebidos, executa buscas
-iterativas (paralelismo alpha=3), bootstrap, publicação e busca. O método
-&lt;code&gt;run()&lt;&#x2F;code&gt; dirige um loop &lt;code&gt;tokio::select!&lt;&#x2F;code&gt; com timers de manutenção: refresh da
-tabela de roteamento a cada 60 segundos, expiração de ponteiros a cada 5
-minutos.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;tesd&lt;&#x2F;strong&gt; — Um binário de nó completo. Analisa argumentos de CLI (endereço de
-bind, pares de bootstrap, diretório de dados), gera uma identidade de nó válida
-por PoW, abre um endpoint QUIC, faz bootstrap na rede e roda o motor DHT.
-Desligamento gracioso com Ctrl+C via tratamento de sinais do tokio.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Infraestrutura&lt;&#x2F;strong&gt; — Configuração OpenTofu para dois nós bootstrap no Hetzner
-Cloud (instâncias cx22 em Falkenstein, Alemanha e Helsinki, Finlândia). Script
-de provisionamento cloud-init cria um usuário dedicado &lt;code&gt;tesseras&lt;&#x2F;code&gt;, escreve um
-arquivo de configuração e configura um serviço systemd. Regras de firewall abrem
-UDP 4433 (QUIC) e restringem métricas a acesso interno.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 139 testes em todo o workspace:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;47 testes unitários em tesseras-dht (tabela de roteamento, distância, PoW,
-armazenamento de ponteiros, serialização de mensagens, RPCs do engine)&lt;&#x2F;li&gt;
-&lt;li&gt;5 testes de integração multi-nó (bootstrap de 3 nós, convergência de lookup
-com 10 nós, publicar-e-encontrar, detecção de partida de nó, rejeição de PoW)&lt;&#x2F;li&gt;
-&lt;li&gt;14 testes em tesseras-net (roundtrips de codec, send&#x2F;recv de transporte,
-backpressure, disconnect)&lt;&#x2F;li&gt;
-&lt;li&gt;Testes de fumaça com Docker Compose usando 3 nós containerizados comunicando
-sobre QUIC real&lt;&#x2F;li&gt;
-&lt;li&gt;Zero avisos do clippy, formatação limpa&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Transport como porta&lt;&#x2F;strong&gt;: a trait &lt;code&gt;Transport&lt;&#x2F;code&gt; é a única interface entre o
-motor DHT e a rede. Trocar QUIC por qualquer outro protocolo significa
-implementar quatro métodos. Todos os testes de DHT usam o adaptador em
-memória, tornando-os rápidos e determinísticos.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Um stream por RPC&lt;&#x2F;strong&gt;: cada par requisição-resposta DHT usa um stream
-bidirecional QUIC novo. Sem complexidade de multiplexação, sem bloqueio
-head-of-line entre operações independentes. O QUIC trata a multiplexação no
-nível da conexão.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;MessagePack em vez de Protobuf&lt;&#x2F;strong&gt;: codificação binária compacta sem geração
-de código ou arquivos de esquema. Integração com serde significa que adicionar
-um campo a uma mensagem é uma mudança de uma linha. Trade-off: sem garantias
-de evolução de esquema embutidas, mas neste estágio velocidade importa mais.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;PoW em vez de stake ou reputação&lt;&#x2F;strong&gt;: uma identidade de nó custa ~256 hashes
-BLAKE3. Isso roda em menos de um segundo em qualquer hardware, incluindo um
-Raspberry Pi, mas gerar milhares de identidades para um ataque Sybil se torna
-caro. Sem tokens, sem blockchain, sem dependências externas.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Busca iterativa com atualização da tabela de roteamento&lt;&#x2F;strong&gt;: nós descobertos
-são adicionados à tabela de roteamento conforme encontrados durante buscas
-iterativas, seguindo o comportamento padrão do Kademlia. Isso garante que a
-tabela de roteamento melhore organicamente conforme os nós interagem.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 2: Replicação&lt;&#x2F;strong&gt; — Codificação de apagamento Reed-Solomon pela rede,
-distribuição de fragmentos, loops de reparo automáticos, livro-razão de
-reciprocidade bilateral (sem blockchain, sem tokens)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 3: API e Apps&lt;&#x2F;strong&gt; — App Flutter mobile&#x2F;desktop via flutter_rust_bridge,
-API GraphQL (async-graphql), nó WASM no navegador&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4: Resiliência e Escala&lt;&#x2F;strong&gt; — Assinaturas pós-quânticas ML-DSA, travessia
-avançada de NAT, Compartilhamento de Segredo de Shamir para herdeiros,
-empacotamento para Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI no SourceHut&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 5: Exploração e Cultura&lt;&#x2F;strong&gt; — navegador público de tesseras, curadoria
-institucional, integração genealógica, exportação para mídia física&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;Os nós conseguem se encontrar. Em seguida, aprendem a manter vivas as memórias
-uns dos outros.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Fase 0: Fundação Construída</title>
- <published>2026-02-14T10:00:00+00:00</published>
- <updated>2026-02-14T10:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/phase0-foundation/"/>
- <id>https://tesseras.net/pt-br/news/phase0-foundation/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/phase0-foundation/">&lt;p&gt;O primeiro marco do projeto Tesseras está completo. A Fase 0 estabelece a
-fundação sobre a qual cada componente futuro será construído: tipos de domínio,
-criptografia, armazenamento e uma interface de linha de comando funcional.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;o-que-foi-construido&quot;&gt;O que foi construído&lt;&#x2F;h2&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-core&lt;&#x2F;strong&gt; — A camada de domínio define o formato tessera: &lt;code&gt;ContentHash&lt;&#x2F;code&gt;
-(BLAKE3, 32 bytes), &lt;code&gt;NodeId&lt;&#x2F;code&gt; (Kademlia, 20 bytes), tipos de memória (Moment,
-Reflection, Daily, Relation, Object), modos de visibilidade (Private, Circle,
-Public, PublicAfterDeath, Sealed) e um formato de manifesto em texto plano que
-pode ser interpretado por qualquer linguagem de programação pelos próximos mil
-anos. A camada de serviço (&lt;code&gt;TesseraService&lt;&#x2F;code&gt;) gerencia operações de criação,
-verificação, exportação e listagem através de port traits, seguindo arquitetura
-hexagonal.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-crypto&lt;&#x2F;strong&gt; — Geração de chaves Ed25519, assinatura e verificação. Um
-framework de assinatura dual (Ed25519 + placeholder ML-DSA) pronto para migração
-pós-quântica. Hashing de conteúdo com BLAKE3. Codificação de apagamento
-Reed-Solomon atrás de uma feature flag para futura replicação.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-storage&lt;&#x2F;strong&gt; — Índice SQLite via rusqlite com migrações em SQL puro.
-Blob store no sistema de arquivos com layout endereçável por conteúdo
-(&lt;code&gt;blobs&#x2F;&amp;lt;tessera_hash&amp;gt;&#x2F;&amp;lt;memory_hash&amp;gt;&#x2F;&amp;lt;filename&amp;gt;&lt;&#x2F;code&gt;). Persistência de chaves de
-identidade em disco.&lt;&#x2F;p&gt;
-&lt;p&gt;&lt;strong&gt;tesseras-cli&lt;&#x2F;strong&gt; — Um binário &lt;code&gt;tesseras&lt;&#x2F;code&gt; funcional com cinco comandos:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;code&gt;init&lt;&#x2F;code&gt; — gera identidade Ed25519, cria banco de dados SQLite&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;create &amp;lt;dir&amp;gt;&lt;&#x2F;code&gt; — varre um diretório por arquivos de mídia, cria uma tessera
-assinada&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;verify &amp;lt;hash&amp;gt;&lt;&#x2F;code&gt; — verifica assinatura e integridade dos arquivos&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;export &amp;lt;hash&amp;gt; &amp;lt;dest&amp;gt;&lt;&#x2F;code&gt; — escreve um diretório tessera autocontido&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;code&gt;list&lt;&#x2F;code&gt; — mostra uma tabela das tesseras armazenadas&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;&lt;strong&gt;Testes&lt;&#x2F;strong&gt; — 67+ testes em todo o workspace: testes unitários em cada módulo,
-testes baseados em propriedades (proptest) para roundtrips hex e serialização de
-manifesto, testes de integração cobrindo o ciclo completo de
-criação-verificação-exportação incluindo detecção de arquivos adulterados e
-assinaturas inválidas. Zero avisos do clippy.&lt;&#x2F;p&gt;
-&lt;h2 id=&quot;decisoes-de-arquitetura&quot;&gt;Decisões de arquitetura&lt;&#x2F;h2&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Arquitetura hexagonal&lt;&#x2F;strong&gt;: operações criptográficas são injetadas via trait
-objects (&lt;code&gt;Box&amp;lt;dyn Hasher&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;Box&amp;lt;dyn ManifestSigner&amp;gt;&lt;&#x2F;code&gt;,
-&lt;code&gt;Box&amp;lt;dyn ManifestVerifier&amp;gt;&lt;&#x2F;code&gt;), mantendo o crate core livre de dependências
-criptográficas concretas.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Feature flags&lt;&#x2F;strong&gt;: a feature &lt;code&gt;service&lt;&#x2F;code&gt; no tesseras-core controla a camada de
-aplicação assíncrona. As features &lt;code&gt;classical&lt;&#x2F;code&gt; e &lt;code&gt;erasure&lt;&#x2F;code&gt; no tesseras-crypto
-controlam quais algoritmos são compilados.&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Manifesto em texto plano&lt;&#x2F;strong&gt;: interpretável sem qualquer biblioteca de formato
-binário, com prefixos de hash explícitos &lt;code&gt;blake3:&lt;&#x2F;code&gt; e layout legível por
-humanos.&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;h2 id=&quot;o-que-vem-a-seguir&quot;&gt;O que vem a seguir&lt;&#x2F;h2&gt;
-&lt;p&gt;A Fase 0 é a fundação local. O caminho adiante:&lt;&#x2F;p&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;strong&gt;Fase 1: Rede&lt;&#x2F;strong&gt; — Transporte QUIC (quinn), DHT Kademlia para descoberta de
-pares, travessia de NAT&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 2: Replicação&lt;&#x2F;strong&gt; — Codificação de apagamento Reed-Solomon pela rede,
-loops de reparo, reciprocidade bilateral (sem blockchain, sem tokens)&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 3: Clientes&lt;&#x2F;strong&gt; — App Flutter mobile&#x2F;desktop via flutter_rust_bridge, API
-GraphQL, nó WASM no navegador&lt;&#x2F;li&gt;
-&lt;li&gt;&lt;strong&gt;Fase 4: Endurecimento&lt;&#x2F;strong&gt; — Assinaturas pós-quânticas ML-DSA, empacotamento
-para Alpine&#x2F;Arch&#x2F;Debian&#x2F;FreeBSD&#x2F;OpenBSD, CI no SourceHut&lt;&#x2F;li&gt;
-&lt;&#x2F;ul&gt;
-&lt;p&gt;O formato tessera é estável. Tudo construído a partir daqui se conecta e estende
-o que existe hoje.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
- <entry xml:lang="pt-br">
- <title>Olá, Mundo</title>
- <published>2026-02-13T00:00:00+00:00</published>
- <updated>2026-02-13T00:00:00+00:00</updated>
-
- <author>
- <name>
-
- Unknown
-
- </name>
- </author>
-
- <link rel="alternate" type="text/html" href="https://tesseras.net/pt-br/news/hello-world/"/>
- <id>https://tesseras.net/pt-br/news/hello-world/</id>
-
- <content type="html" xml:base="https://tesseras.net/pt-br/news/hello-world/">&lt;p&gt;Hoje anunciamos o projeto Tesseras: uma rede peer-to-peer para preservar
-memórias humanas através dos milênios.&lt;&#x2F;p&gt;
-&lt;p&gt;Tesseras é construído sobre uma ideia simples — suas fotos, gravações e escritos
-merecem sobreviver a qualquer empresa, plataforma ou formato de arquivo. Cada
-pessoa cria uma tessera, uma cápsula do tempo autocontida que a rede mantém viva
-através de ajuda mútua e redundância.&lt;&#x2F;p&gt;
-&lt;p&gt;O projeto está em seu estágio mais inicial. Estamos construindo a fundação:
-ferramentas para criar, verificar e exportar tesseras offline. A camada de rede,
-replicação e aplicativos virão em seguida.&lt;&#x2F;p&gt;
-&lt;p&gt;Se essa missão ressoa com você,
-&lt;a href=&quot;&#x2F;pt-br&#x2F;subscriptions&#x2F;&quot;&gt;entre na lista de discussão&lt;&#x2F;a&gt; ou navegue pelo
-&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~ijanc&#x2F;tesseras&quot;&gt;código-fonte&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
-</content>
-
- </entry>
-</feed>
diff --git a/pt-br/news/atom.xml.gz b/pt-br/news/atom.xml.gz
deleted file mode 100644
index 2870951..0000000
--- a/pt-br/news/atom.xml.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/cli-daemon-rpc/index.html b/pt-br/news/cli-daemon-rpc/index.html
deleted file mode 100644
index 3b43961..0000000
--- a/pt-br/news/cli-daemon-rpc/index.html
+++ /dev/null
@@ -1,147 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>CLI Encontra a Rede: Comandos Publish, Fetch e Status — Tesseras</title>
- <meta name="description" content="O CLI do tesseras agora pode publicar tesseras na rede, buscá-las de peers e monitorar o estado de replicação — tudo através de uma nova ponte RPC via socket Unix para o daemon.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="CLI Encontra a Rede: Comandos Publish, Fetch e Status">
- <meta property="og:description" content="O CLI do tesseras agora pode publicar tesseras na rede, buscá-las de peers e monitorar o estado de replicação — tudo através de uma nova ponte RPC via socket Unix para o daemon.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="CLI Encontra a Rede: Comandos Publish, Fetch e Status">
- <meta name="twitter:description" content="O CLI do tesseras agora pode publicar tesseras na rede, buscá-las de peers e monitorar o estado de replicação — tudo através de uma nova ponte RPC via socket Unix para o daemon.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;cli-daemon-rpc&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>CLI Encontra a Rede: Comandos Publish, Fetch e Status</h2>
- <p class="news-date">2026-02-15</p>
- <p>Até agora o CLI operava isoladamente: criar uma tessera, verificar, exportar,
-listar o que você tem. Tudo ficava na sua máquina. Com esta atualização, o <code>tes</code>
-ganha três comandos que fazem a ponte entre o armazenamento local e a rede P2P —
-<code>publish</code>, <code>fetch</code> e <code>status</code> — comunicando-se com um <code>tesd</code> em execução através
-de um socket Unix.</p>
-<h2 id="o-que-foi-construido">O que foi construído</h2>
-<p><strong>Crate <code>tesseras-rpc</code></strong> — Um novo crate compartilhado entre CLI e daemon.
-Define o protocolo RPC usando serialização MessagePack com enquadramento
-prefixado por tamanho (cabeçalho big-endian de 4 bytes, máximo de 64 MiB). Três
-tipos de requisição (<code>Publish</code>, <code>Fetch</code>, <code>Status</code>) e suas respostas
-correspondentes. Um <code>DaemonClient</code> síncrono gerencia a conexão do socket Unix
-com timeouts configuráveis. O protocolo é deliberadamente simples — uma
-requisição, uma resposta, conexão fechada — para manter a implementação
-auditável.</p>
-<p><strong><code>tes publish &lt;hash&gt;</code></strong> — Publica uma tessera na rede. Aceita hashes completos
-ou prefixos curtos (ex.: <code>tes publish a1b2</code>), que são resolvidos no banco de
-dados local. O daemon lê todos os arquivos da tessera do armazenamento, empacota
-em um único buffer MessagePack e entrega ao motor de replicação. Tesseras
-pequenas (&lt; 4 MB) são replicadas como um único fragmento; maiores passam por
-codificação de apagamento Reed-Solomon. A saída mostra o hash curto e a contagem
-de fragmentos:</p>
-<pre><code>Published tessera 9f2c4a1b (24 fragments created)
-Distribution in progress — use `tes status 9f2c4a1b` to track.
-</code></pre>
-<p><strong><code>tes fetch &lt;hash&gt;</code></strong> — Busca uma tessera da rede usando o hash de conteúdo
-completo. O daemon coleta fragmentos disponíveis localmente, reconstrói os dados
-originais via decodificação de apagamento se necessário, desempacota os arquivos
-e armazena no CAS (content-addressable store). Retorna o número de memórias e o
-tamanho total buscado.</p>
-<p><strong><code>tes status &lt;hash&gt;</code></strong> — Exibe a saúde de replicação de uma tessera. A saída
-mapeia diretamente o modelo interno de saúde do motor de replicação:</p>
-<table><thead><tr><th>Estado</th><th>Significado</th></tr></thead><tbody>
-<tr><td>Local</td><td>Ainda não publicada — existe apenas na sua máquina</td></tr>
-<tr><td>Publishing</td><td>Fragmentos sendo distribuídos, redundância crítica</td></tr>
-<tr><td>Replicated</td><td>Distribuída, mas abaixo da redundância alvo</td></tr>
-<tr><td>Healthy</td><td>Redundância completa alcançada</td></tr>
-</tbody></table>
-<p><strong>Listener RPC no daemon</strong> — O daemon agora escuta em um socket Unix (padrão:
-<code>$XDG_RUNTIME_DIR/tesseras/daemon.sock</code>) com permissões de diretório adequadas
-(0700), limpeza de sockets obsoletos e shutdown gracioso. Cada conexão é tratada
-em uma task Tokio — o listener converte o stream assíncrono para I/O síncrono
-para a camada de enquadramento, despacha para o handler RPC e escreve a resposta
-de volta.</p>
-<p><strong>Pack/unpack no <code>tesseras-core</code></strong> — Um módulo pequeno que serializa uma lista
-de entradas de arquivo (caminho + dados) em um único buffer MessagePack e
-vice-versa. Esta é a ponte entre a estrutura de diretórios da tessera e os blobs
-opacos do motor de replicação.</p>
-<h2 id="decisoes-de-arquitetura">Decisões de arquitetura</h2>
-<ul>
-<li><strong>Socket Unix ao invés de TCP</strong>: a comunicação RPC entre CLI e daemon acontece
-na mesma máquina. Sockets Unix são mais rápidos, não precisam de alocação de
-porta, e as permissões do sistema de arquivos fornecem controle de acesso sem
-TLS.</li>
-<li><strong>MessagePack ao invés de JSON</strong>: o mesmo formato wire usado em todo o
-Tesseras. Compacto, sem schema, e já é uma dependência do workspace. Uma
-ida-e-volta típica de publish request/response ocupa menos de 200 bytes.</li>
-<li><strong>Cliente síncrono, daemon assíncrono</strong>: o <code>DaemonClient</code> usa I/O bloqueante
-porque o CLI não precisa de concorrência — envia uma requisição e espera. O
-listener do daemon é assíncrono (Tokio) para tratar múltiplas conexões. A
-camada de enquadramento funciona com qualquer impl <code>Read</code>/<code>Write</code>, conectando
-ambos os mundos.</li>
-<li><strong>Resolução de prefixo no lado do cliente</strong>: <code>publish</code> e <code>status</code> resolvem
-prefixos curtos localmente antes de enviar o hash completo ao daemon. Isso
-mantém o daemon stateless — ele não precisa acessar o banco de dados do CLI.</li>
-<li><strong>Alinhamento do diretório de dados padrão</strong>: o padrão do CLI mudou de
-<code>~/.tesseras</code> para <code>~/.local/share/tesseras</code> (via <code>dirs::data_dir()</code>) para
-coincidir com o daemon. Um aviso de migração é exibido quando dados no caminho
-antigo são detectados.</li>
-</ul>
-<h2 id="proximos-passos">Próximos passos</h2>
-<ul>
-<li><strong>Contagem de peers no DHT</strong>: o comando <code>status</code> atualmente reporta 0 peers —
-conectar a contagem real do DHT é o próximo passo</li>
-<li><strong><code>tes show</code></strong>: exibir o conteúdo de uma tessera (memórias, metadados) sem
-exportar</li>
-<li><strong>Fetch com streaming</strong>: para tesseras grandes, transmitir fragmentos conforme
-chegam ao invés de esperar por todos</li>
-</ul>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/cli-daemon-rpc/index.html.gz b/pt-br/news/cli-daemon-rpc/index.html.gz
deleted file mode 100644
index a3c51bf..0000000
--- a/pt-br/news/cli-daemon-rpc/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/hello-world/index.html b/pt-br/news/hello-world/index.html
deleted file mode 100644
index 5e8fcec..0000000
--- a/pt-br/news/hello-world/index.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Olá, Mundo — Tesseras</title>
- <meta name="description" content="Apresentando o projeto Tesseras — uma rede P2P para preservar memórias humanas.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Olá, Mundo">
- <meta property="og:description" content="Apresentando o projeto Tesseras — uma rede P2P para preservar memórias humanas.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Olá, Mundo">
- <meta name="twitter:description" content="Apresentando o projeto Tesseras — uma rede P2P para preservar memórias humanas.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;hello-world&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Olá, Mundo</h2>
- <p class="news-date">2026-02-13</p>
- <p>Hoje anunciamos o projeto Tesseras: uma rede peer-to-peer para preservar
-memórias humanas através dos milênios.</p>
-<p>Tesseras é construído sobre uma ideia simples — suas fotos, gravações e escritos
-merecem sobreviver a qualquer empresa, plataforma ou formato de arquivo. Cada
-pessoa cria uma tessera, uma cápsula do tempo autocontida que a rede mantém viva
-através de ajuda mútua e redundância.</p>
-<p>O projeto está em seu estágio mais inicial. Estamos construindo a fundação:
-ferramentas para criar, verificar e exportar tesseras offline. A camada de rede,
-replicação e aplicativos virão em seguida.</p>
-<p>Se essa missão ressoa com você,
-<a href="/pt-br/subscriptions/">entre na lista de discussão</a> ou navegue pelo
-<a rel="external" href="https://git.sr.ht/~ijanc/tesseras">código-fonte</a>.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/hello-world/index.html.gz b/pt-br/news/hello-world/index.html.gz
deleted file mode 100644
index e4322b4..0000000
--- a/pt-br/news/hello-world/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/index.html b/pt-br/news/index.html
deleted file mode 100644
index 155b8fa..0000000
--- a/pt-br/news/index.html
+++ /dev/null
@@ -1,198 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Notícias — Tesseras</title>
- <meta name="description" content="Notícias e anúncios do projeto Tesseras">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="Tesseras">
- <meta property="og:description" content="Rede P2P para preservar memórias humanas através dos milênios">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Tesseras">
- <meta name="twitter:description" content="Rede P2P para preservar memórias humanas através dos milênios">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<h2>Notícias</h2>
-
-<ul class="news-list">
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;packaging-debian&#x2F;">Empacotando o Tesseras para Debian</a>
- <span class="news-date">2026-02-16</span>
-
- <p>Como compilar e instalar o pacote .deb do Tesseras no Debian&#x2F;Ubuntu usando cargo-deb.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;packaging-archlinux&#x2F;">Empacotando o Tesseras para Arch Linux</a>
- <span class="news-date">2026-02-16</span>
-
- <p>Como compilar e instalar o pacote Tesseras no Arch Linux a partir do código-fonte usando makepkg.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;phase4-storage-deduplication&#x2F;">Fase 4: Deduplicacao de Armazenamento</a>
- <span class="news-date">2026-02-15</span>
-
- <p>Uma nova camada de armazenamento enderecavel por conteudo elimina dados duplicados entre tesseras, reduzindo uso de disco e habilitando coleta de lixo automatica.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;phase4-institutional-onboarding&#x2F;">Fase 4: Onboarding de Nos Institucionais</a>
- <span class="news-date">2026-02-15</span>
-
- <p>Bibliotecas, arquivos e museus agora podem ingressar na rede Tesseras como nos institucionais verificados com identidade baseada em DNS, indices de busca full-text e compromissos configuraveis de armazenamento.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;phase4-performance-tuning&#x2F;">Fase 4: Tuning de Performance</a>
- <span class="news-date">2026-02-15</span>
-
- <p>SQLite em modo WAL com configuracao centralizada de pragmas, cache LRU de fragmentos, gerenciamento de ciclo de vida do pool de conexoes QUIC e otimizacao do hot path de atestacao.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;phase4-wasm-browser-verification&#x2F;">Fase 4: Verificar Sem Instalar Nada</a>
- <span class="news-date">2026-02-15</span>
-
- <p>Tesseras agora compila para WebAssembly — qualquer pessoa pode verificar integridade e autenticidade de uma tessera diretamente no navegador, sem instalar nenhum software.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;phase4-nat-traversal&#x2F;">Fase 4: Furando NATs</a>
- <span class="news-date">2026-02-15</span>
-
- <p>Os nos Tesseras agora podem descobrir seu tipo de NAT via STUN, coordenar UDP hole punching atraves de introdutores e usar relay transparente quando a conectividade direta falha.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;cli-daemon-rpc&#x2F;">CLI Encontra a Rede: Comandos Publish, Fetch e Status</a>
- <span class="news-date">2026-02-15</span>
-
- <p>O CLI do tesseras agora pode publicar tesseras na rede, buscá-las de peers e monitorar o estado de replicação — tudo através de uma nova ponte RPC via socket Unix para o daemon.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;phase4-shamir-heir-recovery&#x2F;">Fase 4: Recuperação de Chaves por Herdeiros com Shamir&#x27;s Secret Sharing</a>
- <span class="news-date">2026-02-15</span>
-
- <p>Tesseras agora permite dividir sua identidade criptográfica em fragmentos distribuídos a herdeiros de confiança — qualquer limiar deles pode reconstruir suas chaves, mas menos que isso não revela nada.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;phase4-encryption-sealed&#x2F;">Fase 4: Criptografia e Tesseras Seladas</a>
- <span class="news-date">2026-02-14</span>
-
- <p>Tesseras agora suporta memórias privadas e seladas com criptografia híbrida pós-quântica — AES-256-GCM, X25519 + ML-KEM-768 e publicação de chaves com bloqueio temporal.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;phase3-api-and-apps&#x2F;">Fase 3: Memórias nas Suas Mãos</a>
- <span class="news-date">2026-02-14</span>
-
- <p>Tesseras agora tem um app Flutter e um nó Rust embarcado — qualquer pessoa pode criar e preservar memórias pelo celular.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;reed-solomon&#x2F;">Reed-Solomon: Como o Tesseras Sobrevive à Perda de Dados</a>
- <span class="news-date">2026-02-14</span>
-
- <p>Um mergulho profundo na codificação de apagamento Reed-Solomon — o que é, por que o Tesseras a utiliza e os desafios de manter memórias vivas ao longo dos séculos.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;phase2-replication&#x2F;">Fase 2: Memórias Sobrevivem</a>
- <span class="news-date">2026-02-14</span>
-
- <p>Tesseras agora fragmenta, distribui e repara dados automaticamente pela rede usando codificação de apagamento Reed-Solomon e um livro-razão de reciprocidade bilateral.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;phase1-basic-network&#x2F;">Fase 1: Nós Se Encontram</a>
- <span class="news-date">2026-02-14</span>
-
- <p>Os nós do Tesseras agora descobrem pares, formam uma DHT Kademlia sobre QUIC e publicam e encontram ponteiros de tesseras pela rede.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;phase0-foundation&#x2F;">Fase 0: Fundação Construída</a>
- <span class="news-date">2026-02-14</span>
-
- <p>Os crates fundamentais do Tesseras estão prontos — tipos de domínio, primitivas criptográficas, armazenamento SQLite e uma CLI funcional.</p>
-
- </li>
-
- <li>
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;pt-br&#x2F;news&#x2F;hello-world&#x2F;">Olá, Mundo</a>
- <span class="news-date">2026-02-13</span>
-
- <p>Apresentando o projeto Tesseras — uma rede P2P para preservar memórias humanas.</p>
-
- </li>
-
-</ul>
-
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/index.html.gz b/pt-br/news/index.html.gz
deleted file mode 100644
index 8aede06..0000000
--- a/pt-br/news/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/packaging-archlinux/index.html b/pt-br/news/packaging-archlinux/index.html
deleted file mode 100644
index fb3f918..0000000
--- a/pt-br/news/packaging-archlinux/index.html
+++ /dev/null
@@ -1,124 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Empacotando o Tesseras para Arch Linux — Tesseras</title>
- <meta name="description" content="Como compilar e instalar o pacote Tesseras no Arch Linux a partir do código-fonte usando makepkg.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Empacotando o Tesseras para Arch Linux">
- <meta property="og:description" content="Como compilar e instalar o pacote Tesseras no Arch Linux a partir do código-fonte usando makepkg.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Empacotando o Tesseras para Arch Linux">
- <meta name="twitter:description" content="Como compilar e instalar o pacote Tesseras no Arch Linux a partir do código-fonte usando makepkg.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;packaging-archlinux&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Empacotando o Tesseras para Arch Linux</h2>
- <p class="news-date">2026-02-16</p>
- <p>O Tesseras agora inclui um PKGBUILD para Arch Linux. Este post explica como
-compilar e instalar o pacote a partir do código-fonte.</p>
-<h2 id="pre-requisitos">Pré-requisitos</h2>
-<p>Você precisa de uma toolchain Rust funcional e do grupo base-devel:</p>
-<pre><code data-lang="sh">sudo pacman -S --needed base-devel sqlite
-rustup toolchain install stable
-</code></pre>
-<h2 id="compilando">Compilando</h2>
-<p>Clone o repositório e execute a recipe <code>just arch</code>:</p>
-<pre><code data-lang="sh">git clone https://git.sr.ht/~ijanc/tesseras
-cd tesseras
-just arch
-</code></pre>
-<p>Isso executa <code>makepkg -sf</code> dentro de <code>packaging/archlinux/</code>, que:</p>
-<ol>
-<li><strong>prepare</strong> — baixa as dependências Cargo com <code>cargo fetch --locked</code></li>
-<li><strong>build</strong> — compila <code>tesd</code> e <code>tes</code> (o CLI) em modo release</li>
-<li><strong>package</strong> — instala binários, serviço systemd, configs sysusers/tmpfiles,
-completions de shell (bash, zsh, fish) e um arquivo de configuração padrão</li>
-</ol>
-<p>O resultado é um arquivo <code>.pkg.tar.zst</code> em <code>packaging/archlinux/</code>.</p>
-<h2 id="instalando">Instalando</h2>
-<pre><code data-lang="sh">sudo pacman -U packaging/archlinux/tesseras-*.pkg.tar.zst
-</code></pre>
-<h2 id="configuracao-pos-instalacao">Configuração pós-instalação</h2>
-<p>O pacote cria automaticamente um usuário e grupo de sistema <code>tesseras</code> via
-systemd-sysusers. Para usar o CLI sem sudo, adicione seu usuário ao grupo:</p>
-<pre><code data-lang="sh">sudo usermod -aG tesseras $USER
-</code></pre>
-<p>Faça logout e login novamente, depois inicie o daemon:</p>
-<pre><code data-lang="sh">sudo systemctl enable --now tesd
-</code></pre>
-<h2 id="o-que-o-pacote-inclui">O que o pacote inclui</h2>
-<table><thead><tr><th>Caminho</th><th>Descrição</th></tr></thead><tbody>
-<tr><td><code>/usr/bin/tesd</code></td><td>Daemon do nó completo</td></tr>
-<tr><td><code>/usr/bin/tes</code></td><td>Cliente CLI</td></tr>
-<tr><td><code>/etc/tesseras/config.toml</code></td><td>Configuração padrão (marcado como backup)</td></tr>
-<tr><td><code>/usr/lib/systemd/system/tesd.service</code></td><td>Unit systemd com hardening de segurança</td></tr>
-<tr><td><code>/usr/lib/sysusers.d/tesseras.conf</code></td><td>Definição do usuário de sistema</td></tr>
-<tr><td><code>/usr/lib/tmpfiles.d/tesseras.conf</code></td><td>Diretório de dados <code>/var/lib/tesseras</code></td></tr>
-<tr><td>Completions de shell</td><td>bash, zsh e fish</td></tr>
-</tbody></table>
-<h2 id="detalhes-do-pkgbuild">Detalhes do PKGBUILD</h2>
-<p>O PKGBUILD compila diretamente a partir do checkout git local em vez de baixar
-um tarball. A variável de ambiente <code>TESSERAS_ROOT</code> aponta o makepkg para a raiz
-do workspace. O diretório target do Cargo é configurado para <code>$srcdir/target</code>
-para manter os artefatos de build dentro do sandbox do makepkg.</p>
-<p>O pacote depende apenas de <code>sqlite</code> em tempo de execução e <code>cargo</code> em tempo de
-build.</p>
-<h2 id="atualizando">Atualizando</h2>
-<p>Depois de baixar novas mudanças, basta rodar <code>just arch</code> novamente e reinstalar:</p>
-<pre><code data-lang="sh">git pull
-just arch
-sudo pacman -U packaging/archlinux/tesseras-*.pkg.tar.zst
-</code></pre>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/packaging-archlinux/index.html.gz b/pt-br/news/packaging-archlinux/index.html.gz
deleted file mode 100644
index 3161854..0000000
--- a/pt-br/news/packaging-archlinux/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/packaging-debian/index.html b/pt-br/news/packaging-debian/index.html
deleted file mode 100644
index 815152a..0000000
--- a/pt-br/news/packaging-debian/index.html
+++ /dev/null
@@ -1,159 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Empacotando o Tesseras para Debian — Tesseras</title>
- <meta name="description" content="Como compilar e instalar o pacote .deb do Tesseras no Debian&#x2F;Ubuntu usando cargo-deb.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Empacotando o Tesseras para Debian">
- <meta property="og:description" content="Como compilar e instalar o pacote .deb do Tesseras no Debian&#x2F;Ubuntu usando cargo-deb.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Empacotando o Tesseras para Debian">
- <meta name="twitter:description" content="Como compilar e instalar o pacote .deb do Tesseras no Debian&#x2F;Ubuntu usando cargo-deb.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;packaging-debian&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Empacotando o Tesseras para Debian</h2>
- <p class="news-date">2026-02-16</p>
- <p>O Tesseras agora inclui um pacote <code>.deb</code> para Debian e Ubuntu. Este post explica
-como compilar e instalar o pacote a partir do código-fonte usando <code>cargo-deb</code>.</p>
-<h2 id="pre-requisitos">Pré-requisitos</h2>
-<p>Você precisa de uma toolchain Rust funcional e das bibliotecas de sistema
-necessárias:</p>
-<pre><code data-lang="sh">sudo apt install build-essential pkg-config libsqlite3-dev
-rustup toolchain install stable
-cargo install cargo-deb
-</code></pre>
-<h2 id="compilando">Compilando</h2>
-<p>Clone o repositório e execute a recipe <code>just deb</code>:</p>
-<pre><code data-lang="sh">git clone https://git.sr.ht/~ijanc/tesseras
-cd tesseras
-just deb
-</code></pre>
-<p>Essa recipe faz três coisas:</p>
-<ol>
-<li><strong>Compila</strong> <code>tesd</code> (o daemon) e <code>tes</code> (o CLI) em modo release com
-<code>cargo build --release</code></li>
-<li><strong>Gera completions de shell</strong> para bash, zsh e fish a partir do binário <code>tes</code></li>
-<li><strong>Empacota</strong> tudo em um arquivo <code>.deb</code> com
-<code>cargo deb -p tesseras-daemon --no-build</code></li>
-</ol>
-<p>O resultado é um arquivo <code>.deb</code> em <code>target/debian/</code>.</p>
-<h2 id="instalando">Instalando</h2>
-<pre><code data-lang="sh">sudo dpkg -i target/debian/tesseras-daemon_*.deb
-</code></pre>
-<p>Se houver dependências faltando, corrija com:</p>
-<pre><code data-lang="sh">sudo apt install -f
-</code></pre>
-<h2 id="configuracao-pos-instalacao">Configuração pós-instalação</h2>
-<p>O script <code>postinst</code> cria automaticamente um usuário de sistema <code>tesseras</code> e o
-diretório de dados <code>/var/lib/tesseras</code>. Para usar o CLI sem sudo, adicione seu
-usuário ao grupo:</p>
-<pre><code data-lang="sh">sudo usermod -aG tesseras $USER
-</code></pre>
-<p>Faça logout e login novamente, depois inicie o daemon:</p>
-<pre><code data-lang="sh">sudo systemctl enable --now tesd
-</code></pre>
-<h2 id="o-que-o-pacote-inclui">O que o pacote inclui</h2>
-<table><thead><tr><th>Caminho</th><th>Descrição</th></tr></thead><tbody>
-<tr><td><code>/usr/bin/tesd</code></td><td>Daemon do nó completo</td></tr>
-<tr><td><code>/usr/bin/tes</code></td><td>Cliente CLI</td></tr>
-<tr><td><code>/etc/tesseras/config.toml</code></td><td>Configuração padrão (marcado como conffile)</td></tr>
-<tr><td><code>/lib/systemd/system/tesd.service</code></td><td>Unit systemd com hardening de segurança</td></tr>
-<tr><td>Completions de shell</td><td>bash, zsh e fish</td></tr>
-</tbody></table>
-<h2 id="como-o-cargo-deb-funciona">Como o cargo-deb funciona</h2>
-<p>Os metadados de empacotamento ficam em <code>crates/tesseras-daemon/Cargo.toml</code> na
-seção <code>[package.metadata.deb]</code>. Essa seção define:</p>
-<ul>
-<li><strong>depends</strong> — dependências em tempo de execução: <code>libc6</code> e <code>libsqlite3-0</code></li>
-<li><strong>assets</strong> — arquivos incluídos no pacote (binários, config, unit systemd,
-completions de shell)</li>
-<li><strong>conf-files</strong> — arquivos tratados como configuração (preservados na
-atualização)</li>
-<li><strong>maintainer-scripts</strong> — scripts <code>postinst</code> e <code>postrm</code> em
-<code>packaging/debian/scripts/</code></li>
-<li><strong>systemd-units</strong> — integração automática com systemd</li>
-</ul>
-<p>O script <code>postinst</code> cria o usuário de sistema <code>tesseras</code> e o diretório de dados
-na instalação. O script <code>postrm</code> remove o usuário, grupo e diretório de dados
-apenas no <code>purge</code> (não na remoção simples).</p>
-<h2 id="hardening-do-systemd">Hardening do systemd</h2>
-<p>A unit <code>tesd.service</code> inclui diretivas de hardening de segurança:</p>
-<pre><code data-lang="ini">NoNewPrivileges=true
-ProtectSystem=strict
-ProtectHome=true
-ReadWritePaths=/var/lib/tesseras
-PrivateTmp=true
-PrivateDevices=true
-ProtectKernelTunables=true
-ProtectControlGroups=true
-RestrictSUIDSGID=true
-MemoryDenyWriteExecute=true
-</code></pre>
-<p>O daemon roda como o usuário não-privilegiado <code>tesseras</code> e só pode escrever em
-<code>/var/lib/tesseras</code>.</p>
-<h2 id="deploy-para-um-servidor-remoto">Deploy para um servidor remoto</h2>
-<p>O justfile inclui uma recipe <code>deploy</code> para enviar o <code>.deb</code> a um host remoto:</p>
-<pre><code data-lang="sh">just deploy bootstrap1.tesseras.net
-</code></pre>
-<p>Isso compila o <code>.deb</code>, copia via <code>scp</code>, instala com <code>dpkg -i</code> e reinicia o
-serviço <code>tesd</code>.</p>
-<h2 id="atualizando">Atualizando</h2>
-<p>Depois de baixar novas mudanças, basta rodar <code>just deb</code> novamente e reinstalar:</p>
-<pre><code data-lang="sh">git pull
-just deb
-sudo dpkg -i target/debian/tesseras-daemon_*.deb
-</code></pre>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/packaging-debian/index.html.gz b/pt-br/news/packaging-debian/index.html.gz
deleted file mode 100644
index 1e8d0a0..0000000
--- a/pt-br/news/packaging-debian/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/phase0-foundation/index.html b/pt-br/news/phase0-foundation/index.html
deleted file mode 100644
index ab4b679..0000000
--- a/pt-br/news/phase0-foundation/index.html
+++ /dev/null
@@ -1,130 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Fase 0: Fundação Construída — Tesseras</title>
- <meta name="description" content="Os crates fundamentais do Tesseras estão prontos — tipos de domínio, primitivas criptográficas, armazenamento SQLite e uma CLI funcional.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Fase 0: Fundação Construída">
- <meta property="og:description" content="Os crates fundamentais do Tesseras estão prontos — tipos de domínio, primitivas criptográficas, armazenamento SQLite e uma CLI funcional.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Fase 0: Fundação Construída">
- <meta name="twitter:description" content="Os crates fundamentais do Tesseras estão prontos — tipos de domínio, primitivas criptográficas, armazenamento SQLite e uma CLI funcional.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase0-foundation&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Fase 0: Fundação Construída</h2>
- <p class="news-date">2026-02-14</p>
- <p>O primeiro marco do projeto Tesseras está completo. A Fase 0 estabelece a
-fundação sobre a qual cada componente futuro será construído: tipos de domínio,
-criptografia, armazenamento e uma interface de linha de comando funcional.</p>
-<h2 id="o-que-foi-construido">O que foi construído</h2>
-<p><strong>tesseras-core</strong> — A camada de domínio define o formato tessera: <code>ContentHash</code>
-(BLAKE3, 32 bytes), <code>NodeId</code> (Kademlia, 20 bytes), tipos de memória (Moment,
-Reflection, Daily, Relation, Object), modos de visibilidade (Private, Circle,
-Public, PublicAfterDeath, Sealed) e um formato de manifesto em texto plano que
-pode ser interpretado por qualquer linguagem de programação pelos próximos mil
-anos. A camada de serviço (<code>TesseraService</code>) gerencia operações de criação,
-verificação, exportação e listagem através de port traits, seguindo arquitetura
-hexagonal.</p>
-<p><strong>tesseras-crypto</strong> — Geração de chaves Ed25519, assinatura e verificação. Um
-framework de assinatura dual (Ed25519 + placeholder ML-DSA) pronto para migração
-pós-quântica. Hashing de conteúdo com BLAKE3. Codificação de apagamento
-Reed-Solomon atrás de uma feature flag para futura replicação.</p>
-<p><strong>tesseras-storage</strong> — Índice SQLite via rusqlite com migrações em SQL puro.
-Blob store no sistema de arquivos com layout endereçável por conteúdo
-(<code>blobs/&lt;tessera_hash&gt;/&lt;memory_hash&gt;/&lt;filename&gt;</code>). Persistência de chaves de
-identidade em disco.</p>
-<p><strong>tesseras-cli</strong> — Um binário <code>tesseras</code> funcional com cinco comandos:</p>
-<ul>
-<li><code>init</code> — gera identidade Ed25519, cria banco de dados SQLite</li>
-<li><code>create &lt;dir&gt;</code> — varre um diretório por arquivos de mídia, cria uma tessera
-assinada</li>
-<li><code>verify &lt;hash&gt;</code> — verifica assinatura e integridade dos arquivos</li>
-<li><code>export &lt;hash&gt; &lt;dest&gt;</code> — escreve um diretório tessera autocontido</li>
-<li><code>list</code> — mostra uma tabela das tesseras armazenadas</li>
-</ul>
-<p><strong>Testes</strong> — 67+ testes em todo o workspace: testes unitários em cada módulo,
-testes baseados em propriedades (proptest) para roundtrips hex e serialização de
-manifesto, testes de integração cobrindo o ciclo completo de
-criação-verificação-exportação incluindo detecção de arquivos adulterados e
-assinaturas inválidas. Zero avisos do clippy.</p>
-<h2 id="decisoes-de-arquitetura">Decisões de arquitetura</h2>
-<ul>
-<li><strong>Arquitetura hexagonal</strong>: operações criptográficas são injetadas via trait
-objects (<code>Box&lt;dyn Hasher&gt;</code>, <code>Box&lt;dyn ManifestSigner&gt;</code>,
-<code>Box&lt;dyn ManifestVerifier&gt;</code>), mantendo o crate core livre de dependências
-criptográficas concretas.</li>
-<li><strong>Feature flags</strong>: a feature <code>service</code> no tesseras-core controla a camada de
-aplicação assíncrona. As features <code>classical</code> e <code>erasure</code> no tesseras-crypto
-controlam quais algoritmos são compilados.</li>
-<li><strong>Manifesto em texto plano</strong>: interpretável sem qualquer biblioteca de formato
-binário, com prefixos de hash explícitos <code>blake3:</code> e layout legível por
-humanos.</li>
-</ul>
-<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
-<p>A Fase 0 é a fundação local. O caminho adiante:</p>
-<ul>
-<li><strong>Fase 1: Rede</strong> — Transporte QUIC (quinn), DHT Kademlia para descoberta de
-pares, travessia de NAT</li>
-<li><strong>Fase 2: Replicação</strong> — Codificação de apagamento Reed-Solomon pela rede,
-loops de reparo, reciprocidade bilateral (sem blockchain, sem tokens)</li>
-<li><strong>Fase 3: Clientes</strong> — App Flutter mobile/desktop via flutter_rust_bridge, API
-GraphQL, nó WASM no navegador</li>
-<li><strong>Fase 4: Endurecimento</strong> — Assinaturas pós-quânticas ML-DSA, empacotamento
-para Alpine/Arch/Debian/FreeBSD/OpenBSD, CI no SourceHut</li>
-</ul>
-<p>O formato tessera é estável. Tudo construído a partir daqui se conecta e estende
-o que existe hoje.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/phase0-foundation/index.html.gz b/pt-br/news/phase0-foundation/index.html.gz
deleted file mode 100644
index fc10aa5..0000000
--- a/pt-br/news/phase0-foundation/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/phase1-basic-network/index.html b/pt-br/news/phase1-basic-network/index.html
deleted file mode 100644
index 1dbbf62..0000000
--- a/pt-br/news/phase1-basic-network/index.html
+++ /dev/null
@@ -1,177 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Fase 1: Nós Se Encontram — Tesseras</title>
- <meta name="description" content="Os nós do Tesseras agora descobrem pares, formam uma DHT Kademlia sobre QUIC e publicam e encontram ponteiros de tesseras pela rede.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Fase 1: Nós Se Encontram">
- <meta property="og:description" content="Os nós do Tesseras agora descobrem pares, formam uma DHT Kademlia sobre QUIC e publicam e encontram ponteiros de tesseras pela rede.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Fase 1: Nós Se Encontram">
- <meta name="twitter:description" content="Os nós do Tesseras agora descobrem pares, formam uma DHT Kademlia sobre QUIC e publicam e encontram ponteiros de tesseras pela rede.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase1-basic-network&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Fase 1: Nós Se Encontram</h2>
- <p class="news-date">2026-02-14</p>
- <p>Tesseras não é mais uma ferramenta apenas local. A Fase 1 entrega a camada de
-rede: nós se descobrem através de uma DHT Kademlia, comunicam-se sobre QUIC e
-publicam ponteiros de tesseras que qualquer par na rede pode encontrar. Uma
-tessera criada no nó A agora pode ser encontrada a partir do nó C.</p>
-<h2 id="o-que-foi-construido">O que foi construído</h2>
-<p><strong>tesseras-core</strong> (atualizado) — Novos tipos de domínio de rede:
-<code>TesseraPointer</code> (referência leve aos detentores de uma tessera e localização
-dos fragmentos), <code>NodeIdentity</code> (ID do nó + chave pública + nonce de prova de
-trabalho), <code>NodeInfo</code> (identidade + endereço + capacidades) e <code>Capabilities</code>
-(bitflags do que um nó suporta: DHT, armazenamento, relay, replicação).</p>
-<p><strong>tesseras-net</strong> — A camada de transporte, construída sobre QUIC via quinn. A
-trait <code>Transport</code> define a porta: <code>send</code>, <code>recv</code>, <code>disconnect</code>, <code>local_addr</code>.
-Dois adaptadores a implementam:</p>
-<ul>
-<li><code>QuinnTransport</code> — QUIC real com TLS auto-assinado, negociação ALPN
-(<code>tesseras/1</code>), pool de conexões via DashMap e um loop de aceitação em
-background que trata streams recebidas.</li>
-<li><code>MemTransport</code> + <code>SimNetwork</code> — canais em memória para testes determinísticos
-sem I/O de rede. Cada teste de integração no crate DHT roda contra este
-adaptador.</li>
-</ul>
-<p>O protocolo de fio usa MessagePack com prefixo de comprimento: um cabeçalho de 4
-bytes big-endian seguido de um payload rmp-serde. <code>WireMessage</code> carrega um byte
-de versão, ID de requisição e um corpo que pode ser requisição, resposta ou erro
-de protocolo. Tamanho máximo de mensagem é 64 KiB.</p>
-<p><strong>tesseras-dht</strong> — Uma implementação completa de Kademlia:</p>
-<ul>
-<li><em>Tabela de roteamento</em>: 160 k-buckets com k=20. Evicção do menos recentemente
-visto, mover-para-trás ao atualizar, verificação por ping antes de substituir
-a entrada mais antiga de um bucket cheio.</li>
-<li><em>Distância XOR</em>: métrica XOR de 160 bits com indexação de bucket pelo bit mais
-significativo diferente.</li>
-<li><em>Prova de trabalho</em>: nós iteram um nonce até que
-<code>BLAKE3(pubkey || nonce)[..20]</code> tenha 8 bits zero iniciais (~256 tentativas de
-hash em média). Barato o suficiente para qualquer dispositivo, caro o
-suficiente para tornar ataques Sybil impraticáveis em escala.</li>
-<li><em>Mensagens de protocolo</em>: Ping/Pong, FindNode/FindNodeResponse,
-FindValue/FindValueResult, Store — todos serializados com MessagePack via
-serde.</li>
-<li><em>Armazenamento de ponteiros</em>: armazenamento em memória limitado com TTL
-configurável (24 horas padrão) e máximo de entradas (10.000 padrão). Quando
-cheio, remove ponteiros mais distantes do ID do nó local, seguindo o modelo de
-responsabilidade baseado em distância do Kademlia.</li>
-<li><em>DhtEngine</em>: o orquestrador principal. Trata RPCs recebidos, executa buscas
-iterativas (paralelismo alpha=3), bootstrap, publicação e busca. O método
-<code>run()</code> dirige um loop <code>tokio::select!</code> com timers de manutenção: refresh da
-tabela de roteamento a cada 60 segundos, expiração de ponteiros a cada 5
-minutos.</li>
-</ul>
-<p><strong>tesd</strong> — Um binário de nó completo. Analisa argumentos de CLI (endereço de
-bind, pares de bootstrap, diretório de dados), gera uma identidade de nó válida
-por PoW, abre um endpoint QUIC, faz bootstrap na rede e roda o motor DHT.
-Desligamento gracioso com Ctrl+C via tratamento de sinais do tokio.</p>
-<p><strong>Infraestrutura</strong> — Configuração OpenTofu para dois nós bootstrap no Hetzner
-Cloud (instâncias cx22 em Falkenstein, Alemanha e Helsinki, Finlândia). Script
-de provisionamento cloud-init cria um usuário dedicado <code>tesseras</code>, escreve um
-arquivo de configuração e configura um serviço systemd. Regras de firewall abrem
-UDP 4433 (QUIC) e restringem métricas a acesso interno.</p>
-<p><strong>Testes</strong> — 139 testes em todo o workspace:</p>
-<ul>
-<li>47 testes unitários em tesseras-dht (tabela de roteamento, distância, PoW,
-armazenamento de ponteiros, serialização de mensagens, RPCs do engine)</li>
-<li>5 testes de integração multi-nó (bootstrap de 3 nós, convergência de lookup
-com 10 nós, publicar-e-encontrar, detecção de partida de nó, rejeição de PoW)</li>
-<li>14 testes em tesseras-net (roundtrips de codec, send/recv de transporte,
-backpressure, disconnect)</li>
-<li>Testes de fumaça com Docker Compose usando 3 nós containerizados comunicando
-sobre QUIC real</li>
-<li>Zero avisos do clippy, formatação limpa</li>
-</ul>
-<h2 id="decisoes-de-arquitetura">Decisões de arquitetura</h2>
-<ul>
-<li><strong>Transport como porta</strong>: a trait <code>Transport</code> é a única interface entre o
-motor DHT e a rede. Trocar QUIC por qualquer outro protocolo significa
-implementar quatro métodos. Todos os testes de DHT usam o adaptador em
-memória, tornando-os rápidos e determinísticos.</li>
-<li><strong>Um stream por RPC</strong>: cada par requisição-resposta DHT usa um stream
-bidirecional QUIC novo. Sem complexidade de multiplexação, sem bloqueio
-head-of-line entre operações independentes. O QUIC trata a multiplexação no
-nível da conexão.</li>
-<li><strong>MessagePack em vez de Protobuf</strong>: codificação binária compacta sem geração
-de código ou arquivos de esquema. Integração com serde significa que adicionar
-um campo a uma mensagem é uma mudança de uma linha. Trade-off: sem garantias
-de evolução de esquema embutidas, mas neste estágio velocidade importa mais.</li>
-<li><strong>PoW em vez de stake ou reputação</strong>: uma identidade de nó custa ~256 hashes
-BLAKE3. Isso roda em menos de um segundo em qualquer hardware, incluindo um
-Raspberry Pi, mas gerar milhares de identidades para um ataque Sybil se torna
-caro. Sem tokens, sem blockchain, sem dependências externas.</li>
-<li><strong>Busca iterativa com atualização da tabela de roteamento</strong>: nós descobertos
-são adicionados à tabela de roteamento conforme encontrados durante buscas
-iterativas, seguindo o comportamento padrão do Kademlia. Isso garante que a
-tabela de roteamento melhore organicamente conforme os nós interagem.</li>
-</ul>
-<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
-<ul>
-<li><strong>Fase 2: Replicação</strong> — Codificação de apagamento Reed-Solomon pela rede,
-distribuição de fragmentos, loops de reparo automáticos, livro-razão de
-reciprocidade bilateral (sem blockchain, sem tokens)</li>
-<li><strong>Fase 3: API e Apps</strong> — App Flutter mobile/desktop via flutter_rust_bridge,
-API GraphQL (async-graphql), nó WASM no navegador</li>
-<li><strong>Fase 4: Resiliência e Escala</strong> — Assinaturas pós-quânticas ML-DSA, travessia
-avançada de NAT, Compartilhamento de Segredo de Shamir para herdeiros,
-empacotamento para Alpine/Arch/Debian/FreeBSD/OpenBSD, CI no SourceHut</li>
-<li><strong>Fase 5: Exploração e Cultura</strong> — navegador público de tesseras, curadoria
-institucional, integração genealógica, exportação para mídia física</li>
-</ul>
-<p>Os nós conseguem se encontrar. Em seguida, aprendem a manter vivas as memórias
-uns dos outros.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/phase1-basic-network/index.html.gz b/pt-br/news/phase1-basic-network/index.html.gz
deleted file mode 100644
index 39240bd..0000000
--- a/pt-br/news/phase1-basic-network/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/phase2-replication/index.html b/pt-br/news/phase2-replication/index.html
deleted file mode 100644
index 40320b8..0000000
--- a/pt-br/news/phase2-replication/index.html
+++ /dev/null
@@ -1,213 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Fase 2: Memórias Sobrevivem — Tesseras</title>
- <meta name="description" content="Tesseras agora fragmenta, distribui e repara dados automaticamente pela rede usando codificação de apagamento Reed-Solomon e um livro-razão de reciprocidade bilateral.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Fase 2: Memórias Sobrevivem">
- <meta property="og:description" content="Tesseras agora fragmenta, distribui e repara dados automaticamente pela rede usando codificação de apagamento Reed-Solomon e um livro-razão de reciprocidade bilateral.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Fase 2: Memórias Sobrevivem">
- <meta name="twitter:description" content="Tesseras agora fragmenta, distribui e repara dados automaticamente pela rede usando codificação de apagamento Reed-Solomon e um livro-razão de reciprocidade bilateral.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase2-replication&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Fase 2: Memórias Sobrevivem</h2>
- <p class="news-date">2026-02-14</p>
- <p>Uma tessera não está mais presa a uma única máquina. A Fase 2 entrega a camada
-de replicação: os dados são divididos em fragmentos com codificação de
-apagamento, distribuídos entre múltiplos pares e reparados automaticamente
-quando nós ficam offline. Um livro-razão de reciprocidade bilateral garante
-troca justa de armazenamento — sem blockchain, sem tokens.</p>
-<h2 id="o-que-foi-construido">O que foi construído</h2>
-<p><strong>tesseras-core</strong> (atualizado) — Novos tipos de domínio de replicação:
-<code>FragmentPlan</code> (seleciona a camada de fragmentação baseada no tamanho da
-tessera), <code>FragmentId</code> (hash da tessera + índice + contagem de shards +
-checksum), <code>FragmentEnvelope</code> (fragmento com seus metadados para transporte na
-rede), <code>FragmentationTier</code> (Small/Medium/Large), <code>Attestation</code> (prova de que um
-nó possui um fragmento em um dado momento) e <code>ReplicateAck</code> (confirmação de
-recebimento de fragmento). Três novas traits de porta definem os limites
-hexagonais: <code>DhtPort</code> (encontrar pares, replicar fragmentos, solicitar
-atestações, ping), <code>FragmentStore</code> (armazenar/ler/deletar/listar/verificar
-fragmentos) e <code>ReciprocityLedger</code> (registrar trocas de armazenamento, consultar
-saldos, encontrar melhores pares). O tamanho máximo de uma tessera é 1 GB.</p>
-<p><strong>tesseras-crypto</strong> (atualizado) — O <code>ReedSolomonCoder</code> existente agora alimenta
-a codificação de fragmentos. Os dados são divididos em shards, shards de
-paridade são computados, e qualquer combinação de shards de dados pode
-reconstruir o original — desde que o número de shards ausentes não exceda a
-contagem de paridade.</p>
-<p><strong>tesseras-storage</strong> (atualizado) — Dois novos adaptadores:</p>
-<ul>
-<li><code>FsFragmentStore</code> — armazena dados de fragmentos como arquivos em disco
-(<code>{raiz}/{hash_tessera}/{indice:03}.shard</code>) com um índice de metadados SQLite
-rastreando hash da tessera, índice do shard, contagem de shards, checksum e
-tamanho em bytes. A verificação recalcula o hash BLAKE3 e compara com o
-checksum armazenado.</li>
-<li><code>SqliteReciprocityLedger</code> — contabilidade bilateral de armazenamento em
-SQLite. Cada par tem uma linha rastreando bytes armazenados para eles e bytes
-que eles armazenam para nós. A coluna <code>balance</code> é uma coluna gerada
-(<code>bytes_they_store_for_us - bytes_stored_for_them</code>). UPSERT garante incremento
-atômico dos contadores.</li>
-</ul>
-<p>Nova migração (<code>002_replication.sql</code>) adiciona tabelas para fragmentos, planos
-de fragmentação, detentores, mapeamentos detentor-fragmento e saldos de
-reciprocidade.</p>
-<p><strong>tesseras-dht</strong> (atualizado) — Quatro novas variantes de mensagem: <code>Replicate</code>
-(enviar um envelope de fragmento), <code>ReplicateAck</code> (confirmar recebimento),
-<code>AttestRequest</code> (pedir a um nó que prove que possui os fragmentos de uma
-tessera) e <code>AttestResponse</code> (retornar atestação com checksums e timestamp). O
-engine trata essas mensagens em seu loop de despacho.</p>
-<p><strong>tesseras-replication</strong> — O novo crate, com cinco módulos:</p>
-<ul>
-<li>
-<p><em>Codificação de fragmentos</em> (<code>fragment.rs</code>): <code>encode_tessera()</code> seleciona a
-camada de fragmentação baseada no tamanho e então chama a codificação
-Reed-Solomon para as camadas Medium e Large. Três camadas:</p>
-<ul>
-<li><strong>Small</strong> (&lt; 4 MB): replicação do arquivo inteiro para r=7 pares, sem
-codificação de apagamento</li>
-<li><strong>Medium</strong> (4–256 MB): 16 shards de dados + 8 de paridade, distribuídos
-entre r=7 pares</li>
-<li><strong>Large</strong> (≥ 256 MB): 48 shards de dados + 24 de paridade, distribuídos
-entre r=7 pares</li>
-</ul>
-</li>
-<li>
-<p><em>Distribuição</em> (<code>distributor.rs</code>): filtragem de diversidade de sub-rede limita
-pares por sub-rede /24 IPv4 (ou prefixo /48 IPv6) para evitar falhas
-correlacionadas. Se todos os seus fragmentos caírem no mesmo rack, uma única
-queda de energia os elimina.</p>
-</li>
-<li>
-<p><em>Serviço</em> (<code>service.rs</code>): <code>ReplicationService</code> é o orquestrador.
-<code>replicate_tessera()</code> codifica os dados, encontra os pares mais próximos via
-DHT, aplica diversidade de sub-rede e distribui fragmentos em round-robin.
-<code>receive_fragment()</code> valida o checksum BLAKE3, verifica o saldo de
-reciprocidade (rejeita se o déficit do remetente exceder o limite
-configurado), armazena o fragmento e atualiza o livro-razão.
-<code>handle_attestation_request()</code> lista os fragmentos locais e calcula seus
-checksums como prova de posse.</p>
-</li>
-<li>
-<p><em>Reparo</em> (<code>repair.rs</code>): <code>check_tessera_health()</code> solicita atestações dos
-detentores conhecidos, recorre ao ping para nós não responsivos, verifica a
-integridade local dos fragmentos e retorna uma de três ações: <code>Healthy</code>,
-<code>NeedsReplication { deficit }</code> ou <code>CorruptLocal { fragment_index }</code>. O loop de
-reparo roda a cada 24 horas (com 2 horas de jitter) via <code>tokio::select!</code> com
-integração de desligamento.</p>
-</li>
-<li>
-<p><em>Configuração</em> (<code>config.rs</code>): <code>ReplicationConfig</code> com padrões para intervalo
-de reparo (24h), jitter (2h), transferências simultâneas (4), espaço livre
-mínimo (1 GB), tolerância de déficit (256 MB) e limite de armazenamento por
-par (1 GB).</p>
-</li>
-</ul>
-<p><strong>tesd</strong> (atualizado) — O daemon agora abre um banco de dados SQLite
-(<code>db/tesseras.db</code>), executa migrações, cria instâncias de <code>FsFragmentStore</code>,
-<code>SqliteReciprocityLedger</code> e <code>FsBlobStore</code>, envolve o engine DHT em um
-<code>DhtPortAdapter</code>, constrói um <code>ReplicationService</code> e lança o loop de reparo como
-tarefa em segundo plano com desligamento gracioso.</p>
-<p><strong>Testes</strong> — 193 testes em todo o workspace:</p>
-<ul>
-<li>15 testes unitários em tesseras-replication (camadas de codificação de
-fragmentos, validação de checksum, diversidade de sub-rede, verificações de
-saúde do reparo, fluxos de recebimento/replicação do serviço)</li>
-<li>3 testes de integração com armazenamento real (ciclo completo
-codificar→distribuir→receber para tessera média, replicação de arquivo inteiro
-para tessera pequena, rejeição de fragmento adulterado)</li>
-<li>Testes usam SQLite em memória + diretório temporário para fragmentos com mocks
-mockall para DHT e BlobStore</li>
-<li>Zero avisos do clippy, formatação limpa</li>
-</ul>
-<h2 id="decisoes-de-arquitetura">Decisões de arquitetura</h2>
-<ul>
-<li><strong>Fragmentação em três camadas</strong>: arquivos pequenos não precisam de
-codificação de apagamento — o overhead não compensa. Arquivos médios e grandes
-recebem progressivamente mais shards de paridade. Isso evita desperdiçar
-armazenamento em tesseras pequenas enquanto oferece redundância forte para as
-grandes.</li>
-<li><strong>Distribuição por push do dono</strong>: o dono da tessera codifica os fragmentos e
-os envia aos pares, em vez dos pares puxarem. Isso simplifica o protocolo (sem
-fase de negociação) e garante que os fragmentos são distribuídos
-imediatamente.</li>
-<li><strong>Reciprocidade bilateral sem consenso</strong>: cada nó rastreia seu próprio saldo
-com cada par localmente. Sem livro-razão global, sem token, sem blockchain. Se
-o par A armazena 500 MB para o par B, o par B deveria armazenar
-aproximadamente 500 MB para o par A. Free riders perdem redundância
-gradualmente — seus fragmentos são despriorizados para reparo, mas nunca
-deletados.</li>
-<li><strong>Diversidade de sub-rede</strong>: os fragmentos são espalhados por diferentes
-sub-redes para sobreviver a falhas correlacionadas. Uma queda de datacenter
-não deveria eliminar todas as cópias de uma tessera.</li>
-<li><strong>Verificações de saúde por atestação primeiro</strong>: o loop de reparo pede aos
-detentores que provem posse (atestação com checksums) antes de declarar uma
-tessera degradada. Apenas quando a atestação falha é que ele recorre a um
-simples ping. Isso detecta corrupção silenciosa de dados, não apenas partida
-de nós.</li>
-</ul>
-<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
-<ul>
-<li><strong>Fase 3: API e Apps</strong> — App Flutter mobile/desktop via flutter_rust_bridge,
-API GraphQL (async-graphql), nó WASM no navegador</li>
-<li><strong>Fase 4: Resiliência e Escala</strong> — Assinaturas pós-quânticas ML-DSA, travessia
-avançada de NAT, Compartilhamento de Segredo de Shamir para herdeiros,
-empacotamento para Alpine/Arch/Debian/FreeBSD/OpenBSD, CI no SourceHut</li>
-<li><strong>Fase 5: Exploração e Cultura</strong> — navegador público de tesseras, curadoria
-institucional, integração genealógica, exportação para mídia física</li>
-</ul>
-<p>Os nós conseguem se encontrar e manter vivas as memórias uns dos outros. Em
-seguida, damos às pessoas uma forma de segurar suas memórias nas mãos.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/phase2-replication/index.html.gz b/pt-br/news/phase2-replication/index.html.gz
deleted file mode 100644
index 7658f2c..0000000
--- a/pt-br/news/phase2-replication/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/phase3-api-and-apps/index.html b/pt-br/news/phase3-api-and-apps/index.html
deleted file mode 100644
index 57ea05e..0000000
--- a/pt-br/news/phase3-api-and-apps/index.html
+++ /dev/null
@@ -1,167 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Fase 3: Memórias nas Suas Mãos — Tesseras</title>
- <meta name="description" content="Tesseras agora tem um app Flutter e um nó Rust embarcado — qualquer pessoa pode criar e preservar memórias pelo celular.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Fase 3: Memórias nas Suas Mãos">
- <meta property="og:description" content="Tesseras agora tem um app Flutter e um nó Rust embarcado — qualquer pessoa pode criar e preservar memórias pelo celular.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Fase 3: Memórias nas Suas Mãos">
- <meta name="twitter:description" content="Tesseras agora tem um app Flutter e um nó Rust embarcado — qualquer pessoa pode criar e preservar memórias pelo celular.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase3-api-and-apps&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Fase 3: Memórias nas Suas Mãos</h2>
- <p class="news-date">2026-02-14</p>
- <p>As pessoas agora podem segurar suas memórias nas próprias mãos. A Fase 3 entrega
-o que as fases anteriores construíram: um app mobile onde alguém baixa o
-Tesseras, cria uma identidade, tira uma foto, e aquela memória entra na rede de
-preservação. Sem contas na nuvem, sem assinaturas, sem nenhuma empresa entre
-você e suas memórias.</p>
-<h2 id="o-que-foi-construido">O que foi construído</h2>
-<p><strong>tesseras-embedded</strong> — Um nó P2P completo que roda dentro de um app mobile. A
-struct <code>EmbeddedNode</code> é dona de um runtime Tokio, banco SQLite, transporte QUIC,
-engine Kademlia DHT, serviço de replicação e serviço de tessera — a mesma stack
-do daemon desktop, compilada como biblioteca compartilhada. Um padrão singleton
-global (<code>Mutex&lt;Option&lt;EmbeddedNode&gt;&gt;</code>) garante um único nó por ciclo de vida do
-app. Ao iniciar, ele abre o banco de dados, executa migrações, carrega ou gera
-uma identidade Ed25519 com proof-of-work para o node ID, faz bind QUIC numa
-porta efêmera, conecta DHT e replicação, e inicia o loop de reparo. Ao parar,
-envia um sinal de shutdown e drena graciosamente.</p>
-<p>Onze funções FFI são expostas para Dart via flutter_rust_bridge: ciclo de vida
-(<code>node_start</code>, <code>node_stop</code>, <code>node_is_running</code>), identidade (<code>create_identity</code>,
-<code>get_identity</code>), memórias (<code>create_memory</code>, <code>get_timeline</code>, <code>get_memory</code>) e
-status da rede (<code>get_network_stats</code>, <code>get_replication_status</code>). Todos os tipos
-que cruzam a fronteira FFI são structs planas com apenas <code>String</code>,
-<code>Option&lt;String&gt;</code>, <code>Vec&lt;String&gt;</code> e primitivos — sem trait objects, sem generics,
-sem lifetimes.</p>
-<p>Quatro módulos adaptadores fazem a ponte entre as ports do core e as
-implementações concretas: <code>Blake3HasherAdapter</code>,
-<code>Ed25519SignerAdapter</code>/<code>Ed25519VerifierAdapter</code> para criptografia,
-<code>DhtPortAdapter</code> para operações DHT, e <code>ReplicationHandlerAdapter</code> para RPCs de
-fragmentos e atestação recebidos.</p>
-<p>A feature flag <code>bundled-sqlite</code> compila o SQLite a partir do código-fonte,
-necessário para Android e iOS onde a biblioteca do sistema pode não estar
-disponível. A configuração do Cargokit passa essa flag automaticamente em builds
-de debug e release.</p>
-<p><strong>App Flutter</strong> — Uma aplicação Material Design 3 com gerenciamento de estado
-Riverpod, direcionada para Android, iOS, Linux, macOS e Windows a partir de uma
-única base de código.</p>
-<p>O <em>fluxo de onboarding</em> são três telas: uma tela de boas-vindas explicando o
-projeto em uma frase ("Preserve suas memórias através dos milênios. Sem nuvem.
-Sem empresa."), uma tela de criação de identidade que dispara a geração do par
-de chaves Ed25519 em Rust, e uma tela de confirmação mostrando o nome do usuário
-e a identidade criptográfica.</p>
-<p>A <em>tela de timeline</em> exibe memórias em ordem cronológica reversa com previews de
-imagem, texto de contexto e chips para tipo de memória e visibilidade.
-Pull-to-refresh recarrega a partir do nó Rust. Um floating action button abre a
-<em>tela de criação de memória</em>, que suporta seleção de foto da galeria ou câmera
-via <code>image_picker</code>, texto de contexto opcional, dropdowns de tipo de memória e
-visibilidade, e tags separadas por vírgula. Criar uma memória chama o FFI Rust
-sincronamente, depois retorna à timeline.</p>
-<p>A <em>tela de rede</em> mostra dois cards: status do nó (contagem de peers, tamanho da
-DHT, estado de bootstrap, uptime) e saúde da replicação (total de fragmentos,
-fragmentos saudáveis, fragmentos em reparo, fator de replicação). A <em>tela de
-configurações</em> exibe a identidade do usuário — nome, node ID truncado, chave
-pública truncada e data de criação.</p>
-<p>Três providers Riverpod gerenciam o estado: <code>nodeProvider</code> inicia o nó embarcado
-ao abrir o app usando o diretório de documentos e para ao fazer dispose;
-<code>identityProvider</code> carrega o perfil existente ou cria um novo;
-<code>timelineProvider</code> busca a lista de memórias com paginação.</p>
-<p><strong>Testes</strong> — 9 testes unitários Rust em tesseras-embedded cobrindo ciclo de vida
-do nó (start/stop sem panic), persistência de identidade entre reinícios, ciclos
-de reinício sem corrupção do SQLite, streaming de eventos de rede, recuperação
-de estatísticas, criação de memória e recuperação da timeline, e busca de
-memória individual por hash. 2 testes Flutter: um teste de integração
-verificando inicialização do Rust e startup do app, e um smoke test de widget.</p>
-<h2 id="decisoes-de-arquitetura">Decisões de arquitetura</h2>
-<ul>
-<li><strong>Nó embarcado, não cliente-servidor</strong>: o celular roda a stack P2P completa,
-não um thin client conversando com um daemon remoto. Isso significa que
-memórias são preservadas mesmo sem internet. Usuários com um Raspberry Pi ou
-VPS podem opcionalmente conectar o app ao seu daemon via GraphQL para maior
-disponibilidade, mas não é obrigatório.</li>
-<li><strong>FFI síncrono</strong>: todas as funções flutter_rust_bridge são marcadas como
-<code>#[frb(sync)]</code> e bloqueiam no runtime Tokio interno. Isso simplifica o lado
-Dart (sem complexidade de bridge assíncrono) enquanto o lado Rust lida com
-concorrência internamente. A UI thread do Flutter permanece responsiva porque
-o Riverpod envolve as chamadas em providers assíncronos.</li>
-<li><strong>Singleton global</strong>: um global <code>Mutex&lt;Option&lt;EmbeddedNode&gt;&gt;</code> garante que o
-ciclo de vida do nó seja previsível — um start, um stop, sem race conditions.
-Plataformas mobile matam processos agressivamente, então simplicidade no
-gerenciamento de ciclo de vida é uma feature.</li>
-<li><strong>Tipos FFI planos</strong>: nenhuma abstração Rust vaza pela fronteira FFI. Todo
-tipo é uma struct plana com strings e números. Isso torna os bindings Dart
-auto-gerados confiáveis e fáceis de debugar.</li>
-<li><strong>Onboarding de três telas</strong>: a criação de identidade é o único passo
-obrigatório. Sem email, sem senha, sem registro em servidor. O app gera uma
-identidade criptográfica localmente e está pronto para uso.</li>
-</ul>
-<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
-<ul>
-<li><strong>Fase 4: Resiliência e Escala</strong> — NAT traversal avançado (STUN/TURN),
-Shamir's Secret Sharing para herdeiros, tesseras seladas com criptografia
-temporal, ajuste de performance, auditorias de segurança, empacotamento para
-Alpine/Arch/Debian/FreeBSD/OpenBSD</li>
-<li><strong>Fase 5: Exploração e Cultura</strong> — Navegador público de tesseras por
-era/localização/tema/idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)</li>
-</ul>
-<p>A infraestrutura está completa. A rede existe, a replicação funciona, e agora
-qualquer pessoa com um celular pode participar. O que resta é fortalecer o que
-temos e abrir para o mundo.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/phase3-api-and-apps/index.html.gz b/pt-br/news/phase3-api-and-apps/index.html.gz
deleted file mode 100644
index d9c466e..0000000
--- a/pt-br/news/phase3-api-and-apps/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/phase4-encryption-sealed/index.html b/pt-br/news/phase4-encryption-sealed/index.html
deleted file mode 100644
index 3cbd9bf..0000000
--- a/pt-br/news/phase4-encryption-sealed/index.html
+++ /dev/null
@@ -1,187 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Fase 4: Criptografia e Tesseras Seladas — Tesseras</title>
- <meta name="description" content="Tesseras agora suporta memórias privadas e seladas com criptografia híbrida pós-quântica — AES-256-GCM, X25519 + ML-KEM-768 e publicação de chaves com bloqueio temporal.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Fase 4: Criptografia e Tesseras Seladas">
- <meta property="og:description" content="Tesseras agora suporta memórias privadas e seladas com criptografia híbrida pós-quântica — AES-256-GCM, X25519 + ML-KEM-768 e publicação de chaves com bloqueio temporal.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Fase 4: Criptografia e Tesseras Seladas">
- <meta name="twitter:description" content="Tesseras agora suporta memórias privadas e seladas com criptografia híbrida pós-quântica — AES-256-GCM, X25519 + ML-KEM-768 e publicação de chaves com bloqueio temporal.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-encryption-sealed&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Fase 4: Criptografia e Tesseras Seladas</h2>
- <p class="news-date">2026-02-14</p>
- <p>Algumas memórias não são para todos. Um diário privado, uma carta para ser
-aberta em 2050, um segredo de família selado até que os netos tenham idade
-suficiente. Até agora, toda tessera na rede era aberta. A Fase 4 muda isso:
-Tesseras agora criptografa conteúdo privado e selado com um esquema
-criptográfico híbrido projetado para resistir tanto a ataques clássicos quanto
-quânticos.</p>
-<p>O princípio continua o mesmo — criptografar o mínimo possível. Memórias públicas
-precisam de disponibilidade, não de sigilo. Mas quando alguém cria uma tessera
-privada ou selada, o conteúdo agora é trancado por criptografia AES-256-GCM com
-chaves protegidas por um mecanismo híbrido de encapsulamento de chaves
-combinando X25519 e ML-KEM-768. Ambos os algoritmos precisam ser quebrados para
-acessar o conteúdo.</p>
-<h2 id="o-que-foi-construido">O que foi construído</h2>
-<p><strong>Encriptador AES-256-GCM</strong> (<code>tesseras-crypto/src/encryption.rs</code>) — Criptografia
-simétrica de conteúdo com nonces aleatórios de 12 bytes e dados autenticados
-associados (AAD). O AAD vincula o texto cifrado ao seu contexto: para tesseras
-privadas, o hash do conteúdo é incluído; para tesseras seladas, tanto o hash do
-conteúdo quanto o timestamp <code>open_after</code> são vinculados no AAD. Isso significa
-que mover texto cifrado entre tesseras com datas de abertura diferentes causa
-falha na decriptação — você não consegue enganar o sistema para abrir uma
-memória selada antecipadamente trocando o texto cifrado para uma tessera com uma
-data de selo anterior.</p>
-<p><strong>Mecanismo Híbrido de Encapsulamento de Chaves</strong> (<code>tesseras-crypto/src/kem.rs</code>)
-— Troca de chaves usando X25519 (Diffie-Hellman clássico em curva elíptica)
-combinado com ML-KEM-768 (o KEM pós-quântico baseado em reticulados padronizado
-pelo NIST, anteriormente Kyber). Ambos os segredos compartilhados são combinados
-via <code>blake3::derive_key</code> com uma string de contexto fixa ("tesseras hybrid kem
-v1") para produzir uma única chave de criptografia de conteúdo de 256 bits. Isso
-segue a mesma filosofia "dual desde o início" das assinaturas duplas do projeto
-(Ed25519 + ML-DSA): se qualquer algoritmo for quebrado no futuro, o outro ainda
-protege o conteúdo.</p>
-<p><strong>Envelope de Chave Selada</strong> (<code>tesseras-crypto/src/sealed.rs</code>) — Encapsula uma
-chave de criptografia de conteúdo usando o KEM híbrido, para que apenas o dono
-da tessera possa recuperá-la. O KEM produz uma chave de transporte, que é XORed
-com a chave de conteúdo para produzir uma chave encapsulada armazenada junto ao
-texto cifrado do KEM. Ao desselar, o dono decapsula o texto cifrado do KEM para
-recuperar a chave de transporte, depois faz XOR novamente para recuperar a chave
-de conteúdo.</p>
-<p><strong>Publicação de Chave</strong> (<code>tesseras-crypto/src/sealed.rs</code>) — Um artefato assinado
-independente para publicar a chave de conteúdo de uma tessera selada após a data
-<code>open_after</code> ter passado. O dono assina a chave de conteúdo, o hash da tessera e
-o timestamp de publicação com suas chaves duais (Ed25519, com placeholder
-ML-DSA). O manifesto permanece imutável — a publicação da chave é um documento
-separado. Outros nós verificam a assinatura contra a chave pública do dono antes
-de usar a chave publicada para decriptar o conteúdo.</p>
-<p><strong>EncryptionContext</strong> (<code>tesseras-core/src/enums.rs</code>) — Um tipo de domínio que
-representa o contexto AAD para criptografia. Ele vive em tesseras-core e não em
-tesseras-crypto porque é um conceito de domínio (não um detalhe de implementação
-criptográfica). O método <code>to_aad_bytes()</code> produz serialização determinística: um
-byte de tag (0x00 para Private, 0x01 para Sealed), seguido do hash de conteúdo
-e, para Sealed, o timestamp <code>open_after</code> como i64 little-endian.</p>
-<p><strong>Validação de domínio</strong> (<code>tesseras-core/src/service.rs</code>) —
-<code>TesseraService::create()</code> agora rejeita tesseras Sealed e Private que não
-fornecem chaves de criptografia. Esta é uma validação no nível de domínio: a
-camada de serviço garante que você não pode criar uma memória selada sem a
-maquinaria criptográfica para protegê-la. A mensagem de erro é clara: "missing
-encryption keys for visibility sealed until 2050-01-01."</p>
-<p><strong>Atualizações de tipos do core</strong> — <code>TesseraIdentity</code> agora inclui um campo
-opcional <code>encryption_public: Option&lt;HybridEncryptionPublic&gt;</code> contendo tanto as
-chaves públicas X25519 quanto ML-KEM-768. <code>KeyAlgorithm</code> ganhou as variantes
-<code>X25519</code> e <code>MlKem768</code>. O layout do sistema de arquivos de identidade agora
-suporta <code>node.x25519.key</code>/<code>.pub</code> e <code>node.mlkem768.key</code>/<code>.pub</code>.</p>
-<p><strong>Testes</strong> — 8 testes unitários para AES-256-GCM (roundtrip, chave errada, texto
-cifrado adulterado, AAD errado, falha de decriptação cross-context, nonces
-únicos, mais 2 testes baseados em propriedades para payloads arbitrários e
-unicidade de nonces). 5 testes unitários para HybridKem (roundtrip, par de
-chaves errado, X25519 adulterado, determinismo do KDF, mais 1 teste baseado em
-propriedades). 4 testes unitários para SealedKeyEnvelope e KeyPublication. 2
-testes de integração cobrindo o ciclo de vida completo de tesseras seladas e
-privadas: gerar chaves, criar chave de conteúdo, criptografar, selar, desselar,
-decriptar, publicar chave e verificar — o ciclo completo.</p>
-<h2 id="decisoes-de-arquitetura">Decisões de arquitetura</h2>
-<ul>
-<li><strong>KEM híbrido desde o início</strong>: X25519 + ML-KEM-768 segue a mesma filosofia
-das assinaturas duplas. Não sabemos quais suposições criptográficas se
-manterão ao longo dos milênios, então combinamos algoritmos clássicos e
-pós-quânticos. O custo é ~1,2 KB de material de chave adicional por identidade
-— trivial comparado às fotos e vídeos em uma tessera.</li>
-<li><strong>BLAKE3 para KDF</strong>: ao invés de adicionar <code>hkdf</code> + <code>sha2</code> como novas
-dependências, usamos <code>blake3::derive_key</code> com uma string de contexto fixa. O
-modo de derivação de chaves do BLAKE3 é especificamente projetado para este
-caso de uso, e o projeto já depende do BLAKE3 para hashing de conteúdo.</li>
-<li><strong>Manifestos imutáveis</strong>: quando a data <code>open_after</code> de uma tessera selada
-passa, a chave de conteúdo é publicada como um artefato assinado separado
-(<code>KeyPublication</code>), não modificando o manifesto. Isso preserva a natureza
-append-only e endereçada por conteúdo das tesseras. O manifesto foi assinado
-no momento da criação e nunca muda.</li>
-<li><strong>Vinculação AAD previne troca de texto cifrado</strong>: o <code>EncryptionContext</code>
-vincula tanto o hash de conteúdo quanto (para tesseras seladas) o timestamp
-<code>open_after</code> nos dados autenticados do AES-GCM. Um atacante que copie conteúdo
-criptografado de uma tessera "selada até 2050" para uma tessera "selada até
-2025" vai descobrir que a decriptação falha — o AAD não corresponde mais.</li>
-<li><strong>Encapsulamento de chave por XOR</strong>: o envelope de chave selada usa um XOR
-simples da chave de conteúdo com a chave de transporte derivada do KEM, ao
-invés de uma camada adicional de AES-GCM. Como a chave de transporte é um
-valor aleatório fresco do KEM e é usada exatamente uma vez, o XOR é
-informação-teoricamente seguro para este caso de uso específico e evita
-complexidade desnecessária.</li>
-<li><strong>Validação de domínio, não validação de storage</strong>: a verificação de "chaves
-de criptografia ausentes" vive em <code>TesseraService::create()</code>, não na camada de
-storage. Isso segue o padrão de arquitetura hexagonal: regras de domínio são
-aplicadas na fronteira de serviço, não espalhadas pelos adaptadores.</li>
-</ul>
-<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
-<ul>
-<li><strong>Fase 4 continuada: Resiliência e Escala</strong> — Shamir's Secret Sharing para
-distribuição de chaves de herdeiros, NAT traversal avançado (STUN/TURN),
-ajuste de performance, auditorias de segurança, empacotamento para sistemas
-operacionais</li>
-<li><strong>Fase 5: Exploração e Cultura</strong> — Navegador público de tesseras por
-era/localização/tema/idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)</li>
-</ul>
-<p>Tesseras seladas fazem do Tesseras uma verdadeira cápsula do tempo. Um pai agora
-pode gravar uma mensagem para o neto que ainda não nasceu, selá-la até 2060 e
-saber que o envelope criptográfico vai resistir — mesmo que os computadores
-quânticos do futuro tentem abri-lo antes da hora.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/phase4-encryption-sealed/index.html.gz b/pt-br/news/phase4-encryption-sealed/index.html.gz
deleted file mode 100644
index b039bac..0000000
--- a/pt-br/news/phase4-encryption-sealed/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/phase4-institutional-onboarding/index.html b/pt-br/news/phase4-institutional-onboarding/index.html
deleted file mode 100644
index 023892c..0000000
--- a/pt-br/news/phase4-institutional-onboarding/index.html
+++ /dev/null
@@ -1,252 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Fase 4: Onboarding de Nos Institucionais — Tesseras</title>
- <meta name="description" content="Bibliotecas, arquivos e museus agora podem ingressar na rede Tesseras como nos institucionais verificados com identidade baseada em DNS, indices de busca full-text e compromissos configuraveis de armazenamento.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Fase 4: Onboarding de Nos Institucionais">
- <meta property="og:description" content="Bibliotecas, arquivos e museus agora podem ingressar na rede Tesseras como nos institucionais verificados com identidade baseada em DNS, indices de busca full-text e compromissos configuraveis de armazenamento.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Fase 4: Onboarding de Nos Institucionais">
- <meta name="twitter:description" content="Bibliotecas, arquivos e museus agora podem ingressar na rede Tesseras como nos institucionais verificados com identidade baseada em DNS, indices de busca full-text e compromissos configuraveis de armazenamento.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-institutional-onboarding&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Fase 4: Onboarding de Nos Institucionais</h2>
- <p class="news-date">2026-02-15</p>
- <p>Uma rede P2P composta apenas por individuos e fragil. Discos rigidos morrem,
-celulares sao perdidos, pessoas perdem interesse. A sobrevivencia a longo prazo
-das memorias da humanidade depende de instituicoes — bibliotecas, arquivos,
-museus, universidades — que medem seus tempos de vida em seculos. A Fase 4
-continua com o onboarding de nos institucionais: organizacoes verificadas agora
-podem prometer armazenamento, manter indices de busca e participar da rede com
-uma identidade distinta.</p>
-<p>O design segue um principio de confiar mas verificar: instituicoes se
-identificam via registros DNS TXT (o mesmo mecanismo usado por SPF, DKIM e DMARC
-para email), prometem um orcamento de armazenamento e recebem isencoes de
-reciprocidade para que possam armazenar fragmentos para outros sem esperar nada
-em troca. Em contrapartida, a rede trata seus fragmentos como replicas de maior
-qualidade e limita a dependencia excessiva de qualquer instituicao individual
-atraves de restricoes de diversidade.</p>
-<h2 id="o-que-foi-construido">O que foi construido</h2>
-<p><strong>Bits de capacidade</strong> (<code>tesseras-core/src/network.rs</code>) — Dois novos flags
-adicionados ao bitfield <code>Capabilities</code>: <code>INSTITUTIONAL</code> (bit 7) e <code>SEARCH_INDEX</code>
-(bit 8). Um novo construtor <code>institutional_default()</code> retorna o conjunto
-completo de capacidades da Fase 2 mais esses dois bits e <code>RELAY</code>. Nos normais
-anunciam <code>phase2_default()</code> que nao inclui flags institucionais. Testes de
-roundtrip de serializacao verificam que os novos bits sobrevivem a codificacao
-MessagePack.</p>
-<p><strong>Tipos de busca</strong> (<code>tesseras-core/src/search.rs</code>) — Tres novos tipos de dominio
-para o subsistema de busca:</p>
-<ul>
-<li><code>SearchFilters</code> — parametros de consulta: <code>memory_type</code>, <code>visibility</code>,
-<code>language</code>, <code>date_range</code>, <code>geo</code> (bounding box), <code>page</code>, <code>page_size</code></li>
-<li><code>SearchHit</code> — um resultado individual: hash do conteudo mais um
-<code>MetadataExcerpt</code> (titulo, descricao, tipo de memoria, data de criacao,
-visibilidade, idioma, tags)</li>
-<li><code>GeoFilter</code> — bounding box com <code>min_lat</code>, <code>max_lat</code>, <code>min_lon</code>, <code>max_lon</code> para
-consultas espaciais</li>
-</ul>
-<p>Todos os tipos derivam <code>Serialize</code>/<code>Deserialize</code> para transporte e
-<code>Clone</code>/<code>Debug</code> para diagnostico.</p>
-<p><strong>Configuracao institucional do daemon</strong> (<code>tesd/src/config.rs</code>) — Uma nova secao
-<code>[institutional]</code> no TOML com <code>domain</code> (o dominio DNS a verificar),
-<code>pledge_bytes</code> (compromisso de armazenamento em bytes) e <code>search_enabled</code>
-(toggle para o indice FTS5). O metodo <code>to_dht_config()</code> agora define
-<code>Capabilities::institutional_default()</code> quando a configuracao institucional esta
-presente, para que nos institucionais anunciem os bits de capacidade corretos em
-respostas Pong.</p>
-<p><strong>Verificacao DNS TXT</strong> (<code>tesd/src/institutional.rs</code>) — Resolucao DNS assincrona
-usando <code>hickory-resolver</code> para verificar identidade institucional. O daemon
-consulta registros TXT em <code>_tesseras.&lt;dominio&gt;</code> e analisa campos chave-valor:
-<code>v</code> (versao), <code>node</code> (node ID em hexadecimal) e <code>pledge</code> (compromisso de
-armazenamento em bytes). A verificacao checa:</p>
-<ol>
-<li>Um registro TXT existe em <code>_tesseras.&lt;dominio&gt;</code></li>
-<li>O campo <code>node</code> corresponde ao node ID do proprio daemon</li>
-<li>O campo <code>pledge</code> esta presente e e valido</li>
-</ol>
-<p>Na inicializacao, o daemon tenta a verificacao DNS. Se bem-sucedida, o no roda
-com capacidades institucionais. Se falhar, o no registra um aviso e faz
-downgrade para um no completo normal — sem crash, sem intervencao manual.</p>
-<p><strong>Comando CLI de setup</strong> (<code>tesseras-cli/src/institutional.rs</code>) — Um novo
-subcomando <code>institutional setup</code> que guia operadores pelo onboarding:</p>
-<ol>
-<li>Le a identidade do no a partir do diretorio de dados</li>
-<li>Solicita nome de dominio e tamanho do pledge</li>
-<li>Gera o registro DNS TXT exato a adicionar:
-<code>v=tesseras1 node=&lt;hex&gt; pledge=&lt;bytes&gt;</code></li>
-<li>Escreve a secao institucional no arquivo de configuracao do daemon</li>
-<li>Imprime os proximos passos: adicionar o registro TXT, reiniciar o daemon</li>
-</ol>
-<p><strong>Indice de busca SQLite</strong> (<code>tesseras-storage</code>) — Uma migracao
-(<code>003_institutional.sql</code>) que cria tres estruturas:</p>
-<ul>
-<li><code>search_content</code> — uma tabela virtual FTS5 para busca full-text sobre
-metadados de tesseras (titulo, descricao, criador, tags, idioma)</li>
-<li><code>geo_index</code> — uma tabela virtual R-tree para consultas espaciais de bounding
-box sobre latitude/longitude</li>
-<li><code>geo_map</code> — uma tabela de mapeamento ligando IDs de linhas do R-tree a hashes
-de conteudo</li>
-</ul>
-<p>O adaptador <code>SqliteSearchIndex</code> implementa o port trait <code>SearchIndex</code> com
-<code>index_tessera()</code> (inserir/atualizar) e <code>search()</code> (consultar com filtros).
-Consultas FTS5 suportam busca em linguagem natural; consultas geo usam
-<code>INTERSECT</code> do R-tree para lookups de bounding box. Resultados sao ranqueados
-por score de relevancia do FTS5.</p>
-<p>A migracao tambem adiciona uma coluna <code>is_institutional</code> a tabela <code>reciprocity</code>,
-tratada de forma idempotente via checagens <code>pragma_table_info</code> (o
-<code>ALTER TABLE ADD COLUMN</code> do SQLite nao tem <code>IF NOT EXISTS</code>).</p>
-<p><strong>Bypass de reciprocidade</strong> (<code>tesseras-replication/src/service.rs</code>) — Nos
-institucionais sao isentos de checagens de reciprocidade. Quando
-<code>receive_fragment()</code> e chamado, se o node ID do remetente esta marcado como
-institucional no ledger de reciprocidade, a checagem de saldo e ignorada
-completamente. Isso significa que instituicoes podem armazenar fragmentos para
-toda a rede sem precisar "ganhar" creditos primeiro — sua identidade verificada
-por DNS e compromisso de armazenamento servem como credencial.</p>
-<p><strong>Restricao de diversidade por tipo de no</strong>
-(<code>tesseras-replication/src/distributor.rs</code>) — Uma nova funcao
-<code>apply_institutional_diversity()</code> limita quantas replicas de uma unica tessera
-podem ir para nos institucionais. O limite e <code>ceil(fator_replicacao / 3.5)</code> —
-com o padrao <code>r=7</code>, no maximo 2 de 7 replicas vao para instituicoes. Isso impede
-que a rede se torne dependente de um pequeno numero de grandes instituicoes: se
-os servidores de uma universidade cairem, pelo menos 5 replicas permanecem em
-nos independentes.</p>
-<p><strong>Extensoes de mensagens DHT</strong> (<code>tesseras-dht/src/message.rs</code>) — Duas novas
-variantes de mensagem:</p>
-<table><thead><tr><th>Mensagem</th><th>Proposito</th></tr></thead><tbody>
-<tr><td><code>Search</code></td><td>Cliente envia string de consulta, filtros e numero da pagina</td></tr>
-<tr><td><code>SearchResult</code></td><td>No institucional responde com resultados e contagem total</td></tr>
-</tbody></table>
-<p>A funcao <code>encode()</code> foi trocada de serializacao MessagePack posicional para
-nomeada (<code>rmp_serde::to_vec_named</code>) para lidar corretamente com campos opcionais
-de <code>SearchFilters</code> — a codificacao posicional quebra quando
-<code>skip_serializing_if</code> omite campos.</p>
-<p><strong>Metricas Prometheus</strong> (<code>tesd/src/metrics.rs</code>) — Oito metricas especificas
-institucionais:</p>
-<ul>
-<li><code>tesseras_institutional_pledge_bytes</code> — compromisso de armazenamento
-configurado</li>
-<li><code>tesseras_institutional_stored_bytes</code> — bytes realmente armazenados</li>
-<li><code>tesseras_institutional_pledge_utilization_ratio</code> — razao armazenado/prometido</li>
-<li><code>tesseras_institutional_peers_served</code> — peers unicos que receberam fragmentos</li>
-<li><code>tesseras_institutional_search_index_total</code> — tesseras no indice de busca</li>
-<li><code>tesseras_institutional_search_queries_total</code> — consultas de busca recebidas</li>
-<li><code>tesseras_institutional_dns_verification_status</code> — 1 se verificado por DNS, 0
-caso contrario</li>
-<li><code>tesseras_institutional_dns_verification_last</code> — timestamp Unix da ultima
-verificacao</li>
-</ul>
-<p><strong>Testes de integracao</strong> — Dois testes em
-<code>tesseras-replication/tests/integration.rs</code>:</p>
-<ul>
-<li><code>institutional_peer_bypasses_reciprocity</code> — verifica que um peer institucional
-com deficit massivo (-999.999 de saldo) ainda pode armazenar fragmentos,
-enquanto um peer nao institucional com o mesmo deficit e rejeitado</li>
-<li><code>institutional_node_accepts_fragment_despite_deficit</code> — teste async completo
-usando <code>ReplicationService</code> com DHT, fragment store, reciprocity ledger e blob
-store mockados: envia um fragmento de um remetente institucional e verifica
-que e aceito</li>
-</ul>
-<p>322 testes passam em todo o workspace. Clippy limpo com <code>-D warnings</code>.</p>
-<h2 id="decisoes-de-arquitetura">Decisoes de arquitetura</h2>
-<ul>
-<li><strong>DNS TXT ao inves de PKI ou blockchain</strong>: DNS e universalmente implantado,
-universalmente compreendido e ja usado para verificacao de dominio (SPF, DKIM,
-Let's Encrypt). Instituicoes ja gerenciam DNS. Nenhuma autoridade
-certificadora, nenhum token, nenhuma transacao on-chain — apenas um registro
-TXT. Se uma instituicao perder controle de seu dominio, a verificacao
-naturalmente falha na proxima checagem.</li>
-<li><strong>Degradacao graciosa em falha DNS</strong>: se a verificacao DNS falha na
-inicializacao, o daemon faz downgrade para um no completo normal ao inves de
-recusar iniciar. Isso previne incidentes operacionais — uma misconfiguracao
-DNS nao deveria tirar um no do ar.</li>
-<li><strong>Limite de diversidade em <code>ceil(r / 3.5)</code></strong>: com <code>r=7</code>, no maximo 2 replicas
-vao para instituicoes. Isso e conservador — garante que a rede nunca dependa
-de instituicoes para quorum majoritario, enquanto ainda se beneficia de sua
-capacidade de armazenamento e uptime.</li>
-<li><strong>Codificacao MessagePack nomeada</strong>: trocar de codificacao posicional para
-nomeada adiciona ~15% de overhead por mensagem mas elimina uma classe de bugs
-de serializacao quando campos opcionais estao presentes. O DHT nao e limitado
-por largura de banda no nivel de mensagem, entao o tradeoff vale a pena.</li>
-<li><strong>Isencao de reciprocidade ao inves de concessao de creditos</strong>: ao inves de
-dar as instituicoes um saldo inicial grande de creditos (que e arbitrario e
-precisa de ajuste), isentamos completamente. Sua identidade verificada por DNS
-e compromisso publico de armazenamento substituem o mecanismo de reciprocidade
-bilateral.</li>
-<li><strong>FTS5 + R-tree no SQLite</strong>: busca full-text e indexacao espacial sao
-embutidas no SQLite como extensoes carregaveis. Nenhum motor de busca externo
-(Elasticsearch, Meilisearch) necessario. Isso mantem o deploy como um unico
-binario com um unico arquivo de banco de dados — critico para operadores
-institucionais que podem nao ter uma equipe de DevOps.</li>
-</ul>
-<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
-<ul>
-<li><strong>Fase 4 continuacao</strong> — deduplicacao de armazenamento (armazenamento
-enderecavel por conteudo com BLAKE3), auditorias de seguranca, empacotamento
-para OS (Alpine, Arch, Debian, OpenBSD, FreeBSD)</li>
-<li><strong>Fase 5: Exploracao e Cultura</strong> — navegador publico de tesseras por
-era/localizacao/tema/idioma, curadoria institucional, integracao genealogica
-(FamilySearch, Ancestry), exportacao para midia fisica (M-DISC, microfilme,
-papel livre de acido com QR), contexto assistido por IA</li>
-</ul>
-<p>O onboarding institucional fecha uma lacuna critica no modelo de preservacao do
-Tesseras. Nos individuais fornecem resiliencia de base — milhares de
-dispositivos ao redor do globo, cada um armazenando alguns fragmentos. Nos
-institucionais fornecem ancoragem — organizacoes com infraestrutura
-profissional, armazenamento redundante e horizontes operacionais de multiplas
-decadas. Juntos, formam uma rede onde memorias podem sobreviver tanto a
-dispositivos individuais quanto a instituicoes individuais.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/phase4-institutional-onboarding/index.html.gz b/pt-br/news/phase4-institutional-onboarding/index.html.gz
deleted file mode 100644
index 8d67e91..0000000
--- a/pt-br/news/phase4-institutional-onboarding/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/phase4-nat-traversal/index.html b/pt-br/news/phase4-nat-traversal/index.html
deleted file mode 100644
index 6b43a65..0000000
--- a/pt-br/news/phase4-nat-traversal/index.html
+++ /dev/null
@@ -1,238 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Fase 4: Furando NATs — Tesseras</title>
- <meta name="description" content="Os nos Tesseras agora podem descobrir seu tipo de NAT via STUN, coordenar UDP hole punching atraves de introdutores e usar relay transparente quando a conectividade direta falha.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Fase 4: Furando NATs">
- <meta property="og:description" content="Os nos Tesseras agora podem descobrir seu tipo de NAT via STUN, coordenar UDP hole punching atraves de introdutores e usar relay transparente quando a conectividade direta falha.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Fase 4: Furando NATs">
- <meta name="twitter:description" content="Os nos Tesseras agora podem descobrir seu tipo de NAT via STUN, coordenar UDP hole punching atraves de introdutores e usar relay transparente quando a conectividade direta falha.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-nat-traversal&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Fase 4: Furando NATs</h2>
- <p class="news-date">2026-02-15</p>
- <p>A maioria dos dispositivos das pessoas ficam atras de um NAT — um tradutor de
-enderecos de rede que permite acessar a internet mas impede conexoes de entrada.
-Para uma rede P2P, isso e um problema existencial: se dois nos atras de NATs nao
-conseguem se comunicar, a rede se fragmenta. A Fase 4 continua com uma pilha
-completa de travessia de NAT: descoberta via STUN, hole punching coordenado e
-fallback por relay.</p>
-<p>A abordagem segue o mesmo padrao da maioria dos sistemas P2P consolidados
-(WebRTC, BitTorrent, IPFS): tente a opcao mais barata primeiro, escale apenas
-quando necessario. Conectividade direta nao custa nada. Hole punching custa
-alguns pacotes coordenados. Relay custa largura de banda sustentada de um
-terceiro. Tesseras tenta nessa ordem.</p>
-<h2 id="o-que-foi-construido">O que foi construido</h2>
-<p><strong>Classificacao NatType</strong> (<code>tesseras-core/src/network.rs</code>) — Um novo enum
-<code>NatType</code> (Public, Cone, Symmetric, Unknown) adicionado a camada de dominio
-core. Esse tipo e compartilhado por toda a pilha: o cliente STUN o escreve, o
-DHT o divulga em mensagens Pong, e o coordenador de punch o le para decidir se
-hole punching vale a pena tentar (Cone-para-Cone funciona ~80% das vezes;
-Symmetric-para-Symmetric quase nunca funciona).</p>
-<p><strong>Cliente STUN</strong> (<code>tesseras-net/src/stun.rs</code>) — Uma implementacao STUN minima
-(RFC 5389 Binding Request/Response) que descobre o endereco externo de um no. O
-codec codifica requisicoes de 20 bytes com um ID de transacao aleatorio e
-decodifica respostas XOR-MAPPED-ADDRESS. A funcao <code>discover_nat()</code> consulta
-multiplos servidores STUN em paralelo (Google, Cloudflare por padrao), compara
-os enderecos mapeados e classifica o tipo de NAT:</p>
-<ul>
-<li>Mesmo IP e porta de todos os servidores → <strong>Public</strong> (sem NAT)</li>
-<li>Mesmo endereco mapeado de todos os servidores → <strong>Cone</strong> (hole punching
-funciona)</li>
-<li>Enderecos mapeados diferentes → <strong>Symmetric</strong> (hole punching nao confiavel)</li>
-<li>Sem respostas → <strong>Unknown</strong></li>
-</ul>
-<p>Retentativas com backoff exponencial e timeouts configuraveis. 12 testes
-cobrindo roundtrips de codec, todos os caminhos de classificacao e consultas
-async em loopback.</p>
-<p><strong>Coordenacao de punch assinada</strong> (<code>tesseras-net/src/punch.rs</code>) — Assinatura e
-verificacao Ed25519 para mensagens <code>PunchIntro</code>, <code>RelayRequest</code> e
-<code>RelayMigrate</code>. Cada introducao e assinada pelo iniciador com uma janela de
-timestamp de 30 segundos, prevenindo ataques de reflexao (onde um atacante
-reproduz uma introducao antiga para redirecionar trafego). O formato do payload
-e <code>target || external_addr || timestamp</code> — alterar qualquer campo invalida a
-assinatura. 6 testes unitarios mais 3 testes baseados em propriedades com
-proptest (IDs de no, portas e tokens de sessao arbitrarios).</p>
-<p><strong>Gerenciador de sessoes de relay</strong> (<code>tesseras-net/src/relay.rs</code>) — Gerencia
-sessoes de relay UDP transparente entre nos com NAT. Cada sessao tem um token
-aleatorio de 16 bytes; os nos prefixam seus pacotes com o token, o relay remove
-e encaminha. Funcionalidades:</p>
-<ul>
-<li>Encaminhamento bidirecional (A→R→B e B→R→A)</li>
-<li>Limite de taxa: 256 KB/s para nos reciprocos, 64 KB/s para nao reciprocos</li>
-<li>Duracao maxima de 10 minutos para sessoes bootstrap (nao reciprocas)</li>
-<li>Migracao de endereco: quando o IP de um no muda (Wi-Fi para celular), um
-<code>RelayMigrate</code> assinado atualiza a sessao sem derruba-la</li>
-<li>Limpeza por inatividade com timeout configuravel</li>
-<li>8 testes unitarios mais 2 testes baseados em propriedades</li>
-</ul>
-<p><strong>Extensoes de mensagens DHT</strong> (<code>tesseras-dht/src/message.rs</code>) — Sete novas
-variantes de mensagem adicionadas ao protocolo DHT:</p>
-<table><thead><tr><th>Mensagem</th><th>Proposito</th></tr></thead><tbody>
-<tr><td><code>PunchIntro</code></td><td>"Quero conectar ao no X, aqui esta meu endereco externo assinado"</td></tr>
-<tr><td><code>PunchRequest</code></td><td>O introdutor encaminha a requisicao ao destino</td></tr>
-<tr><td><code>PunchReady</code></td><td>O destino confirma prontidao, envia seu endereco externo</td></tr>
-<tr><td><code>RelayRequest</code></td><td>"Crie uma sessao de relay para o no X"</td></tr>
-<tr><td><code>RelayOffer</code></td><td>O relay responde com seu endereco e token de sessao</td></tr>
-<tr><td><code>RelayClose</code></td><td>Encerrar uma sessao de relay</td></tr>
-<tr><td><code>RelayMigrate</code></td><td>Atualizar sessao apos mudanca de rede</td></tr>
-</tbody></table>
-<p>A mensagem <code>Pong</code> foi estendida com metadados NAT: <code>nat_type</code>,
-<code>relay_slots_available</code> e <code>relay_bandwidth_used_kbps</code>. Todos os novos campos
-usam <code>#[serde(default)]</code> para compatibilidade retroativa — nos antigos ignoram o
-que nao reconhecem, nos novos usam defaults. 9 novos testes de roundtrip de
-serializacao.</p>
-<p><strong>Trait NatHandler e dispatch</strong> (<code>tesseras-dht/src/engine.rs</code>) — Uma nova trait
-async <code>NatHandler</code> (5 metodos) injetada no engine DHT, seguindo o mesmo padrao
-de injecao de dependencia do <code>ReplicationHandler</code> existente. O loop de dispatch
-de mensagens do engine agora roteia todas as mensagens punch/relay para o
-handler. Isso mantem o engine DHT agnóstico ao protocolo enquanto permite que a
-logica de travessia de NAT viva em <code>tesseras-net</code>.</p>
-<p><strong>Tipos de reconexao mobile</strong> (<code>tesseras-embedded/src/reconnect.rs</code>) — Uma
-maquina de estados de reconexao em tres fases para dispositivos moveis:</p>
-<ol>
-<li><strong>QuicMigration</strong> (0-2s) — tenta migracao de conexao QUIC para todos os peers
-ativos</li>
-<li><strong>ReStun</strong> (2-5s) — redescobre endereco externo via STUN</li>
-<li><strong>ReEstablish</strong> (5-10s) — reconecta peers que a migracao nao conseguiu salvar</li>
-</ol>
-<p>Peers sao reconectados em ordem de prioridade: nos bootstrap primeiro, depois
-nos que guardam nossos fragmentos, depois nos cujos fragmentos guardamos, depois
-vizinhos DHT gerais. Uma nova variante de evento <code>NetworkChanged</code> foi adicionada
-ao stream de eventos FFI para que o app Flutter possa mostrar progresso de
-reconexao.</p>
-<p><strong>Configuracao NAT do daemon</strong> (<code>tesd/src/config.rs</code>) — Uma nova secao <code>[nat]</code>
-na configuracao TOML com lista de servidores STUN, toggle de relay, maximo de
-sessoes relay, limites de largura de banda (reciproco vs bootstrap) e timeout de
-inatividade. Todos os campos tem defaults sensiveis; relay e desabilitado por
-padrao.</p>
-<p><strong>Metricas Prometheus</strong> (<code>tesseras-net/src/metrics.rs</code>) — 16 metricas em quatro
-subsistemas:</p>
-<ul>
-<li><strong>STUN</strong>: requisicoes, falhas, histograma de latencia</li>
-<li><strong>Punch</strong>: tentativas/sucessos/falhas (por par de tipo NAT), histograma de
-latencia</li>
-<li><strong>Relay</strong>: sessoes ativas, sessoes totais, bytes encaminhados, timeouts por
-inatividade, hits de rate limit</li>
-<li><strong>Reconexao</strong>: mudancas de rede, tentativas/sucessos por fase, histograma de
-duracao</li>
-</ul>
-<p>6 testes verificando registro, incremento, cardinalidade de labels e deteccao de
-registro duplo.</p>
-<p><strong>Testes de integracao</strong> — Dois testes end-to-end usando <code>MemTransport</code> (rede
-simulada em memoria):</p>
-<ul>
-<li><code>punch_integration.rs</code> — Fluxo completo de hole-punch com 3 nos: A envia
-<code>PunchIntro</code> assinado ao introdutor I, I verifica e encaminha <code>PunchRequest</code> a
-B, B verifica a assinatura original e envia <code>PunchReady</code> de volta, A e B
-trocam mensagens diretamente. Tambem testa que uma assinatura invalida e
-corretamente rejeitada.</li>
-<li><code>relay_integration.rs</code> — Fluxo completo de relay com 3 nos: A solicita relay
-de R, R cria sessao e envia <code>RelayOffer</code> a ambos os peers, A e B trocam
-pacotes prefixados com token atraves de R, A migra para um novo endereco no
-meio da sessao, A fecha a sessao, e o teste verifica que a sessao e encerrada
-e encaminhamento posterior falha.</li>
-</ul>
-<p><strong>Testes de propriedade</strong> — 7 testes baseados em proptest cobrindo: roundtrips
-de assinatura para todos os tres tipos de mensagem assinada (IDs de no, portas e
-tokens arbitrarios), determinismo de classificacao NAT (mesmas entradas sempre
-produzem mesma saida), validade de binding request STUN, unicidade de tokens de
-sessao, e rejeicao de pacotes curtos pelo relay.</p>
-<p><strong>Alvos Justfile</strong> — <code>just test-nat</code> executa todos os testes de travessia NAT em
-<code>tesseras-net</code> e <code>tesseras-dht</code>. <code>just test-chaos</code> e um placeholder para futuros
-testes de caos com Docker Compose e <code>tc netem</code>.</p>
-<h2 id="decisoes-de-arquitetura">Decisoes de arquitetura</h2>
-<ul>
-<li><strong>STUN ao inves de TURN</strong>: implementamos STUN (descoberta) e relay customizado
-ao inves de TURN completo. TURN requer alocacao autenticada e foi projetado
-para relay de midia; nosso relay e mais simples — encaminhamento UDP com
-prefixo de token e limites de taxa. Isso mantem o protocolo minimo e evita
-depender de servidores TURN externos.</li>
-<li><strong>Assinaturas em introducoes</strong>: cada <code>PunchIntro</code> e assinado pelo iniciador.
-Sem isso, um atacante poderia enviar introducoes forjadas para redirecionar as
-tentativas de hole-punch de um no para um endereco controlado pelo atacante
-(ataque de reflexao). A janela de timestamp de 30 segundos limita replay.</li>
-<li><strong>Tiers reciprocos de largura de banda</strong>: nos relay dao 4x mais largura de
-banda (256 vs 64 KB/s) para peers com boas pontuacoes de reciprocidade. Isso
-incentiva nos a armazenar fragmentos para outros — se voce contribui, recebe
-melhor servico de relay quando precisa.</li>
-<li><strong>Extensao Pong retrocompativel</strong>: novos campos NAT em <code>Pong</code> usam
-<code>#[serde(default)]</code> e <code>Option&lt;T&gt;</code>. Nos antigos que nao entendem esses campos
-simplesmente os pulam durante deserializacao. Nenhum bump de versao de
-protocolo necessario.</li>
-<li><strong>NatHandler como trait async</strong>: a logica de travessia NAT e injetada no
-engine DHT via trait, assim como <code>ReplicationHandler</code>. Isso mantem o engine
-DHT focado em roteamento e gerenciamento de peers, e permite que a
-implementacao NAT seja trocada ou desabilitada sem tocar no codigo core do
-DHT.</li>
-</ul>
-<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
-<ul>
-<li><strong>Fase 4 continuacao</strong> — tuning de performance (pooling de conexoes, cache de
-fragmentos, SQLite WAL), auditorias de seguranca, onboarding de nos
-institucionais, empacotamento para OS</li>
-<li><strong>Fase 5: Exploracao e Cultura</strong> — navegador publico de tesseras por
-era/localizacao/tema/idioma, curadoria institucional, integracao genealogica,
-exportacao para midia fisica (M-DISC, microfilme, papel livre de acido com QR)</li>
-</ul>
-<p>Com travessia de NAT, Tesseras pode conectar nos independentemente de sua
-topologia de rede. Nos publicos conversam diretamente. Nos com NAT Cone furam
-com ajuda de um introdutor. Nos com NAT Symmetric ou firewalled usam relay
-atraves de peers voluntarios. A rede se adapta ao mundo real, onde a maioria dos
-dispositivos esta atras de um NAT e as condicoes de rede mudam constantemente.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/phase4-nat-traversal/index.html.gz b/pt-br/news/phase4-nat-traversal/index.html.gz
deleted file mode 100644
index 6aa4bc7..0000000
--- a/pt-br/news/phase4-nat-traversal/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/phase4-performance-tuning/index.html b/pt-br/news/phase4-performance-tuning/index.html
deleted file mode 100644
index 528224d..0000000
--- a/pt-br/news/phase4-performance-tuning/index.html
+++ /dev/null
@@ -1,169 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Fase 4: Tuning de Performance — Tesseras</title>
- <meta name="description" content="SQLite em modo WAL com configuracao centralizada de pragmas, cache LRU de fragmentos, gerenciamento de ciclo de vida do pool de conexoes QUIC e otimizacao do hot path de atestacao.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Fase 4: Tuning de Performance">
- <meta property="og:description" content="SQLite em modo WAL com configuracao centralizada de pragmas, cache LRU de fragmentos, gerenciamento de ciclo de vida do pool de conexoes QUIC e otimizacao do hot path de atestacao.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Fase 4: Tuning de Performance">
- <meta name="twitter:description" content="SQLite em modo WAL com configuracao centralizada de pragmas, cache LRU de fragmentos, gerenciamento de ciclo de vida do pool de conexoes QUIC e otimizacao do hot path de atestacao.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-performance-tuning&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Fase 4: Tuning de Performance</h2>
- <p class="news-date">2026-02-15</p>
- <p>Uma rede P2P que atravessa NATs mas engasga com seu proprio I/O nao serve de
-muito. A Fase 4 continua com tuning de performance: centralizacao da
-configuracao do banco de dados, cache de blobs de fragmentos em memoria,
-gerenciamento de ciclo de vida de conexoes QUIC e eliminacao de leituras
-desnecessarias de disco no hot path de atestacao.</p>
-<p>O principio orientador foi o mesmo do resto do Tesseras: fazer a coisa mais
-simples que realmente funciona. Sem alocadores customizados, sem estruturas de
-dados lock-free, sem complexidade prematura. Um <code>StorageConfig</code> centralizado, um
-cache LRU, um reaper de conexoes e uma correcao pontual para evitar reler blobs
-que ja tinham checksum calculado.</p>
-<h2 id="o-que-foi-construido">O que foi construido</h2>
-<p><strong>Configuracao SQLite centralizada</strong> (<code>tesseras-storage/src/database.rs</code>) — Um
-novo struct <code>StorageConfig</code> e funcoes <code>open_database()</code> / <code>open_in_memory()</code> que
-aplicam todos os pragmas SQLite em um unico lugar: journal mode WAL, foreign
-keys, modo synchronous (NORMAL por padrao, FULL para hardware instavel como
-RPi + cartao SD), busy timeout, tamanho do cache de paginas e intervalo de
-autocheckpoint WAL. Anteriormente, cada ponto de chamada abria uma conexao e
-aplicava pragmas ad hoc. Agora o daemon, CLI e testes passam todos pelo mesmo
-caminho. 7 testes cobrindo foreign keys, busy timeout, journal mode, migracoes,
-modos synchronous e criacao de arquivos WAL em disco.</p>
-<p><strong>Cache LRU de fragmentos</strong> (<code>tesseras-storage/src/cache.rs</code>) — Um
-<code>CachedFragmentStore</code> que envolve qualquer <code>FragmentStore</code> com um cache LRU
-ciente de bytes. Blobs de fragmentos sao cacheados na leitura e invalidados na
-escrita ou exclusao. Quando o cache excede seu limite de bytes configurado, as
-entradas menos recentemente usadas sao removidas. O cache e transparente: ele
-proprio implementa <code>FragmentStore</code>, entao o resto da pilha nao sabe que esta la.
-Metricas Prometheus opcionais rastreiam hits, misses e uso atual de bytes. 3
-testes: hit no cache evita leitura interna, store invalida cache, remocao quando
-excede bytes maximos.</p>
-<p><strong>Metricas Prometheus de storage</strong> (<code>tesseras-storage/src/metrics.rs</code>) — Um
-struct <code>StorageMetrics</code> com tres contadores/gauges: <code>fragment_cache_hits</code>,
-<code>fragment_cache_misses</code> e <code>fragment_cache_bytes</code>. Registrado no registry
-Prometheus e conectado ao cache de fragmentos via <code>with_metrics()</code>.</p>
-<p><strong>Correcao do hot path de atestacao</strong> (<code>tesseras-replication/src/service.rs</code>) —
-O fluxo de atestacao anteriormente lia cada blob de fragmento do disco e
-recalculava seu checksum BLAKE3. Como <code>list_fragments()</code> ja retorna <code>FragmentId</code>
-com um checksum armazenado, a correcao e trivial: usar <code>frag.checksum</code> ao inves
-de <code>blake3::hash(&amp;data)</code>. Isso elimina uma leitura de disco por fragmento
-durante atestacao — para uma tessera com 100 fragmentos, sao 100 leituras a
-menos. Um teste com <code>expect_read_fragment().never()</code> verifica que nenhuma
-leitura de blob acontece durante atestacao.</p>
-<p><strong>Ciclo de vida do pool de conexoes QUIC</strong>
-(<code>tesseras-net/src/quinn_transport.rs</code>) — Um struct <code>PoolConfig</code> controlando
-maximo de conexoes, timeout de inatividade e intervalo do reaper.
-<code>PooledConnection</code> envolve cada <code>quinn::Connection</code> com um timestamp
-<code>last_used</code>. Quando o pool atinge capacidade maxima, a conexao inativa mais
-antiga e removida antes de abrir uma nova. Uma tarefa reaper em background
-(Tokio spawn) periodicamente fecha conexoes que ficaram inativas alem do
-timeout. 4 novas metricas de pool: <code>tesseras_conn_pool_size</code>, <code>pool_hits_total</code>,
-<code>pool_misses_total</code>, <code>pool_evictions_total</code>.</p>
-<p><strong>Integracao no daemon</strong> (<code>tesd/src/config.rs</code>, <code>main.rs</code>) — Uma nova secao
-<code>[performance]</code> na configuracao TOML com campos para tamanho de cache SQLite,
-modo synchronous, busy timeout, tamanho de cache de fragmentos, maximo de
-conexoes, timeout de inatividade e intervalo do reaper. O <code>main()</code> do daemon
-agora chama <code>open_database()</code> com o <code>StorageConfig</code> configurado, envolve
-<code>FsFragmentStore</code> com <code>CachedFragmentStore</code> e vincula QUIC com o <code>PoolConfig</code>
-configurado. A dependencia direta de <code>rusqlite</code> foi removida do crate do daemon.</p>
-<p><strong>Migracao do CLI</strong> (<code>tesseras-cli/src/commands/init.rs</code>, <code>create.rs</code>) — Ambos
-os comandos <code>init</code> e <code>create</code> agora usam <code>tesseras_storage::open_database()</code> com
-o <code>StorageConfig</code> padrao ao inves de abrir conexoes <code>rusqlite</code> diretamente. A
-dependencia de <code>rusqlite</code> foi removida do crate do CLI.</p>
-<h2 id="decisoes-de-arquitetura">Decisoes de arquitetura</h2>
-<ul>
-<li><strong>Padrao decorator para cache</strong>: <code>CachedFragmentStore</code> envolve
-<code>Box&lt;dyn FragmentStore&gt;</code> e implementa <code>FragmentStore</code> ele proprio. Isso
-significa que cache e opt-in, composavel e invisivel para consumidores. O
-daemon habilita; testes podem pular.</li>
-<li><strong>Remocao ciente de bytes</strong>: o cache LRU rastreia bytes totais, nao contagem
-de entradas. Blobs de fragmentos variam muito em tamanho (um fragmento de
-texto de 4KB vs um shard de foto de 2MB), entao contar entradas daria uma
-visao enganosa do uso de memoria.</li>
-<li><strong>Sem crate de pool de conexoes</strong>: ao inves de trazer uma biblioteca generica
-de pool, o pool de conexoes e um wrapper fino sobre
-<code>DashMap&lt;SocketAddr, PooledConnection&gt;</code> com um reaper Tokio. Conexoes QUIC sao
-multiplexadas, entao o "pool" e realmente sobre gerenciamento de ciclo de vida
-(limpeza de inativos, maximo de conexoes) e nao sobre emprestar/devolver.</li>
-<li><strong>Checksums armazenados ao inves de releituras</strong>: a correcao de atestacao e
-intencionalmente minima — uma linha alterada, uma leitura de disco removida
-por fragmento. Os checksums ja estavam armazenados no SQLite por
-<code>store_fragment()</code>, apenas nao estavam sendo usados.</li>
-<li><strong>Configuracao centralizada de pragmas</strong>: um unico struct <code>StorageConfig</code>
-substitui chamadas <code>PRAGMA</code> espalhadas. O flag <code>sqlite_synchronous_full</code>
-existe especificamente para implantacoes em Raspberry Pi onde o kernel pode
-crashar e perder transacoes WAL nao checkpointadas.</li>
-</ul>
-<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
-<ul>
-<li><strong>Fase 4 continuacao</strong> — Shamir's Secret Sharing para herdeiros, tesseras
-seladas (criptografia time-lock), auditorias de seguranca, onboarding de nos
-institucionais, deduplicacao de storage, empacotamento para OS</li>
-<li><strong>Fase 5: Exploracao e Cultura</strong> — navegador publico de tesseras por
-era/localizacao/tema/idioma, curadoria institucional, integracao genealogica,
-exportacao para midia fisica (M-DISC, microfilme, papel livre de acido com QR)</li>
-</ul>
-<p>Com tuning de performance implementado, Tesseras lida com o caso comum de forma
-eficiente: leituras de fragmentos acertam o cache LRU, atestacao pula I/O de
-disco, conexoes QUIC inativas sao removidas automaticamente e o SQLite e
-configurado consistentemente em toda a pilha. Os proximos passos focam em
-funcionalidades criptograficas (Shamir, time-lock) e hardening para implantacao
-em producao.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/phase4-performance-tuning/index.html.gz b/pt-br/news/phase4-performance-tuning/index.html.gz
deleted file mode 100644
index a0428ab..0000000
--- a/pt-br/news/phase4-performance-tuning/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/phase4-shamir-heir-recovery/index.html b/pt-br/news/phase4-shamir-heir-recovery/index.html
deleted file mode 100644
index d2df99f..0000000
--- a/pt-br/news/phase4-shamir-heir-recovery/index.html
+++ /dev/null
@@ -1,209 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Fase 4: Recuperação de Chaves por Herdeiros com Shamir&#x27;s Secret Sharing — Tesseras</title>
- <meta name="description" content="Tesseras agora permite dividir sua identidade criptográfica em fragmentos distribuídos a herdeiros de confiança — qualquer limiar deles pode reconstruir suas chaves, mas menos que isso não revela nada.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Fase 4: Recuperação de Chaves por Herdeiros com Shamir&#x27;s Secret Sharing">
- <meta property="og:description" content="Tesseras agora permite dividir sua identidade criptográfica em fragmentos distribuídos a herdeiros de confiança — qualquer limiar deles pode reconstruir suas chaves, mas menos que isso não revela nada.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Fase 4: Recuperação de Chaves por Herdeiros com Shamir&#x27;s Secret Sharing">
- <meta name="twitter:description" content="Tesseras agora permite dividir sua identidade criptográfica em fragmentos distribuídos a herdeiros de confiança — qualquer limiar deles pode reconstruir suas chaves, mas menos que isso não revela nada.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-shamir-heir-recovery&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Fase 4: Recuperação de Chaves por Herdeiros com Shamir&#x27;s Secret Sharing</h2>
- <p class="news-date">2026-02-15</p>
- <p>O que acontece com suas memórias quando você morre? Até agora, Tesseras
-conseguia preservar conteúdo ao longo de milênios — mas as chaves privadas e
-seladas morriam com o dono. A Fase 4 continua com uma solução: Shamir's Secret
-Sharing, um esquema criptográfico que permite dividir sua identidade em
-fragmentos e distribuí-los para as pessoas em quem você mais confia.</p>
-<p>A matemática é elegante: você escolhe um limiar T e um total N. Qualquer T
-fragmentos reconstroem o segredo completo; T-1 fragmentos não revelam
-absolutamente nada. Isso não é "quase nada" — é informação-teoricamente seguro.
-Um atacante com um fragmento a menos que o limiar tem exatamente zero bits de
-informação sobre o segredo, independentemente do poder computacional que tenha.</p>
-<h2 id="o-que-foi-construido">O que foi construído</h2>
-<p><strong>Aritmética de corpo finito GF(256)</strong> (<code>tesseras-crypto/src/shamir/gf256.rs</code>) —
-Shamir's Secret Sharing requer aritmética em um corpo finito. Implementamos
-GF(256) usando o mesmo polinômio irredutível do AES (x^8 + x^4 + x^3 + x + 1),
-com tabelas de lookup para logaritmo e exponenciação computadas em tempo de
-compilação. Todas as operações são em tempo constante via consulta a tabelas —
-sem ramificações baseadas em dados secretos. O módulo inclui o método de Horner
-para avaliação de polinômios e interpolação de Lagrange em x=0 para recuperação
-do segredo. 233 linhas, exaustivamente testado: todos os 256 elementos para
-propriedades de identidade/inverso, comutatividade e associatividade.</p>
-<p><strong>ShamirSplitter</strong> (<code>tesseras-crypto/src/shamir/mod.rs</code>) — A API principal de
-split/reconstruct. <code>split()</code> recebe uma fatia de bytes do segredo, uma
-configuração (limiar T, total N) e a chave pública Ed25519 do dono. Para cada
-byte do segredo, constrói um polinômio aleatório de grau T-1 sobre GF(256) com o
-byte do segredo como termo constante, e então o avalia em N pontos distintos.
-<code>reconstruct()</code> recebe T ou mais fragmentos e recupera o segredo via
-interpolação de Lagrange. Ambas as operações incluem validação extensiva:
-limites do limiar, consistência de sessão, correspondência de impressão digital
-do dono e verificação de checksum BLAKE3.</p>
-<p><strong>Formato HeirShare</strong> — Cada fragmento é um artefato autocontido e serializável
-com:</p>
-<ul>
-<li>Versão do formato (v1) para compatibilidade futura</li>
-<li>Índice do fragmento (1..N) e metadados de limiar/total</li>
-<li>ID de sessão (8 bytes aleatórios) — impede mistura de fragmentos de sessões
-diferentes</li>
-<li>Impressão digital do dono (primeiros 8 bytes do hash BLAKE3 da chave pública
-Ed25519)</li>
-<li>Dados do fragmento (os y-values de Shamir, mesmo comprimento do segredo)</li>
-<li>Checksum BLAKE3 sobre todos os campos anteriores</li>
-</ul>
-<p>Os fragmentos são serializados em dois formatos: <strong>MessagePack</strong> (binário
-compacto, para uso programático) e <strong>texto base64</strong> (legível por humanos, para
-impressão e armazenamento físico). O formato texto inclui um cabeçalho com
-metadados e delimitadores:</p>
-<pre><code>--- TESSERAS HEIR SHARE ---
-Format: v1
-Owner: a1b2c3d4e5f6a7b8 (fingerprint)
-Share: 1 of 3 (threshold: 2)
-Session: 9f8e7d6c5b4a3210
-Created: 2026-02-15
-
-&lt;dados MessagePack codificados em base64&gt;
---- END HEIR SHARE ---
-</code></pre>
-<p>Este formato é projetado para ser impresso em papel, armazenado em um cofre
-bancário ou gravado em metal. O cabeçalho é informacional — apenas o payload
-base64 é analisado durante a reconstrução.</p>
-<p><strong>Integração com CLI</strong> (<code>tesseras-cli/src/commands/heir.rs</code>) — Três novos
-subcomandos:</p>
-<ul>
-<li><code>tes heir create</code> — divide sua identidade Ed25519 em fragmentos de herdeiros.
-Solicita confirmação (sua identidade completa está em jogo), gera arquivos
-<code>.bin</code> e <code>.txt</code> para cada fragmento e escreve <code>heir_meta.json</code> no diretório de
-identidade.</li>
-<li><code>tes heir reconstruct</code> — carrega arquivos de fragmentos (detecta
-automaticamente formato binário vs texto), valida consistência, reconstrói o
-segredo, deriva o par de chaves Ed25519 e opcionalmente o instala em
-<code>~/.tesseras/identity/</code> (com backup automático da identidade existente).</li>
-<li><code>tes heir info</code> — exibe metadados do fragmento e verifica o checksum sem expor
-nenhum material secreto.</li>
-</ul>
-<p><strong>Formato do blob secreto</strong> — As chaves de identidade são serializadas em um
-blob versionado antes da divisão: um byte de versão (0x01), um byte de flags
-(0x00 para somente Ed25519), seguido da chave secreta Ed25519 de 32 bytes. Isso
-deixa espaço para expansão futura quando as chaves privadas X25519 e ML-KEM-768
-forem integradas ao sistema de fragmentos de herdeiros.</p>
-<p><strong>Testes</strong> — 20 testes unitários para ShamirSplitter (roundtrip, todas as
-combinações de fragmentos, fragmentos insuficientes, dono errado, sessão errada,
-limite threshold-1, segredos grandes até o tamanho de chave ML-KEM-768). 7
-testes unitários para aritmética GF(256) (propriedades de campo exaustivas). 3
-testes baseados em propriedades com proptest (segredos arbitrários até 5000
-bytes, configurações T-de-N arbitrárias, verificação de segurança
-informação-teórica). Testes de roundtrip de serialização para ambos os formatos
-MessagePack e texto base64. 2 testes de integração cobrindo o ciclo de vida
-completo de herdeiros: gerar identidade, dividir em fragmentos, serializar,
-desserializar, reconstruir, verificar par de chaves e assinar/verificar com
-chaves reconstruídas.</p>
-<h2 id="decisoes-de-arquitetura">Decisões de arquitetura</h2>
-<ul>
-<li><strong>GF(256) ao invés de GF(primo)</strong>: usamos GF(256) ao invés de um corpo primo
-porque ele mapeia naturalmente para bytes — cada elemento é um único byte,
-cada fragmento tem o mesmo comprimento do segredo. Sem aritmética de inteiros
-grandes, sem redução modular, sem padding. Esta é a mesma abordagem usada pela
-maioria das implementações reais de Shamir, incluindo SSSS e Hashicorp Vault.</li>
-<li><strong>Tabelas de lookup em tempo de compilação</strong>: as tabelas LOG e EXP para
-GF(256) são computadas em tempo de compilação usando <code>const fn</code>. Isso
-significa zero custo de inicialização em tempo de execução e operações em
-tempo constante via consulta a tabelas ao invés de loops.</li>
-<li><strong>ID de sessão previne mistura entre sessões</strong>: cada chamada a <code>split()</code> gera
-um novo ID de sessão aleatório. Se um herdeiro acidentalmente usar fragmentos
-de duas sessões diferentes de divisão (por exemplo, antes e depois de uma
-rotação de chaves), a reconstrução falha de forma limpa com um erro de
-validação ao invés de produzir dados corrompidos.</li>
-<li><strong>Checksums BLAKE3 detectam corrupção</strong>: cada fragmento inclui um checksum
-BLAKE3 sobre seu conteúdo. Isso captura degradação de bits, erros de
-transmissão e truncamento acidental antes de qualquer tentativa de
-reconstrução. Um fragmento impresso em papel e escaneado via OCR vai falhar no
-checksum se um único caractere estiver errado.</li>
-<li><strong>Impressão digital do dono para identificação</strong>: os fragmentos incluem os
-primeiros 8 bytes de BLAKE3(chave pública Ed25519) como impressão digital.
-Isso permite aos herdeiros verificar a qual identidade um fragmento pertence
-sem revelar a chave pública completa. Durante a reconstrução, a impressão
-digital é verificada contra a chave recuperada.</li>
-<li><strong>Formato duplo para resiliência</strong>: ambos os formatos binário (MessagePack) e
-texto (base64) são gerados porque mídias físicas têm modos de falha diferentes
-de armazenamento digital. Um pendrive pode falhar; papel sobrevive. Um QR code
-pode ficar ilegível; texto base64 pode ser digitado manualmente.</li>
-<li><strong>Versionamento do blob</strong>: o segredo é envolvido em um blob versionado
-(versão + flags + material de chave) para que versões futuras possam incluir
-chaves adicionais (X25519, ML-KEM-768) sem quebrar compatibilidade com
-fragmentos existentes.</li>
-</ul>
-<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
-<ul>
-<li><strong>Fase 4 continuada: Resiliência e Escala</strong> — NAT traversal avançado
-(STUN/TURN), ajuste de performance (pool de conexões, cache de fragmentos,
-SQLite WAL), auditorias de segurança, integração de nós institucionais,
-empacotamento para sistemas operacionais</li>
-<li><strong>Fase 5: Exploração e Cultura</strong> — navegador público de tesseras por
-era/localização/tema/idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)</li>
-</ul>
-<p>Com Shamir's Secret Sharing, Tesseras fecha a última lacuna crítica na
-preservação a longo prazo. Suas memórias sobrevivem a falhas de infraestrutura
-através de erasure coding. Sua privacidade sobrevive a computadores quânticos
-através de criptografia híbrida. E agora, sua identidade sobrevive a você —
-passada adiante para as pessoas que você escolheu, exigindo a cooperação delas
-para desbloquear o que você deixou para trás.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/phase4-shamir-heir-recovery/index.html.gz b/pt-br/news/phase4-shamir-heir-recovery/index.html.gz
deleted file mode 100644
index cebcabc..0000000
--- a/pt-br/news/phase4-shamir-heir-recovery/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/phase4-storage-deduplication/index.html b/pt-br/news/phase4-storage-deduplication/index.html
deleted file mode 100644
index e927cfb..0000000
--- a/pt-br/news/phase4-storage-deduplication/index.html
+++ /dev/null
@@ -1,229 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Fase 4: Deduplicacao de Armazenamento — Tesseras</title>
- <meta name="description" content="Uma nova camada de armazenamento enderecavel por conteudo elimina dados duplicados entre tesseras, reduzindo uso de disco e habilitando coleta de lixo automatica.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Fase 4: Deduplicacao de Armazenamento">
- <meta property="og:description" content="Uma nova camada de armazenamento enderecavel por conteudo elimina dados duplicados entre tesseras, reduzindo uso de disco e habilitando coleta de lixo automatica.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Fase 4: Deduplicacao de Armazenamento">
- <meta name="twitter:description" content="Uma nova camada de armazenamento enderecavel por conteudo elimina dados duplicados entre tesseras, reduzindo uso de disco e habilitando coleta de lixo automatica.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-storage-deduplication&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Fase 4: Deduplicacao de Armazenamento</h2>
- <p class="news-date">2026-02-15</p>
- <p>Quando multiplas tesseras compartilham a mesma foto, o mesmo clipe de audio ou
-os mesmos dados de fragmento, a camada de armazenamento antiga mantinha copias
-separadas de cada. Em um no armazenando milhares de tesseras para a rede, essa
-duplicacao se acumula rapidamente. A Fase 4 continua com deduplicacao de
-armazenamento: um armazenamento enderecavel por conteudo (CAS) que garante que
-cada dado unico seja armazenado exatamente uma vez em disco, independentemente
-de quantas tesseras o referenciam.</p>
-<p>O design e simples e comprovado: hash do conteudo com BLAKE3, usar o hash como
-nome do arquivo e manter uma contagem de referencias no SQLite. Quando duas
-tesseras incluem a mesma foto de 5 MB, um arquivo existe em disco com
-refcount 2. Quando uma tessera e deletada, o refcount cai para 1 e o arquivo
-permanece. Quando a ultima referencia e liberada, uma varredura periodica limpa
-o orfao.</p>
-<h2 id="o-que-foi-construido">O que foi construido</h2>
-<p><strong>Migracao do esquema CAS</strong> (<code>tesseras-storage/migrations/004_dedup.sql</code>) — Tres
-novas tabelas:</p>
-<ul>
-<li><code>cas_objects</code> — rastreia cada objeto no armazenamento: hash BLAKE3 (chave
-primaria), tamanho em bytes, contagem de referencias e timestamp de criacao</li>
-<li><code>blob_refs</code> — mapeia identificadores logicos de blobs (hash da tessera + hash
-da memoria + nome do arquivo) para hashes CAS, substituindo a convencao antiga
-de caminhos no sistema de arquivos</li>
-<li><code>fragment_refs</code> — mapeia identificadores logicos de fragmentos (hash da
-tessera + indice do fragmento) para hashes CAS, substituindo o antigo layout
-do diretorio <code>fragments/</code></li>
-</ul>
-<p>Indices nas colunas de hash garantem lookups O(1) durante leituras e contagem de
-referencias.</p>
-<p><strong>CasStore</strong> (<code>tesseras-storage/src/cas.rs</code>) — O motor central de armazenamento
-enderecavel por conteudo. Arquivos sao armazenados sob um diretorio de prefixo
-de dois niveis: <code>&lt;raiz&gt;/&lt;prefixo-hex-2-chars&gt;/&lt;hash-completo&gt;.blob</code>. O
-armazenamento fornece cinco operacoes:</p>
-<ul>
-<li><code>put(hash, data)</code> — escreve dados em disco se ainda nao presente, incrementa o
-refcount. Retorna se ocorreu um hit de deduplicacao.</li>
-<li><code>get(hash)</code> — le dados do disco pelo hash</li>
-<li><code>release(hash)</code> — decrementa o refcount. Se chegar a zero, o arquivo em disco
-e deletado imediatamente.</li>
-<li><code>contains(hash)</code> — verifica existencia sem ler</li>
-<li><code>ref_count(hash)</code> — retorna a contagem de referencias atual</li>
-</ul>
-<p>Todas as operacoes sao atomicas dentro de uma unica transacao SQLite. O refcount
-e a fonte de verdade — se o refcount diz que o objeto existe, o arquivo deve
-estar em disco.</p>
-<p><strong>FsBlobStore com CAS</strong> (<code>tesseras-storage/src/blob.rs</code>) — Reescrito para
-delegar todo armazenamento ao CAS. Quando um blob e escrito, seu hash BLAKE3 e
-computado e passado para <code>cas.put()</code>. Uma linha em <code>blob_refs</code> mapeia o caminho
-logico (tessera + memoria + arquivo) para o hash CAS. Leituras buscam o hash CAS
-via <code>blob_refs</code> e leem de <code>cas.get()</code>. Deletar uma tessera libera todas as suas
-referencias de blob em uma unica transacao.</p>
-<p><strong>FsFragmentStore com CAS</strong> (<code>tesseras-storage/src/fragment.rs</code>) — Mesmo padrao
-para fragmentos codificados com erasure coding. O checksum BLAKE3 de cada
-fragmento ja e computado durante a codificacao Reed-Solomon, entao e usado
-diretamente como chave CAS. A verificacao de fragmentos agora checa o hash CAS
-ao inves de recomputar do zero — se o CAS diz que os dados estao intactos,
-estao.</p>
-<p><strong>Coletor de lixo sweep</strong> (<code>cas.rs:sweep()</code>) — Uma passagem periodica de GC que
-trata tres casos limite que o caminho normal de refcount nao consegue:</p>
-<ol>
-<li><strong>Arquivos orfaos</strong> — arquivos em disco sem linha correspondente em
-<code>cas_objects</code>. Pode acontecer apos um crash durante escrita. Arquivos com
-menos de 1 hora sao pulados (periodo de graca para escritas em andamento);
-orfaos mais antigos sao deletados.</li>
-<li><strong>Refcounts vazados</strong> — linhas em <code>cas_objects</code> com refcount zero que nao
-foram limpas (ex: se o processo morreu entre decrementar e deletar). Essas
-linhas sao removidas.</li>
-<li><strong>Idempotente</strong> — executar sweep duas vezes produz o mesmo resultado.</li>
-</ol>
-<p>O sweep e conectado ao loop de reparo existente em <code>tesseras-replication</code>, entao
-roda automaticamente a cada 24 horas junto com as verificacoes de saude dos
-fragmentos.</p>
-<p><strong>Migracao do layout antigo</strong> (<code>tesseras-storage/src/migration.rs</code>) — Uma
-estrategia de migracao copy-first que move dados do layout antigo baseado em
-diretorios (<code>blobs/&lt;tessera&gt;/&lt;memoria&gt;/&lt;arquivo&gt;</code> e
-<code>fragments/&lt;tessera&gt;/&lt;indice&gt;.shard</code>) para o CAS. A migracao:</p>
-<ol>
-<li>Verifica a versao de armazenamento em <code>storage_meta</code> (versao 1 = layout
-antigo, versao 2 = CAS)</li>
-<li>Percorre os diretorios antigos <code>blobs/</code> e <code>fragments/</code></li>
-<li>Computa hashes BLAKE3 e insere no CAS via <code>put()</code> — duplicatas sao
-automaticamente deduplicadas</li>
-<li>Cria entradas correspondentes em <code>blob_refs</code> / <code>fragment_refs</code></li>
-<li>Remove diretorios antigos somente apos todos os dados estarem seguros no CAS</li>
-<li>Atualiza a versao de armazenamento para 2</li>
-</ol>
-<p>A migracao roda na inicializacao do daemon, e idempotente (segura para
-re-executar) e reporta estatisticas: arquivos migrados, duplicatas encontradas,
-bytes economizados.</p>
-<p><strong>Metricas Prometheus</strong> (<code>tesseras-storage/src/metrics.rs</code>) — Dez novas metricas
-para observabilidade:</p>
-<table><thead><tr><th>Metrica</th><th>Descricao</th></tr></thead><tbody>
-<tr><td><code>cas_objects_total</code></td><td>Total de objetos unicos no CAS</td></tr>
-<tr><td><code>cas_bytes_total</code></td><td>Total de bytes armazenados</td></tr>
-<tr><td><code>cas_dedup_hits_total</code></td><td>Numero de escritas que encontraram um objeto existente</td></tr>
-<tr><td><code>cas_bytes_saved_total</code></td><td>Bytes economizados por deduplicacao</td></tr>
-<tr><td><code>cas_gc_refcount_deletions_total</code></td><td>Objetos deletados quando refcount chegou a zero</td></tr>
-<tr><td><code>cas_gc_sweep_orphans_cleaned_total</code></td><td>Arquivos orfaos removidos pelo sweep</td></tr>
-<tr><td><code>cas_gc_sweep_leaked_refs_cleaned_total</code></td><td>Linhas de refcount vazadas limpas</td></tr>
-<tr><td><code>cas_gc_sweep_skipped_young_total</code></td><td>Orfaos jovens pulados (periodo de graca)</td></tr>
-<tr><td><code>cas_gc_sweep_duration_seconds</code></td><td>Tempo gasto no sweep GC</td></tr>
-</tbody></table>
-<p><strong>Testes baseados em propriedades</strong> — Dois testes proptest verificam invariantes
-do CAS sob entradas aleatorias:</p>
-<ul>
-<li><code>refcount_matches_actual_refs</code> — apos N operacoes aleatorias de put/release, o
-refcount sempre corresponde ao numero real de referencias pendentes</li>
-<li><code>cas_path_is_deterministic</code> — o mesmo hash sempre produz o mesmo caminho no
-sistema de arquivos</li>
-</ul>
-<p><strong>Atualizacao de testes de integracao</strong> — Todos os testes de integracao em
-<code>tesseras-core</code>, <code>tesseras-replication</code>, <code>tesseras-embedded</code> e <code>tesseras-cli</code>
-atualizados para os novos construtores com CAS. Testes de deteccao de
-adulteracao atualizados para funcionar com o layout de diretorio CAS.</p>
-<p>347 testes passam em todo o workspace. Clippy limpo com <code>-D warnings</code>.</p>
-<h2 id="decisoes-de-arquitetura">Decisoes de arquitetura</h2>
-<ul>
-<li><strong>BLAKE3 como chave CAS</strong>: o hash de conteudo que ja computamos para
-verificacao de integridade serve tambem como chave de deduplicacao. Nenhuma
-etapa adicional de hashing — o hash computado durante <code>create</code> ou <code>replicate</code>
-e reutilizado como endereco CAS.</li>
-<li><strong>Refcount SQLite ao inves de reflinks do sistema de arquivos</strong>: consideramos
-usar copy-on-write no nivel do sistema de arquivos (reflinks em btrfs/XFS),
-mas isso amarraria o Tesseras a sistemas de arquivos especificos. Refcounting
-em SQLite funciona em qualquer sistema de arquivos, incluindo FAT32 em
-pendrives baratos e ext4 em Raspberry Pis.</li>
-<li><strong>Diretorios de prefixo hexadecimal de dois niveis</strong>: armazenar todos os
-objetos CAS em um diretorio plano desaceleraria sistemas de arquivos com
-milhoes de entradas. A divisao <code>&lt;prefixo 2 chars&gt;/</code> limita qualquer diretorio
-individual a ~65k entradas antes de um segundo nivel ser necessario. Isso
-segue a abordagem usada pelo object store do Git.</li>
-<li><strong>Periodo de graca para arquivos orfaos</strong>: o sweep GC pula arquivos com menos
-de 1 hora para evitar deletar objetos sendo escritos por uma operacao
-concorrente. Esta e uma escolha pragmatica — troca uma pequena janela de
-potenciais orfaos por seguranca contra crashes sem exigir fsync ou commit de
-duas fases.</li>
-<li><strong>Migracao copy-first</strong>: a migracao copia dados para o CAS antes de remover
-diretorios antigos. Se o processo for interrompido, os dados antigos
-permanecem intactos e a migracao pode ser re-executada. Isso e mais lento que
-mover arquivos mas garante zero perda de dados.</li>
-<li><strong>Sweep no loop de reparo</strong>: ao inves de adicionar um timer separado de GC, o
-sweep CAS aproveita o loop de reparo existente de 24 horas. Isso mantem o
-daemon simples — um unico ciclo de manutencao em segundo plano cuida tanto da
-saude dos fragmentos quanto da limpeza de armazenamento.</li>
-</ul>
-<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
-<ul>
-<li><strong>Fase 4 continuacao</strong> — auditorias de seguranca, empacotamento para OS
-(Alpine, Arch, Debian, OpenBSD, FreeBSD)</li>
-<li><strong>Fase 5: Exploracao e Cultura</strong> — navegador publico de tesseras por
-era/localizacao/tema/idioma, curadoria institucional, integracao genealogica
-(FamilySearch, Ancestry), exportacao para midia fisica (M-DISC, microfilme,
-papel livre de acido com QR), contexto assistido por IA</li>
-</ul>
-<p>A deduplicacao de armazenamento completa a historia de eficiencia de
-armazenamento do Tesseras. Um no que armazena fragmentos para milhares de
-usuarios — comum para nos institucionais e nos completos sempre ligados — agora
-paga o custo de disco apenas por dados unicos. Combinado com codificacao de
-apagamento Reed-Solomon (que ja minimiza redundancia no nivel da rede), o
-sistema alcanca armazenamento eficiente tanto nas camadas local quanto
-distribuida.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/phase4-storage-deduplication/index.html.gz b/pt-br/news/phase4-storage-deduplication/index.html.gz
deleted file mode 100644
index 5e8ad15..0000000
--- a/pt-br/news/phase4-storage-deduplication/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/phase4-wasm-browser-verification/index.html b/pt-br/news/phase4-wasm-browser-verification/index.html
deleted file mode 100644
index da4605b..0000000
--- a/pt-br/news/phase4-wasm-browser-verification/index.html
+++ /dev/null
@@ -1,199 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Fase 4: Verificar Sem Instalar Nada — Tesseras</title>
- <meta name="description" content="Tesseras agora compila para WebAssembly — qualquer pessoa pode verificar integridade e autenticidade de uma tessera diretamente no navegador, sem instalar nenhum software.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Fase 4: Verificar Sem Instalar Nada">
- <meta property="og:description" content="Tesseras agora compila para WebAssembly — qualquer pessoa pode verificar integridade e autenticidade de uma tessera diretamente no navegador, sem instalar nenhum software.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Fase 4: Verificar Sem Instalar Nada">
- <meta name="twitter:description" content="Tesseras agora compila para WebAssembly — qualquer pessoa pode verificar integridade e autenticidade de uma tessera diretamente no navegador, sem instalar nenhum software.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;phase4-wasm-browser-verification&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Fase 4: Verificar Sem Instalar Nada</h2>
- <p class="news-date">2026-02-15</p>
- <p>Confiança não deveria exigir instalação de software. Se alguém te envia uma
-tessera — um pacote de memórias preservadas — você deveria poder verificar que é
-genuína e não foi modificada sem baixar um app, criar uma conta, ou confiar em
-um servidor. É isso que o <code>tesseras-wasm</code> entrega: arraste um arquivo tessera
-para uma página web, e a verificação criptográfica acontece inteiramente no seu
-navegador.</p>
-<h2 id="o-que-foi-construido">O que foi construído</h2>
-<p><strong>tesseras-wasm</strong> — Um crate Rust que compila para WebAssembly via wasm-pack,
-expondo quatro funções stateless para JavaScript. O crate depende do
-<code>tesseras-core</code> para parsing do manifesto e chama primitivas criptográficas
-diretamente (blake3, ed25519-dalek) ao invés de depender do <code>tesseras-crypto</code>,
-que puxa bibliotecas pós-quânticas baseadas em C que não compilam para
-<code>wasm32-unknown-unknown</code>.</p>
-<p><code>parse_manifest</code> recebe os bytes brutos do MANIFEST (texto UTF-8 plano, não
-MessagePack), delega para <code>tesseras_core::manifest::Manifest::parse()</code>, e
-retorna uma string JSON com a chave pública Ed25519 do criador, caminhos dos
-arquivos de assinatura, e uma lista de arquivos com seus hashes BLAKE3
-esperados, tamanhos e tipos MIME. Structs internas (<code>ManifestJson</code>,
-<code>CreatorPubkey</code>, <code>SignatureFiles</code>, <code>FileEntry</code>) são serializadas com serde_json.
-Os campos de chave pública ML-DSA e arquivo de assinatura estão presentes no
-contrato JSON mas definidos como <code>null</code> — prontos para quando a assinatura
-pós-quântica for implementada no lado nativo.</p>
-<p><code>hash_blake3</code> computa um hash BLAKE3 de bytes arbitrários e retorna uma string
-hexadecimal de 64 caracteres. É chamada uma vez por arquivo na tessera para
-verificar integridade contra o MANIFEST.</p>
-<p><code>verify_ed25519</code> recebe uma mensagem, uma assinatura de 64 bytes e uma chave
-pública de 32 bytes, constrói uma <code>ed25519_dalek::VerifyingKey</code>, e retorna se a
-assinatura é válida. A validação de comprimento retorna erros descritivos
-("Ed25519 public key must be 32 bytes") ao invés de causar panic.</p>
-<p><code>verify_ml_dsa</code> é um stub que retorna um erro explicando que verificação ML-DSA
-ainda não está disponível. Isso é deliberado: o crate <code>ml-dsa</code> no crates.io está
-na v0.1.0-rc.7 (pré-release), e o <code>tesseras-crypto</code> usa <code>pqcrypto-dilithium</code>
-(CRYSTALS-Dilithium baseado em C) que é incompatível em nível de bytes com FIPS
-204 ML-DSA. Ambos os lados precisam usar a mesma implementação em Rust puro
-antes que a verificação cruzada funcione. Verificação Ed25519 é suficiente —
-toda tessera é assinada com Ed25519.</p>
-<p>Todas as quatro funções usam um padrão de duas camadas para testabilidade:
-funções internas retornam <code>Result&lt;T, String&gt;</code> e são testadas nativamente,
-enquanto wrappers finos <code>#[wasm_bindgen]</code> convertem erros para <code>JsError</code>. Isso
-evita que <code>JsError::new()</code> cause panic em targets não-WASM durante os testes.</p>
-<p>O binário WASM compilado tem 109 KB bruto e 44 KB com gzip — bem abaixo do
-orçamento de 200 KB. O wasm-opt aplica otimização <code>-Oz</code> após o wasm-pack
-compilar com <code>opt-level = "z"</code>, LTO e uma única unidade de codegen.</p>
-<p><strong>@tesseras/verify</strong> — Um pacote npm TypeScript (<code>crates/tesseras-wasm/js/</code>) que
-orquestra a verificação no lado do navegador. A API pública é uma única função:</p>
-<pre><code data-lang="typescript">async function verifyTessera(
- archive: Uint8Array,
- onProgress?: (current: number, total: number, file: string) =&gt; void
-): Promise&lt;VerificationResult&gt;
-</code></pre>
-<p>O tipo <code>VerificationResult</code> fornece tudo que uma UI precisa: validade geral,
-hash da tessera, chaves públicas do criador, status das assinaturas
-(valid/invalid/missing para Ed25519 e ML-DSA), resultados de integridade por
-arquivo com hashes esperados e reais, uma lista de arquivos inesperados não
-presentes no MANIFEST, e um array de erros.</p>
-<p>A descompactação de arquivos (<code>unpack.ts</code>) lida com três formatos: tar
-comprimido com gzip (detectado pelos magic bytes <code>\x1f\x8b</code>, descomprimido com
-fflate e depois parseado como tar), ZIP (magic <code>PK\x03\x04</code>, descompactado com
-<code>unzipSync</code> do fflate), e tar bruto (<code>ustar</code> no offset 257). Uma função
-<code>normalizePath</code> remove o prefixo <code>tessera-&lt;hash&gt;/</code> para que os caminhos internos
-correspondam às entradas do MANIFEST.</p>
-<p>A verificação roda em um Web Worker (<code>worker.ts</code>) para manter a thread da UI
-responsiva. O worker inicializa o módulo WASM, descompacta o arquivo, parseia o
-MANIFEST, verifica a assinatura Ed25519 contra a chave pública do criador,
-depois faz hash de cada arquivo com BLAKE3 e compara com os valores esperados.
-Mensagens de progresso são transmitidas de volta para a thread principal após
-cada arquivo. Se qualquer assinatura é inválida, a verificação para
-imediatamente sem fazer hash dos arquivos — falhando rápido na verificação mais
-crítica.</p>
-<p>O arquivo é transferido para o worker com zero-copy
-(<code>worker.postMessage({ type: "verify", archive }, [archive.buffer])</code>) para
-evitar duplicar arquivos de tessera potencialmente grandes na memória.</p>
-<p><strong>Pipeline de build</strong> — Três novos targets no justfile: <code>wasm-build</code> executa
-wasm-pack com <code>--target web --release</code> e otimiza com wasm-opt; <code>wasm-size</code>
-reporta o tamanho do binário bruto e com gzip; <code>test-wasm</code> executa a suíte de
-testes nativos.</p>
-<p><strong>Testes</strong> — 9 testes unitários nativos cobrem hashing BLAKE3 (entrada vazia,
-valor conhecido), verificação Ed25519 (assinatura válida, assinatura inválida,
-chave errada, comprimento de chave inválido), e parsing do MANIFEST (manifesto
-válido, UTF-8 inválido, lixo). 3 testes de integração WASM rodam em Chrome
-headless via <code>wasm-pack test --headless --chrome</code>, verificando que
-<code>hash_blake3</code>, <code>verify_ed25519</code> e <code>parse_manifest</code> funcionam corretamente quando
-compilados para <code>wasm32-unknown-unknown</code>.</p>
-<h2 id="decisoes-de-arquitetura">Decisões de arquitetura</h2>
-<ul>
-<li><strong>Sem dependência do tesseras-crypto</strong>: o crate WASM chama blake3 e
-ed25519-dalek diretamente. O <code>tesseras-crypto</code> depende do <code>pqcrypto-kyber</code>
-(ML-KEM baseado em C via pqcrypto-traits) que requer um toolchain de
-compilador C e não tem target wasm32. Dependendo apenas de crates Rust puros,
-o build WASM tem zero dependências C e compila sem problemas para WebAssembly.</li>
-<li><strong>ML-DSA adiado, não fingido</strong>: ao invés de silenciosamente pular a
-verificação pós-quântica, o stub retorna um erro explícito. Isso garante que
-se uma tessera contiver uma assinatura ML-DSA, o resultado da verificação
-reportará <code>ml_dsa: "missing"</code> ao invés de fingir que foi verificada. O
-orquestrador JS lida com isso graciosamente — uma tessera é válida se Ed25519
-passar e ML-DSA estiver ausente (ainda não implementado em nenhum dos lados).</li>
-<li><strong>Padrão de função interna</strong>: <code>JsError</code> não pode ser construído em targets
-não-WASM (causa panic). Dividir cada função em
-<code>foo_inner() -&gt; Result&lt;T, String&gt;</code> e <code>foo() -&gt; Result&lt;T, JsError&gt;</code> permite que
-a suíte de testes nativa exercite toda a lógica sem tocar em tipos JavaScript.
-Os testes de integração WASM em Chrome headless testam a superfície completa
-do <code>#[wasm_bindgen]</code>.</li>
-<li><strong>Isolamento em Web Worker</strong>: operações criptográficas (especialmente BLAKE3
-sobre arquivos de mídia grandes) podem levar centenas de milissegundos. Rodar
-em um Worker previne travamentos na UI. O protocolo de progresso com streaming
-(<code>{ type: "progress", current, total, file }</code>) permite que a UI mostre uma
-barra de progresso durante a verificação de tesseras com muitos arquivos.</li>
-<li><strong>Transferência zero-copy</strong>: <code>archive.buffer</code> é transferido para o Worker, não
-copiado. Para um arquivo tessera de 50 MB, isso evita dobrar o uso de memória
-durante a verificação.</li>
-<li><strong>MANIFEST em texto plano, não MessagePack</strong>: o crate WASM parseia o mesmo
-formato de MANIFEST em texto plano que o CLI. Isso é por design — o MANIFEST é
-a Pedra de Rosetta da tessera, legível por qualquer pessoa com um editor de
-texto. A dependência <code>rmp-serde</code> no Cargo.toml não é usada e será removida.</li>
-</ul>
-<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2>
-<ul>
-<li><strong>Fase 4: Resiliência e Escala</strong> — Empacotamento para sistemas operacionais
-(Alpine, Arch, Debian, FreeBSD, OpenBSD), CI no SourceHut e GitHub Actions,
-auditorias de segurança, explorador de tesseras no navegador em tesseras.net
-usando @tesseras/verify</li>
-<li><strong>Fase 5: Exploração e Cultura</strong> — Navegador público de tesseras por
-era/localização/tema/idioma, curadoria institucional, integração com
-genealogia, exportação para mídia física (M-DISC, microfilme, papel livre de
-ácido com QR)</li>
-</ul>
-<p>A verificação não exige mais confiança em software. Um arquivo tessera arrastado
-para um navegador é verificado com o mesmo rigor criptográfico do CLI — mesmos
-hashes BLAKE3, mesmas assinaturas Ed25519, mesmo parser de MANIFEST. A diferença
-é que agora qualquer pessoa pode fazer isso.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/phase4-wasm-browser-verification/index.html.gz b/pt-br/news/phase4-wasm-browser-verification/index.html.gz
deleted file mode 100644
index 9b90534..0000000
--- a/pt-br/news/phase4-wasm-browser-verification/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/news/reed-solomon/index.html b/pt-br/news/reed-solomon/index.html
deleted file mode 100644
index 8947909..0000000
--- a/pt-br/news/reed-solomon/index.html
+++ /dev/null
@@ -1,210 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Reed-Solomon: Como o Tesseras Sobrevive à Perda de Dados — Tesseras</title>
- <meta name="description" content="Um mergulho profundo na codificação de apagamento Reed-Solomon — o que é, por que o Tesseras a utiliza e os desafios de manter memórias vivas ao longo dos séculos.">
- <!-- Open Graph -->
- <meta property="og:type" content="article">
- <meta property="og:title" content="Reed-Solomon: Como o Tesseras Sobrevive à Perda de Dados">
- <meta property="og:description" content="Um mergulho profundo na codificação de apagamento Reed-Solomon — o que é, por que o Tesseras a utiliza e os desafios de manter memórias vivas ao longo dos séculos.">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Reed-Solomon: Como o Tesseras Sobrevive à Perda de Dados">
- <meta name="twitter:description" content="Um mergulho profundo na codificação de apagamento Reed-Solomon — o que é, por que o Tesseras a utiliza e os desafios de manter memórias vivas ao longo dos séculos.">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;reed-solomon&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Reed-Solomon: Como o Tesseras Sobrevive à Perda de Dados</h2>
- <p class="news-date">2026-02-14</p>
- <p>Seu disco rígido vai morrer. Seu provedor de nuvem vai pivotar. O array RAID no
-seu armário vai sobreviver ao controlador, mas não ao dono. Se uma memória está
-armazenada em exatamente um lugar, ela tem exatamente uma forma de se perder
-para sempre.</p>
-<p>Tesseras é uma rede que mantém memórias humanas vivas através de ajuda mútua. O
-mecanismo central de sobrevivência é a <strong>codificação de apagamento
-Reed-Solomon</strong> — uma técnica emprestada da comunicação espacial profunda que nos
-permite reconstruir dados mesmo quando pedaços desaparecem.</p>
-<h2 id="o-que-e-reed-solomon">O que é Reed-Solomon?</h2>
-<p>Reed-Solomon é uma família de códigos corretores de erros inventada por Irving
-Reed e Gustave Solomon em 1960. O caso de uso original era corrigir erros em
-dados transmitidos por canais ruidosos — pense na Voyager enviando fotos de
-Júpiter, ou num CD tocando apesar de arranhões.</p>
-<p>A ideia-chave: se você adicionar redundância cuidadosamente calculada aos seus
-dados <em>antes</em> que algo dê errado, você pode recuperar o original mesmo depois de
-perder alguns pedaços.</p>
-<p>Eis a intuição. Suponha que você tenha um polinômio de grau 2 — uma parábola.
-Você precisa de 3 pontos para defini-lo de forma única. Mas se você avaliá-lo em
-5 pontos, pode perder quaisquer 2 desses 5 e ainda reconstruir o polinômio a
-partir dos 3 restantes. Reed-Solomon generaliza essa ideia para trabalhar sobre
-corpos finitos (corpos de Galois), onde o "polinômio" são seus dados e os
-"pontos de avaliação" são seus fragmentos.</p>
-<p>Em termos concretos:</p>
-<ol>
-<li><strong>Divida</strong> seus dados em <em>k</em> shards de dados</li>
-<li><strong>Calcule</strong> <em>m</em> shards de paridade a partir dos shards de dados</li>
-<li><strong>Distribua</strong> todos os <em>k + m</em> shards em diferentes locais</li>
-<li><strong>Reconstrua</strong> os dados originais a partir de quaisquer <em>k</em> dos <em>k + m</em>
-shards</li>
-</ol>
-<p>Você pode perder até <em>m</em> shards — quaisquer <em>m</em>, de dados ou paridade, em
-qualquer combinação — e ainda recuperar tudo.</p>
-<h2 id="por-que-nao-simplesmente-fazer-copias">Por que não simplesmente fazer cópias?</h2>
-<p>A abordagem ingênua para redundância é a replicação: faça 3 cópias, armazene-as
-em 3 lugares. Isso dá tolerância a 2 falhas ao custo de 3x o seu armazenamento.</p>
-<p>Reed-Solomon é dramaticamente mais eficiente:</p>
-<table><thead><tr><th>Estratégia</th><th style="text-align: right">Overhead de armazenamento</th><th style="text-align: right">Falhas toleradas</th></tr></thead><tbody>
-<tr><td>Replicação 3x</td><td style="text-align: right">200%</td><td style="text-align: right">2 de 3</td></tr>
-<tr><td>Reed-Solomon (16,8)</td><td style="text-align: right">50%</td><td style="text-align: right">8 de 24</td></tr>
-<tr><td>Reed-Solomon (48,24)</td><td style="text-align: right">50%</td><td style="text-align: right">24 de 72</td></tr>
-</tbody></table>
-<p>Com 16 shards de dados e 8 de paridade, você usa 50% de armazenamento extra mas
-pode sobreviver à perda de um terço de todos os fragmentos. Para alcançar a
-mesma tolerância a falhas só com replicação, você precisaria de 3x o
-armazenamento.</p>
-<p>Para uma rede que visa preservar memórias ao longo de décadas e séculos, essa
-eficiência não é um luxo — é a diferença entre um sistema viável e um que se
-afoga no próprio overhead.</p>
-<h2 id="como-o-tesseras-usa-reed-solomon">Como o Tesseras usa Reed-Solomon</h2>
-<p>Nem todos os dados merecem o mesmo tratamento. Uma memória de texto de 500 bytes
-e um vídeo de 100 MB têm necessidades de redundância muito diferentes. O
-Tesseras usa uma estratégia de fragmentação em três camadas:</p>
-<p><strong>Small (&lt; 4 MB)</strong> — Replicação do arquivo inteiro para 7 pares. Para tesseras
-pequenas, o overhead da codificação de apagamento (tempo de codificação,
-gerenciamento de fragmentos, lógica de reconstrução) supera seus benefícios.
-Cópias simples são mais rápidas e mais simples.</p>
-<p><strong>Medium (4–256 MB)</strong> — 16 shards de dados + 8 de paridade = 24 fragmentos no
-total. Cada fragmento tem aproximadamente 1/16 do tamanho original. Quaisquer 16
-dos 24 fragmentos reconstroem o original. Distribuídos entre 7 pares.</p>
-<p><strong>Large (≥ 256 MB)</strong> — 48 shards de dados + 24 de paridade = 72 fragmentos no
-total. Maior contagem de shards significa fragmentos individuais menores (mais
-fáceis de transferir e armazenar) e maior tolerância absoluta a falhas. Também
-distribuídos entre 7 pares.</p>
-<p>A implementação usa o crate <code>reed-solomon-erasure</code> operando sobre GF(2⁸) — o
-mesmo corpo de Galois usado em códigos QR e CDs. Cada fragmento carrega um
-checksum BLAKE3 para que a corrupção seja detectada imediatamente, não propagada
-silenciosamente.</p>
-<pre><code>Tessera (álbum de fotos de 120 MB)
- ↓ codificar
-16 shards de dados (7,5 MB cada) + 8 shards de paridade (7,5 MB cada)
- ↓ distribuir
-24 fragmentos entre 7 pares (diversidade de sub-rede)
- ↓ quaisquer 16 fragmentos
-Tessera original recuperada
-</code></pre>
-<h2 id="os-desafios">Os desafios</h2>
-<p>Reed-Solomon resolve o problema matemático da redundância. Os desafios de
-engenharia estão em tudo ao redor.</p>
-<h3 id="rastreamento-de-fragmentos">Rastreamento de fragmentos</h3>
-<p>Cada fragmento precisa ser localizável. O Tesseras usa uma DHT Kademlia para
-descoberta de pares e mapeamento de fragmentos para pares. Quando um nó fica
-offline, seus fragmentos precisam ser recriados e distribuídos para novos pares.
-Isso significa rastrear quais fragmentos existem, onde estão e se ainda estão
-intactos — numa rede sem autoridade central.</p>
-<h3 id="corrupcao-silenciosa">Corrupção silenciosa</h3>
-<p>Um fragmento que retorna dados errados é pior que um ausente — pelo menos um
-fragmento ausente é honestamente ausente. O Tesseras aborda isso com
-verificações de saúde baseadas em atestação: o loop de reparo periodicamente
-pede aos detentores de fragmentos que provem posse retornando checksums BLAKE3.
-Se um checksum não bater, o fragmento é tratado como perdido.</p>
-<h3 id="falhas-correlacionadas">Falhas correlacionadas</h3>
-<p>Se todos os 24 fragmentos de uma tessera caírem em máquinas no mesmo datacenter,
-uma única queda de energia os elimina todos. A matemática do Reed-Solomon assume
-falhas independentes. O Tesseras impõe <strong>diversidade de sub-rede</strong> durante a
-distribuição: no máximo 2 fragmentos por sub-rede /24 IPv4 (ou prefixo /48
-IPv6). Isso espalha fragmentos por diferentes infraestruturas físicas.</p>
-<h3 id="velocidade-de-reparo-vs-carga-na-rede">Velocidade de reparo vs. carga na rede</h3>
-<p>Quando um par fica offline, o relógio começa a contar. Fragmentos perdidos
-precisam ser recriados antes que mais falhas se acumulem. Mas reparo agressivo
-inunda a rede. O Tesseras equilibra isso com um loop de reparo configurável
-(padrão: a cada 24 horas com 2 horas de jitter) e limites de transferências
-simultâneas (padrão: 4 transferências simultâneas). O jitter previne tempestades
-de reparo onde cada nó verifica seus fragmentos no mesmo momento.</p>
-<h3 id="gerenciamento-de-chaves-a-longo-prazo">Gerenciamento de chaves a longo prazo</h3>
-<p>Reed-Solomon protege contra perda de dados, não contra perda de acesso. Se uma
-tessera é criptografada (visibilidade privada ou selada), você precisa da chave
-de descriptografia para tornar os dados recuperados úteis. O Tesseras separa
-essas preocupações: codificação de apagamento cuida da disponibilidade, enquanto
-o Compartilhamento de Segredo de Shamir (uma fase futura) cuidará da
-distribuição de chaves entre herdeiros. A filosofia de design do projeto —
-criptografar o mínimo possível — mantém o problema de gerenciamento de chaves
-pequeno.</p>
-<h3 id="limitacoes-do-corpo-de-galois">Limitações do corpo de Galois</h3>
-<p>O corpo GF(2⁸) limita o número total de shards a 255 (dados + paridade
-combinados). Para o Tesseras, isso não é uma restrição prática — mesmo a camada
-Large usa apenas 72 shards. Mas significa que arquivos extremamente grandes com
-milhares de fragmentos exigiriam um corpo diferente ou um esquema de codificação
-em camadas.</p>
-<h3 id="compatibilidade-evolutiva-do-codec">Compatibilidade evolutiva do codec</h3>
-<p>Uma tessera codificada hoje precisa ser decodificável em 50 anos. Reed-Solomon
-sobre GF(2⁸) é um dos algoritmos mais amplamente implementados na computação —
-está em todo leitor de CD, em todo scanner de código QR, em toda sonda espacial.
-Essa ubiquidade é em si uma estratégia de sobrevivência. O algoritmo não será
-esquecido porque metade da infraestrutura do mundo depende dele.</p>
-<h2 id="o-quadro-geral">O quadro geral</h2>
-<p>Reed-Solomon é uma peça de um quebra-cabeça maior. Ele trabalha em conjunto com:</p>
-<ul>
-<li><strong>DHT Kademlia</strong> para encontrar pares e rotear fragmentos</li>
-<li><strong>Checksums BLAKE3</strong> para verificação de integridade</li>
-<li><strong>Reciprocidade bilateral</strong> para troca justa de armazenamento (sem blockchain)</li>
-<li><strong>Diversidade de sub-rede</strong> para independência de falhas</li>
-<li><strong>Reparo automático</strong> para manter a redundância ao longo do tempo</li>
-</ul>
-<p>Nenhuma técnica isolada faz memórias sobreviverem. Reed-Solomon garante que
-dados <em>podem</em> ser recuperados. A DHT garante que fragmentos <em>podem ser
-encontrados</em>. A reciprocidade garante que pares <em>querem ajudar</em>. O reparo
-garante que nada disso se degrade com o tempo.</p>
-<p>Uma tessera é uma aposta de que a soma desses mecanismos, rodando em muitas
-máquinas independentes operadas por muitas pessoas independentes, é mais durável
-que qualquer instituição isolada. Reed-Solomon é a fundação matemática dessa
-aposta.</p>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/news/reed-solomon/index.html.gz b/pt-br/news/reed-solomon/index.html.gz
deleted file mode 100644
index d7674cf..0000000
--- a/pt-br/news/reed-solomon/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/releases/index.html b/pt-br/releases/index.html
deleted file mode 100644
index 72c9145..0000000
--- a/pt-br/releases/index.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Lançamentos — Tesseras</title>
- <meta name="description" content="Lançamentos e downloads do software Tesseras">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="Lançamentos">
- <meta property="og:description" content="Lançamentos e downloads do software Tesseras">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Lançamentos">
- <meta name="twitter:description" content="Lançamentos e downloads do software Tesseras">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;releases&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Lançamentos</h2>
- <p>Nenhum lançamento ainda. Tesseras está em desenvolvimento inicial (Fase 0).</p>
-<h3 id="formato-de-lancamento">Formato de Lançamento</h3>
-<p>Quando disponíveis, os lançamentos incluirão:</p>
-<table><thead><tr><th>Arquivo</th><th>Descrição</th></tr></thead><tbody>
-<tr><td><code>tesseras-X.Y.Z.tar.gz</code></td><td>Tarball com código-fonte</td></tr>
-<tr><td><code>tesseras-X.Y.Z.tar.gz.sig</code></td><td>Assinatura signify</td></tr>
-<tr><td><code>SHA256</code></td><td>Checksums BLAKE3</td></tr>
-<tr><td><code>CHANGELOG.md</code></td><td>O que mudou</td></tr>
-</tbody></table>
-<p>Os lançamentos seguem <a rel="external" href="https://semver.org/">Versionamento Semântico</a>. Tarballs
-são assinados com <a rel="external" href="https://man.openbsd.org/signify">signify</a>.</p>
-<h3 id="verificando-um-lancamento">Verificando um Lançamento</h3>
-<pre><code>signify -Vep tesseras.pub -m tesseras-X.Y.Z.tar.gz -x tesseras-X.Y.Z.tar.gz.sig
-b3sum -c SHA256
-</code></pre>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/releases/index.html.gz b/pt-br/releases/index.html.gz
deleted file mode 100644
index 0ee936f..0000000
--- a/pt-br/releases/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/pt-br/subscriptions/index.html b/pt-br/subscriptions/index.html
deleted file mode 100644
index cae6bf7..0000000
--- a/pt-br/subscriptions/index.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!DOCTYPE html>
-<html lang="pt-br">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Inscrições — Tesseras</title>
- <meta name="description" content="Inscreva-se nas listas de discussão do Tesseras">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="Inscrições">
- <meta property="og:description" content="Inscreva-se nas listas de discussão do Tesseras">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Inscrições">
- <meta name="twitter:description" content="Inscreva-se nas listas de discussão do Tesseras">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/pt-br/about/">Sobre</a>
- <a href="https://tesseras.net/pt-br/news/">Notícias</a>
- <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
- <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
- <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
- <a href="https://tesseras.net/pt-br/contact/">Contato</a>
-
- </nav>
- <nav class="lang-switch">
-
- <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;subscriptions&#x2F;">English</a> | <strong>Português</strong>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Inscrições</h2>
- <h3 id="listas-de-discussao">Listas de Discussão</h3>
-<p>Tesseras usa quatro listas de discussão hospedadas no SourceHut, cada uma com um
-propósito diferente.</p>
-<h4 id="tesseras-announce">tesseras-announce</h4>
-<p>Anúncios de lançamento, marcos e notícias importantes do projeto. Baixo tráfego,
-somente leitura.</p>
-<ul>
-<li>Inscrever-se:
-<a href="mailto:~ijanc/tesseras-announce+subscribe@lists.sr.ht">~ijanc/tesseras-announce@lists.sr.ht</a></li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-announce">Navegar nos arquivos</a></li>
-</ul>
-<h4 id="tesseras-devel">tesseras-devel</h4>
-<p>Patches, revisão de código, discussão de arquitetura e coordenação de
-desenvolvimento.</p>
-<ul>
-<li>Inscrever-se:
-<a href="mailto:~ijanc/tesseras-devel+subscribe@lists.sr.ht">~ijanc/tesseras-devel@lists.sr.ht</a></li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-devel">Navegar nos arquivos</a></li>
-</ul>
-<h4 id="tesseras-discuss">tesseras-discuss</h4>
-<p>Suporte a usuários, discussão geral, perguntas e conversa da comunidade.</p>
-<ul>
-<li>Inscrever-se:
-<a href="mailto:~ijanc/tesseras-discuss+subscribe@lists.sr.ht">~ijanc/tesseras-discuss@lists.sr.ht</a></li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-discuss">Navegar nos arquivos</a></li>
-</ul>
-<h4 id="tesseras-security">tesseras-security</h4>
-<p>Divulgação responsável de vulnerabilidades de segurança. Restrita a
-mantenedores; relatos são bem-vindos de qualquer pessoa.</p>
-<ul>
-<li>Relatar:
-<a href="mailto:~ijanc/tesseras-security@lists.sr.ht">~ijanc/tesseras-security@lists.sr.ht</a></li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-security">Navegar nos arquivos</a></li>
-</ul>
-<h3 id="bug-tracker">Bug Tracker</h3>
-<p>Registre bugs e pedidos de funcionalidades no
-<a rel="external" href="https://todo.sr.ht/~ijanc/tesseras">ticket tracker</a>.</p>
-<h3 id="feeds">Feeds</h3>
-<p>Você também pode acompanhar o projeto via feeds no seu leitor de feeds:</p>
-<ul>
-<li><a href="/pt-br/atom.xml">Feed de notícias</a> — anúncios e atualizações do projeto</li>
-<li><a rel="external" href="https://sr.ht/~ijanc/tesseras/feed.rss">Feed SourceHut</a> — commits, tickets e
-atividade das listas</li>
-</ul>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/pt-br/subscriptions/index.html.gz b/pt-br/subscriptions/index.html.gz
deleted file mode 100644
index bbb0e55..0000000
--- a/pt-br/subscriptions/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/releases/index.html b/releases/index.html
deleted file mode 100644
index b14d4dd..0000000
--- a/releases/index.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Releases — Tesseras</title>
- <meta name="description" content="Tesseras software releases and downloads">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="Releases">
- <meta property="og:description" content="Tesseras software releases and downloads">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Releases">
- <meta name="twitter:description" content="Tesseras software releases and downloads">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;releases&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Releases</h2>
- <p>No releases yet. Tesseras is in early development (Phase 0).</p>
-<h3 id="release-format">Release Format</h3>
-<p>When available, releases will include:</p>
-<table><thead><tr><th>File</th><th>Description</th></tr></thead><tbody>
-<tr><td><code>tesseras-X.Y.Z.tar.gz</code></td><td>Source tarball</td></tr>
-<tr><td><code>tesseras-X.Y.Z.tar.gz.sig</code></td><td>Signify signature</td></tr>
-<tr><td><code>SHA256</code></td><td>BLAKE3 checksums</td></tr>
-<tr><td><code>CHANGELOG.md</code></td><td>What changed</td></tr>
-</tbody></table>
-<p>Releases follow <a rel="external" href="https://semver.org/">Semantic Versioning</a>. Tarballs are signed
-with <a rel="external" href="https://man.openbsd.org/signify">signify</a>.</p>
-<h3 id="verifying-a-release">Verifying a Release</h3>
-<pre><code>signify -Vep tesseras.pub -m tesseras-X.Y.Z.tar.gz -x tesseras-X.Y.Z.tar.gz.sig
-b3sum -c SHA256
-</code></pre>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/releases/index.html.gz b/releases/index.html.gz
deleted file mode 100644
index 914afab..0000000
--- a/releases/index.html.gz
+++ /dev/null
Binary files differ
diff --git a/robots.txt b/robots.txt
deleted file mode 100644
index 4b569a8..0000000
--- a/robots.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-User-agent: *
-Disallow:
-Allow: /
-Sitemap: https://tesseras.net/sitemap.xml
diff --git a/robots.txt.gz b/robots.txt.gz
deleted file mode 100644
index a3b3892..0000000
--- a/robots.txt.gz
+++ /dev/null
Binary files differ
diff --git a/sitemap.xml b/sitemap.xml
deleted file mode 100644
index d0d690d..0000000
--- a/sitemap.xml
+++ /dev/null
@@ -1,173 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
- <url>
- <loc>https://tesseras.net/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/about/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/contact/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/faq/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/news/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/news/cli-daemon-rpc/</loc>
- <lastmod>2026-02-15</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/hello-world/</loc>
- <lastmod>2026-02-13</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/packaging-archlinux/</loc>
- <lastmod>2026-02-16T09:00:00Z</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/packaging-debian/</loc>
- <lastmod>2026-02-16T10:00:00Z</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/phase0-foundation/</loc>
- <lastmod>2026-02-14T10:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/phase1-basic-network/</loc>
- <lastmod>2026-02-14T11:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/phase2-replication/</loc>
- <lastmod>2026-02-14T12:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/phase3-api-and-apps/</loc>
- <lastmod>2026-02-14T14:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/phase4-encryption-sealed/</loc>
- <lastmod>2026-02-14T16:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/phase4-institutional-onboarding/</loc>
- <lastmod>2026-02-15T22:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/phase4-nat-traversal/</loc>
- <lastmod>2026-02-15T18:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/phase4-performance-tuning/</loc>
- <lastmod>2026-02-15T20:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/phase4-shamir-heir-recovery/</loc>
- <lastmod>2026-02-15</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/phase4-storage-deduplication/</loc>
- <lastmod>2026-02-15T23:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/phase4-wasm-browser-verification/</loc>
- <lastmod>2026-02-15T20:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/news/reed-solomon/</loc>
- <lastmod>2026-02-14T14:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/about/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/contact/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/faq/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/cli-daemon-rpc/</loc>
- <lastmod>2026-02-15</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/hello-world/</loc>
- <lastmod>2026-02-13</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/packaging-archlinux/</loc>
- <lastmod>2026-02-16T09:00:00Z</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/packaging-debian/</loc>
- <lastmod>2026-02-16T10:00:00Z</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/phase0-foundation/</loc>
- <lastmod>2026-02-14T10:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/phase1-basic-network/</loc>
- <lastmod>2026-02-14T11:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/phase2-replication/</loc>
- <lastmod>2026-02-14T12:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/phase3-api-and-apps/</loc>
- <lastmod>2026-02-14T14:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/phase4-encryption-sealed/</loc>
- <lastmod>2026-02-14T16:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/phase4-institutional-onboarding/</loc>
- <lastmod>2026-02-15T22:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/phase4-nat-traversal/</loc>
- <lastmod>2026-02-15T18:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/phase4-performance-tuning/</loc>
- <lastmod>2026-02-15T20:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/phase4-shamir-heir-recovery/</loc>
- <lastmod>2026-02-15</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/phase4-storage-deduplication/</loc>
- <lastmod>2026-02-15T23:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/phase4-wasm-browser-verification/</loc>
- <lastmod>2026-02-15T20:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/news/reed-solomon/</loc>
- <lastmod>2026-02-14T14:00:00+00:00</lastmod>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/releases/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/pt-br/subscriptions/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/releases/</loc>
- </url>
- <url>
- <loc>https://tesseras.net/subscriptions/</loc>
- </url>
-</urlset>
diff --git a/sitemap.xml.gz b/sitemap.xml.gz
deleted file mode 100644
index 3447f70..0000000
--- a/sitemap.xml.gz
+++ /dev/null
Binary files differ
diff --git a/style.css b/style.css
deleted file mode 100644
index 1e49bd0..0000000
--- a/style.css
+++ /dev/null
@@ -1,182 +0,0 @@
-*,
-*::before,
-*::after {
- box-sizing: border-box;
- margin: 0;
- padding: 0;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
- Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial,
- Noto Sans, sans-serif;
- font-size: 1rem;
- line-height: 1.6;
- color: #2c2c2c;
- background-color: #faf8f5;
- max-width: 42em;
- margin: 0 auto;
- padding: 2em 1em;
-}
-
-a {
- color: #4a4a4a;
- text-decoration: underline;
-}
-
-a:hover {
- color: #1a1a1a;
-}
-
-header {
- margin-bottom: 3em;
-}
-
-header h1 {
- font-size: 1.8rem;
- font-weight: 700;
- margin-bottom: 0.5em;
-}
-
-header h1 a {
- text-decoration: none;
- color: #2c2c2c;
- display: inline-flex;
- align-items: center;
- gap: 0.4em;
-}
-
-.logo {
- vertical-align: middle;
-}
-
-header h1 a:hover {
- color: #1a1a1a;
-}
-
-nav {
- margin-bottom: 0.3em;
-}
-
-nav a {
- margin-right: 0.3em;
-}
-
-nav a:not(:last-child)::after {
- content: " |";
- color: #d4cfc8;
- text-decoration: none;
- margin-left: 0.3em;
-}
-
-nav.lang-switch {
- font-size: 0.85rem;
- margin-top: 0.3em;
-}
-
-nav.lang-switch a::after {
- content: "";
-}
-
-main {
- margin-bottom: 3em;
-}
-
-h2 {
- font-size: 1.3rem;
- font-weight: 600;
- margin-top: 1.5em;
- margin-bottom: 0.5em;
-}
-
-h3 {
- font-size: 1.1rem;
- font-weight: 600;
- margin-top: 1.2em;
- margin-bottom: 0.4em;
-}
-
-p {
- margin-bottom: 1em;
-}
-
-ul, ol {
- margin-bottom: 1em;
- padding-left: 1.5em;
-}
-
-li {
- margin-bottom: 0.3em;
-}
-
-code {
- font-family: "Fira Code", "Source Code Pro", "Cascadia Code", Consolas,
- "Liberation Mono", Menlo, monospace;
- background-color: #f0ece6;
- padding: 0.1em 0.3em;
- border-radius: 2px;
- font-size: 0.9em;
-}
-
-pre {
- background-color: #f0ece6;
- padding: 1em;
- overflow-x: auto;
- margin-bottom: 1em;
- border-radius: 2px;
-}
-
-pre code {
- padding: 0;
- background: none;
-}
-
-table {
- width: 100%;
- border-collapse: collapse;
- margin-bottom: 1em;
-}
-
-th, td {
- text-align: left;
- padding: 0.4em 0.6em;
- border-bottom: 1px solid #d4cfc8;
-}
-
-th {
- font-weight: 600;
- border-bottom: 2px solid #d4cfc8;
-}
-
-hr {
- border: none;
- border-top: 1px solid #d4cfc8;
- margin: 2em 0;
-}
-
-footer {
- border-top: 1px solid #d4cfc8;
- padding-top: 1em;
- font-size: 0.85rem;
- color: #6a6a6a;
-}
-
-.news-list {
- list-style: none;
- padding-left: 0;
-}
-
-.news-list li {
- margin-bottom: 1em;
- padding-bottom: 1em;
- border-bottom: 1px solid #d4cfc8;
-}
-
-.news-list li:last-child {
- border-bottom: none;
-}
-
-.news-date {
- font-size: 0.85rem;
- color: #6a6a6a;
-}
diff --git a/style.css.gz b/style.css.gz
deleted file mode 100644
index 8f4f953..0000000
--- a/style.css.gz
+++ /dev/null
Binary files differ
diff --git a/subscriptions/index.html b/subscriptions/index.html
deleted file mode 100644
index 82edaf7..0000000
--- a/subscriptions/index.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Subscriptions — Tesseras</title>
- <meta name="description" content="Subscribe to the Tesseras mailing lists">
- <!-- Open Graph -->
- <meta property="og:type" content="website">
- <meta property="og:title" content="Subscriptions">
- <meta property="og:description" content="Subscribe to the Tesseras mailing lists">
- <meta property="og:image" content="https://tesseras.net/images/social.jpg">
- <meta property="og:image:width" content="1200">
- <meta property="og:image:height" content="630">
- <meta property="og:site_name" content="Tesseras">
- <!-- Twitter Card -->
- <meta name="twitter:card" content="summary_large_image">
- <meta name="twitter:title" content="Subscriptions">
- <meta name="twitter:description" content="Subscribe to the Tesseras mailing lists">
- <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
- <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
-
-
- <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
-
-
- <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
-
-</head>
-<body>
- <header>
- <h1>
- <a href="https:&#x2F;&#x2F;tesseras.net/">
- <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
- Tesseras
- </a>
- </h1>
- <nav>
-
- <a href="https://tesseras.net/about/">About</a>
- <a href="https://tesseras.net/news/">News</a>
- <a href="https://tesseras.net/releases/">Releases</a>
- <a href="https://tesseras.net/faq/">FAQ</a>
- <a href="https://tesseras.net/subscriptions/">Subscriptions</a>
- <a href="https://tesseras.net/contact/">Contact</a>
-
- </nav>
- <nav class="lang-switch">
-
- <strong>English</strong> | <a href="/pt-br&#x2F;subscriptions&#x2F;">Português</a>
-
- </nav>
- </header>
-
- <main>
-
-<article>
- <h2>Subscriptions</h2>
- <h3 id="mailing-lists">Mailing Lists</h3>
-<p>Tesseras uses four mailing lists hosted on SourceHut, each serving a different
-purpose.</p>
-<h4 id="tesseras-announce">tesseras-announce</h4>
-<p>Release announcements, milestones, and important project news. Low-traffic,
-read-only.</p>
-<ul>
-<li>Subscribe:
-<a href="mailto:~ijanc/tesseras-announce+subscribe@lists.sr.ht">~ijanc/tesseras-announce@lists.sr.ht</a></li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-announce">Browse archives</a></li>
-</ul>
-<h4 id="tesseras-devel">tesseras-devel</h4>
-<p>Patches, code review, architecture discussion, and development coordination.</p>
-<ul>
-<li>Subscribe:
-<a href="mailto:~ijanc/tesseras-devel+subscribe@lists.sr.ht">~ijanc/tesseras-devel@lists.sr.ht</a></li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-devel">Browse archives</a></li>
-</ul>
-<h4 id="tesseras-discuss">tesseras-discuss</h4>
-<p>User support, general discussion, questions, and community conversation.</p>
-<ul>
-<li>Subscribe:
-<a href="mailto:~ijanc/tesseras-discuss+subscribe@lists.sr.ht">~ijanc/tesseras-discuss@lists.sr.ht</a></li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-discuss">Browse archives</a></li>
-</ul>
-<h4 id="tesseras-security">tesseras-security</h4>
-<p>Responsible disclosure of security vulnerabilities. Restricted to maintainers;
-reports are welcome from anyone.</p>
-<ul>
-<li>Report:
-<a href="mailto:~ijanc/tesseras-security@lists.sr.ht">~ijanc/tesseras-security@lists.sr.ht</a></li>
-<li><a rel="external" href="https://lists.sr.ht/~ijanc/tesseras-security">Browse archives</a></li>
-</ul>
-<h3 id="bug-tracker">Bug Tracker</h3>
-<p>File bug reports and feature requests on the
-<a rel="external" href="https://todo.sr.ht/~ijanc/tesseras">ticket tracker</a>.</p>
-<h3 id="feeds">Feeds</h3>
-<p>You can also follow the project via feeds in your feed reader:</p>
-<ul>
-<li><a href="/atom.xml">News feed</a> — project announcements and updates</li>
-<li><a rel="external" href="https://sr.ht/~ijanc/tesseras/feed.rss">SourceHut feed</a> — commits, tickets,
-and mailing list activity</li>
-</ul>
-
-</article>
-
- </main>
-
- <footer>
- <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
- </footer>
-</body>
-</html>
diff --git a/subscriptions/index.html.gz b/subscriptions/index.html.gz
deleted file mode 100644
index 429c2bc..0000000
--- a/subscriptions/index.html.gz
+++ /dev/null
Binary files differ