Official AKADATA documentation · v0.0.5

Lua

A small dependency-free Lua 5.3+ reference. Native table containing compressed chunk data.

Purpose

A small dependency-free Lua 5.3+ reference. Native table containing compressed chunk data.

Why this version exists

It supports lightweight embedded and scripting environments with the data compiled directly into the module.

Canonical validation

It validates the embedded chunk counts, raw lengths, per-chunk SHA-256 checksums, total word count and the global checksum.

Wordlist data handling

Native table containing compressed chunk data. It inflates the embedded base64 raw-DEFLATE token streams in memory; no expanded wordlist and no external file are used at runtime.

Cryptographic randomness

Operating-system cryptographic random bytes drive unbiased selection and character casing.

OpenPGP verification

Verify the canonical wordlist.json and release externally with gpg (canonical JSON SHA-256 ea0be8d452c422f154358b386c0c5bfc1f4e8e0670f9cd4ddf1a662cb3c96ec8).

Use this implementation

File location
implementations/lua/aip56.lua
Dependencies
Lua 5.3+ with the environment documented in the release README.
Check
make -C implementations/lua check
Run
make -C implementations/lua run

Published source

Download source468 lines
-- AIP-56 Human Recovery Key reference implementation.-- Copyright (c) 2026 AKADATA LIMITED.-- Released under the MIT License; see LICENSE.md.local Aip56 = {}Aip56.__index = Aip56local LETTERS = "abcdefghijklmnopqrstuvwxyz"local BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"local MASK = 0xfffffffflocal random_file-- BEGIN GENERATED AIP56 PAYLOADlocal WORDLIST = {    version = "AIP-56-WORDLIST-CHUNKS-1",    word_length = 5,    token_width = 7,    encoding = "base64-standard-trim-final-equals",    selection = { pick_per_letter = 2, candidate_count = 52, final_count = 15, case_sensitive = true, case_entropy_bits = 75 },    chunks = {        a = { count = 521, codec = "deflate-base64", raw_length = 3647, words = "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", checksum = "b612a14a1554e6f50172fca68e2e182c1c497e9a04dc97405286ef84c67357b6" },        b = { count = 667, codec = "deflate-base64", raw_length = 4669, words = "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", checksum = "e816cb5954ec2ef00016c4edd7598f518228d58c06b3ed46c39aecf55ded7138" },        c = { count = 700, codec = "deflate-base64", raw_length = 4900, words = "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", checksum = "1a9a1b70a84befb60b031564da9db09ac6cdc2a1f3d4ac8da3d52a257d56296d" },        d = { count = 483, codec = "deflate-base64", raw_length = 3381, words = "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", checksum = "fdb7eb76eea6f303471145a9c70bd83d53002e1bbd6f960ab44f696ffc78d60e" },        e = { count = 198, codec = "deflate-base64", raw_length = 1386, words = "LVTLbuMwEPsly1kDu8cGaNI1UAM10EjWzbKKKvUjbtH6ka/fIWdPgiyJwyE59rbKGvviXTL+/OrdcXl76r0tMu/+yjIE++hd9cXdlsIoN4ehOzzLg9QcXrw97fH87u2fe2t/YRemZzxv5Z3dBl4xH96+ejtz58rdSz275cB0aQly5tLq7eqdH7qpFxJzIxVsbZpc3plr4+RjaSKgpQIIbnMUunbriXIyLXrAc1DKPLgUPyHvAN04OavuQLHDV8hxlpTLwqbTGlDvdCdYmTop66os5M/ADILp6gN7KPqIZZjaJz7nzTTHJ7lZ3xr0UN/eZLH15J1gmm+P6mlscSY83YOn5CsUDA5CrvGMnQmCKRVIYpjD2EHBYHsqQbpzk4uscVLp1njolTUKUTrsoMTJoIJIFw6dflwhnSrPj25IsNEWphv/iwyLBy+Y7nIPuTzYFppqrrT/lPN5PZNL/dGeYZUKCZUAtnSjJMfPGo0pwCOz0CpzjeDpR6IUech7sEakaCqU+GAKjkuTv4sBO/wT8qquSCfPN0Owy94yNnM468Ie5k5IuDhwSXMHZlWmpuY0oNzDAeruLTqKE5s2a5RICWtCiwE6D92oTcMjnxAUW15VwaVj2YwqmQRo+62OFSM0Q3oOD3JlYPhK08HbjWeIBiXoaY7QhViD+p6ybnzEAypYZDR142xiGjEI1RWYtrhCAlvdkF132bkkykMJ0NHSYoAqtconiuxnLGKO+j6ot6pS0gGKyePm8QaxxHCKfJR4v2uuoaeO9jz7828dZtj/GZDIjYa7owk4K5LKem9xZlTBQpj1nIAnBoWYR53Gmh3Zy2eLNuPOARIuOVJ3ay3CUPC/VO864QvDV8rSM1koVPxEy79Gw2DeObdRlTdJ/y/8u3FENROWIULcpGkPBcspMOw3bfqHbQ49CW7a2DaT9cwM4ufIejujUSuYWdqx/wc=", checksum = "cc0dbdfad4be71739452379f5f3e139d04bb0538d0d843ae9dadbf46d4e14137" },        f = { count = 438, codec = "deflate-base64", raw_length = 3066, words = "PVbLbuM4EPwlS06C6LgLhHYMzCGH0BZvehhRbEojjGyt5K/fripmToJskeyuVzMMh7nMpzAcxnr3X+jjUzi92+NeHu1tycLpGnq/8i0+qr29FWu1/YW3ko+u3dvDZSH/sl2eudxd8bCt6/4Dm9WDrYvXkH/a8rHGgrg2W/y3qfs3OyhyXbG2xw2X46A4ldxzPA+/7cexwS5Fx+VOmy1ZvbV1/lKdbDO3afM3nMcC3Sac7LGMdd/YYw74cbme9/jyT8U615o/jvpyxgmDX3nCklVbnDezP/vk+GH/TfjPStLbd4ldlrnOP7jZzkry301/xSftHlWvpdVpe7a7L1QWuNnc8tiuQg9u0+SvoR9jvbNdihtqGfxNgDwadORv9fETgAgeowPnvQQ+1nJLsPQ2BL5dqj22XqrjF+BJbNanf+xtoy/HekAR8bx7BVXnHuSsZ9ARVwLiIskppuqIpmf2YARAE0sH2dixNb/ccjODQJBDGsOha/Dw94D+3B8pq+fpxVpSWeLI3oD8ISONSywJwQPcEsgPLceesTxOQL5Bm+6O3u0EEg6qrhQtyDlIUk5yc32Aekwo2GzpiOeSNTngmSRhoypthi8j1/mOMnUZkTBloVwvlRvvEF98OVM2j5BYYZ1ju4OuM5bk5AB/A5B9TBxFCnqcG5jElIUF/p70QikexlK2CFIdITd9cjOTBu2EAkFO/mQ/GqkfhJwLYkOL9n9NSdWdie5QHV8pRfldxV/ph/j940YI2ixKN4pb9yT+Jv5olsECv2nFGLv1EVoa4kbLzQ9UVjCd2ZeQohVYCzPS6E1g2POpIiuRbS4jWYnpx46WKXS6+6bViljtntgDei/uWEAePgk5AZHj7HQ4wD20553B4l8kvimhK1K7854hAFKRIdRSV3H5LTmu6SHolW/+RgRhkld6mv2ZfT/kIwGJPQ8zkTCUdnIV3THQmy5vRU45yA8weswTY8qzkf5zF2xt3P4NTrHCx0VhZQdBSx15+PfRKM8ULCuNbg4YeHrNbi+K9El5FnkCfEsIkqtY2UINDpgIRF5i7+reGHOTkv3CViysdl+ClZ+c6RwaFmySlUncPksoMsLSNaQ/0pt4S03z9IbyHiQ3zgCoHJ/ElJ8r0sY6YhGmeXAU//Bhm6F3m0eMNbk4KpoX9YBoZrcsqXhS8ZodGHxXEXdV079U2bs4IljJFnJq1xBkBgSkr1aq4xvzjJVdKg4NQQdA8N8z63SrGFNc+DFQ0FMrNxK64iI7vUDz0ATHUhoMF0XQXEovhNyvPCGqlmLWqBulkFFNr/KRZqNTFrihRg7aCAFK1opiW4q8Ex4Lf6o8TZmcVwDs8s78pK6ZWQzHL1J1Qvwy64xwOtzPoS/hBw32TZWIY4FdK5BpGZ9EpKzzHcXgZdHlx8ycVY4zlXcb4tkSunsAPHHARMC0OCrnd/QtS8KV45cmnmxIM2/T9YAjxDFwMX1pGR3k0wyY9d9dMUNFQjY8PePWJtqeotV8T+l2UbAoTd2kOqefsEJHsZdoZ91tnktesO4S9KTeIzPEacpECQxzGlrKyjSLCUjK8kxYZxU5msVYHkwviC5OSquT0m8oFAnTggWMLQkJRWyRaRA9hHyfBkPQXbHeJ6dSbph4Jm8OWqvFVG4KSSEQjmniAdYtG/OZCLd1CLkrRWQ3nXRvzd8YOrpgBUbsRqPgRjF4RYlfNdXUO0T0qTsDRwjjHpNLOU8lX5LtNZ0yID+kW0Kh+xIuQ1eGKuCxFKZQFDPFHHTtle1jGHQ12qEkBYRhxpuALguYzFQWIDcj0A8G+YlF6MaSblaTXDXrqrL+EMCp1rU8Lxd0qVuM8v8B", checksum = "837e8393ca1ceb30d91483f8a3acb47fd9b76a8a33964ba3b1c62a095333a02a" },        g = { count = 431, codec = "deflate-base64", raw_length = 3017, words = "NVbLcqs6EPwlQHEqLLMITlLlhRcBox0CV+SL8KGKh8Fff6d7lBUlocdMd0+PbFY87OXLZnlo7yebFa8cFTd3/LHZlnafMrmtNf+l9rOXlYm9YDLlJ5clPZa0WBlutjpbE2ZbPWSU2epF9j1aLknxD/fhkw96bdynG4q9Ht4waS+yocg4WS4u+7CmnB0mD74zJ7nh0Rqc6RuGOznzbs33yMO20Q0vsiTjRWVozRkrO1lpvldu72TJj4w8IsPkRaIuR3vEZNpmv/IJ9eXMxO5c0sq+rPRAyZSLzQSecq8rrEztUOMwoCT7NM3VIRZJhdtHLilHwlpM2Md/JwICIIvRYRSerhIIioNDZHLR8UNGM5bIKQ6pyPbLL5bUAo9c6yqc+Vozv9F+IsCJt4ekqRIE6O5AQhEsUjKd9xb5FU8AaUrl6OCRu8RC3r0HdLjhztw1wMVe3hGSYr3arCWNpGN1Ge7zFvflB94uSX8S3Va4lX8dQC4n3perwKAsRP3sjrKkTHhYkV7v+AyWkB8097uqZ7kCs3J3F+5reNhyhXoEM04uDU+ZwW0W9RKIiwm74rm6StDNPcEqFlvVMpqpwWLvjr/MiCu9G8gDEJT7FLMd0gBmA7Qr+5Qq0m94u+ACoXjPNPNdUUotqfIt5ebd5Z0azMhmN6Dw5MwfZMQiKZfuwqidibFQmJrYDqFkYcANUAi5nTiZTwqdrzPJaAu1VKMgr4qU+16ILi4Kk2WAt7gEWkL5Qi9bQFmg8LRSSVxhCAHK4p8E+OxoFywSUypjcgOOFh4qkuOymgZB82AZkr+eGqSWKDChv4Pm85m5h4dDnOHewAty/Sc1zfpbOuFPkq4xCreOmlgsi1ly4JkqoiQWEL0gPNXWgk6Gq4bkKkq4JvK91p+G9L3SC8KkIHvKpkicgffMDUwuT1rQH1Q24ZVVvHl1lGBBALz1RLOK5CCIMjTEbGfh5eJLLX2QSIxIk7aGHA4qm7Glh9xqJAaOlPcj1cMz/co0gfwLJ1lxsuRMW4PzialSBYEOvR1aRJ3rmcUO06E+f9VKerpbph2Bh4kvcbJTd2s/ofm+gfl/q8/7tQNjomTDCtfPbFlACZsGcscn6egokwWbImgQLjJle1HV+QPzk2tZVTvtd6Nf80wUycrbYSwn+gSxTuE9UoYEWbIFR/kaSbUMSYVZKh0+RH2yoZRSjbLhsNJiQ3T9Z5u9UfrHKG/tR7QucfYfllpsL9qWVG4pExMp0iCmjq1Okk5oLJBU6Nlh5Uxagr9SijvFnu+1tkg3EPkreU8te8DIOoIXMDHlfWTU4j3Qbp4qZmvN+xTdjd5DZ0hoZPcvbIiyQdMwaJ8UGLHOJdsP7UAnraov2nZsu3B98UFsl0LAkhBPeXbaXmg6edoOZ555Z3vhfVJq2vtV1zODx/Og1yDYw9WljJrc3WYfbMJDhByjWcEyNV8eKRHc1tjKORLzZw9YSFWQl07PFgnI5QnA7do+y6XWB8ifGbNSlSr9kGLmruSYWMw8pVia4YNdJktUkV8QiqPz/deoJ6sYlBx5EMQ3A1WQEGQROzvejfuKGNms3XCklWwisH+kn1apVrLRfk2so3K1+qBTS2cxS5zKUabGkvKVJzKt8G8mD1K+pGP6M1UcHfSxAOn/0OcZ9aOuJmSkxaWniAYHfUEwFdlQsyj5HFECNu+iGOSfiQ9IvMje2TRAKoyak5ZONDbqRCxfIDhpWzoRAlVrR+s66GEHboBRqwmol6utrSqUqUZVBVFINIheeX9D6wHW7Js0JHJUPGMBscd5qdRemxtaVnyHTI2+BGJzo/ikB2Ay3DuC7FEI8tB16tddfIcYglXzKb3Xf4/gRGvlQXJYK/qMgem0/wM=", checksum = "507f742f17ebce1bf526f305c5452da2178effbeb70e87db1021668de72aa86e" },        h = { count = 345, codec = "deflate-base64", raw_length = 2415, words = "NVbBcqM6EPwlB7Kp8AER5JBXta/KYLgJ2IqzyKxjwF7563e6Wz5RAkkz093Tgy+L1Td7X7qtyz98Wdy6w7sv69hnz7a6dAe8PPenwVe17fxpO2PX7Oyx9DhQL32Fx3EsP30Ztq7SS567jNgZJt7pbuPBAhV33FnVi88n+7a0/LZLYXk83PrKvtXrgJW7tc2EeOPpzR6nscLxmQeK355JbP082cv7wDuVtYtD9mkvt9YeJZJHSquix2FGhMB4xcYD9bFDWBSNeLcBK5cJglvH2l8UdtVKgf7/O8zYsgiz43AiSi1qr89DjtXUNjfLTOm6pw6ZhWmwiqr65RcKC1sLeOzO5o14oszAsIZ8nwOliWEtUPlqj8g7i+vIGo4DIdi4Csq61k538WQsqpTfIx4h8jKADCSmDtCBnHcdf7fosT18Kt6bCNgjJY9VcRVKS8faZ6rHsgasxdw2QOIJuFSPJFaWWURyZLjgXB3H6g92ApDS3UW4VGBXk6pEnIAMO7JZ5N2pBSB8WVx8vocKSKrLCXLx1ZJiJV+sPVReH0Xq5E9Mnto16dvLKkjl4U4aXaL4OmBnkXOnVcTVlXlakzDBU4dAYfbckndkeiHIbiFHJhti/dzyzrUHdMXGDrADJMB0jVXG4+7aNwKZd8aeIP9o1Y1DtoeE1STP0sSGoqFrA8Q4Ym9C7FDron7IcQ68s9VyKSuOal+ItgpWNGq3lgFY323zDgIGtLa1E8GShMPjm5iOXbln8rx68Q0IP/eU8JWuYdDhzuLcZgvS1bmrsp56SuM+lmwECfouAs5ik4XBIKRk+ksIAy1Bd9ZHOdEy0CCiVqnf78Aa2iXIW4dABh3xvIqHRfHoYFYY+TPppwMNYRWQlueegFBudxIHk8O3s4xlBe9VnTQYW/K3khW3pC6WVeqW4kvfJO9AP6Ns2OF86aLMY21PrxDYQ7sZ2141rGxKAzK5MA98U+zAE9xe6Evu5A9/0PYUu4GVy21oxgvF53Snm72kKCSu6vcoLSmXOpNn0SDYCOjUb5JTB/GQZsCiRxweYn/m0MjUmzPNUYXlQmnHsDCrPXfSdK495Rbl+skSNl395Q8/tZo0ZVDYygbCYIA+GY99KzwJ8r1LnXqQf7JhOWxIqsZENsnEJwlzr+aalDyKvg3wunB7mCoKs+Gmtm+p1h9chUsP4sKs2iOF4jT4bAtp5C1VCOwOJ78OiRVBZ2CVO4hdWtrJgmxgLpoIHxLKpOGWGoEgQ8IGT6tZnDrH0+6lcgOLBIjboNFqgxYjK5iCULuQt8HwsG2KvdcAG+SYPaYh5gqToEJg6VDdma4fNJbQje9SMle/SAdnKiflKyczIVjG9AOC5P87AwnzkJEgP/XgwWnm1DKykObmTu105KjDLwfhUfLfXsMmObtcY8bOKo1It6rDsz77oH/SW4+a7y/JBzllXJZULiPbOLzNZrK3fw==", checksum = "cb16ec4dd964694308c276b150df35b461e5e03f8eed418a55f9ceb47afa9ba6" },        i = { count = 121, codec = "deflate-base64", raw_length = 847, words = "LVLRbqMwEPwlSOIqeT2plzQSSEGKbPxmG6luiCkKAdJ+/e2M72kF3tmdmR2n1dSa3ml168yH0/VoUVQR0l7KPZwuztSTNRe0+E1wurm3epUy+u2FLYOUcrTHq8ALvr2kpcJPn67OxCWkd07Rl/wmLQfZWTlzjh1xD65t7h7DbLJ6h87OyBQ18w0b9iDok5BQZUg7Z5qbO/XOWGEtw+q5xQaVnPkUQLSbvWxY/CC7yrWlsD4kAcSZokFwjzd/wteTuG7ygtNPwZEghamHZ5G2K0Z3uhC6E9bqQ9GivEaKBuBdOrNntuDa10iAWjsa+eW3nxDm8AUnRG38adHy99mSYMF94jVHT/kqEX5qNdD584/TEwFDdonaHyx1AXeFbge66mbFcrjElpkamsWfKnRmkwu21L8EiMk0ZAXA1JkLvtYclIrn30DRb8BV5FQgX34BDsvJk0c141sLmfW33yJg2daa1hm7BBxHFFFtToiS0TuMhoOm+f6vHVGUoOQ7SGgD9pHgn5WAZ+ygSCXG7bw4nBFByaMZsN4d86Uh8zAzg2MMibHJLcofV6h1kFlGD55n2moknzSrtwiKeMZgSs6y6KH6Bw==", checksum = "afcf11c35e7a463e88a698fe0351510e70c0ad902cda1655d425a1a561324a90" },        j = { count = 131, codec = "deflate-base64", raw_length = 917, words = "NVNBcqMwEPwSRpuUdcwhOHvwIQcLpJsErooN0nqNiYu8fqd72JNKaKa7p3uI2VbDxxiLG5M5xjzVof2M2a2Rx5z4Voa2irl5hu633FbfPuVYohmlJIdO+ppH6kaWSF9xj177UCkfffsrZntLRTDtdyTRRSvr2J6kZP1Pize3SVqGw3vML18py9FckkFDRT63pAK+O28CpsoC+GQGaJkuXvqo88hRDntp2FGEM6AtSpTtC9mb1zMw0Y6JCjBzMw847C4d0PB32N4MBD58BiadEAc9tWxvz1RjaAosbg7dm9BOfVGTKffhCT1TxLSEWsDcZuSV1tl1+ADflV5PS8p4m5PZ+gB983gTIjr4lcDQ1Gq5SWi3u95gvh/6Ym96u+NWnPbZnfItOvsckIoz6mcO8MVeNbjXcwtbV4poRm2/q1ksASYzurC9MZr04mW+4q66Z2uo3zXiPcfEgllKyk3FkkbcxWrMHtYh4iMtKGAYYbJAc0z3Q5cst5V7xqEDUaoe2+PWntnSM0HRnVAGW3lmtPoOOhUMq7+J2PMAJvYTKJoR4jhRS33Sv0PjwM398VwpXVPkoA4iYjudOQpL+K+A6KZ8o6D8Aw==", checksum = "cddb9ee4ef514128043b62c589420ff3526c6ee5063f0ce248be21f6d383e3e1" },        k = { count = 223, codec = "deflate-base64", raw_length = 1561, words = "LVVBkuIwDPwS2JstcpzDGmaq9sCBBPtmJ1MbJiakyCSQef2qW5yo2JbU6m6JaHLX2FM05ezrKdqPrj0fo+m6z2sfTTW3e7nLJpzf5eeejBzmKdY3uTOhfkTzHL2ZonFrMjsJX9L1j9yt0SJ8CjXu+nj+K3FzkB+pEIZjtMjyS+6mZi8BefVDj7JRKuDu/E8O+3BAvU0ECKlgJUu3RFRwP6kG6gsPy5+ILM9tMPqyBogi1EfU88BZrWkAiK+IgGolePfQ6hvtb+VdMYYrUk9MnWfFOUcQ8lyS8dGGnPYSXmRmKRfG5VeyiYWKhUS6KRkJr3JzAM61RTJ5gq/cpWsjh11CXDG2fCIBAP/dHI5A1oKC8trySfY1D9EYKqCs097lC4XKgd3mHy+FrFJnc0eNRI7zmzIv/RUdINlqZWp3SeZdvvqk9HiStYmAVAlc9L59Kd2AiWLhk5JN24/cknnjobR7JL78rZ7oSEj1oAvcwAqu4E+xNPYNWSIoL8bG/ANZScnyNQop+PzTwFJu2wwn9eBGv+Czi6/fSStyPrft4QYvhT0CCvjadGNzgKgbrb56EcdW9xYVqo1HWTBIslryMgW2uW2uD94BkrP+fAI9LJutdjSyAhTjyDCZM581zRDOPc1nmZMvi65lt4s2VniOxdjQREuDu7y2Z49D+EwYjPCSyEhLLWqwzHEKHePKm1pq1nmYqEOhiskc1TtYMdYeccz5arrSWSmlTbhu0h7WRBAzs1S3lq3MAT3IhNNnKmqXAwdvoZMlNUzrvuhICYA1qv6Tis2vIUn2SNcBfJtpffcduScmD8rLB7eGhNN82hGQMZyQZNQEp+hHK4piNN+dckDiRuWgvRMklu0mIGw16NjPhFSObLMUnDvdDOw9DHRIIzjNR6ELcFL5t6xXfiOZuJwTXt7VUrI/T4q6142ianLwMsgSJlry2XNL5Yuuw0VBqBxuDjL9MqKJHW31cOJLuAerRDcYds9Rae2VVo6MqrkQZ3WNWGvVq787IYk/4QLsLE4xF1mnaroN/wrEL/vdfw==", checksum = "3fcad2f6d44d7cafc7e9425f1965a92835d9a33ce53db057c2fdae85a69cd1c3" },        l = { count = 409, codec = "deflate-base64", raw_length = 2863, words = "NVZLc7M4EPxLGPKlrOMeFrOHHHyIbLjx2AoYQVIOmMW/fqe75RMFSKOZfsyoOblHm342hX92xdic3LO6bM0prNX1wx5zM302p3wtUzwG/sv3qrB/bsSSwt/qzPblc3V5s8dSXc72uFfXf+yR8M1l7YwlSc19tn1sirDXF5wQOhzk+uZqH/3Ij77vZrzdWpxuKTGXscnwb+tOfzPB0xHHljz2u8R59pHn9c2MzHT6f31zsQ15304jQlczgm01/oWF2/3GdMMTSJzcpvOSEg8fkZi0ZGgnC+ZWvrlHEws7Yd9DSCRl+mX75vp6xkP7FsKDUrDvIEAMOgudH5gEgn3wH4L5vi1Qw1phiUu1b1N9th2ZvdVMMOPDzcpzQJmFn0XOrjJ70ZhyiVew/Kc7faHM7gLef5uCkGsDYbU3xVy0r28zVHQrVSaiFP63vCCz0LIUQ2Ik8tiQj0i3CM8a9YWthcD8dwc63A0rERNIhIjEDwsLq6SYdKDYlqTMs0SeppcJah14ApagsHubIuahg8B8YEzTGZPXQcHyxFusfaipiXfKxk6YUO1K4tyDUYAZdCb+nHjwQdymNIL7JnF2whVlanswzOCAd1IVEko4ZFq5UsII3cIW0q6pblTMTzKWKeviLK8Al0zw3GQu23CUDUfakOqJRoiMrd0VpWQi9U1gPUriEh2QVqR4o//CLrEvzQV47iUFtkpZqVQnyPOVKVm1sm/F5iF555K3pauUBPLChw+sAf4baQuIyGIitJ9IeHg2kn48oSKpe8mGtJSkY4Et4OnpSGVR5b16SCaqbgLZRAuZHiqwYlJkZgsLMzZhdJ/WL8zwb+8uCR92kLXDStLoJgEiaTQ877cTElBdEUzCZ0KXItjQZDIXkZcGjSM2lhtLySVaHz/OcoeldGQLYo981ODB9bQobDFS8+TBjPClBqFeoATZe1xaQop+U8yJSs53bg/RD2Iz3JXZCx4i79Qgcmq+6EIt95fAGvPhg/vYMXuxOVSvJSD1yZUhQRMHLtOZkF/VyCRM8h4Ce13+JuQPInxRxxx4QuAkMawbAnLj7IA+oYI4iP6IIynS95EjeWWsoiZYbUqUvA0GmrKG3PKM3duCUTb7a0iRFQXLudJolLVXOi5P6ZVcTkUUvklScrgxNrHzqS9JyZiGgG7SvN3jYChnwcPtcXZoLLlBSv4l8m4oqYInkw+L/s3sE2F8zT9O0YWdFmyClaUjyKsmwlTRR/ea7tc4C+puIc6HVX036a5/cZxBbpHNQBVYYVr50Fx5F7f36D+58dlyTNxFXA99YlpcS0qYS4boI2m3jzTyehDnJtwPMYzsIXZVia5i15BsMIhIThwhFDRuCUd+JJAaL65Xx9QgyjdOexMDVropzhxq3q4xxHNTngeutFsQJlCuFmT0c+WmUZDp6pCAFSRPpz7Ur3dZOw5MtVgfvTk3aQLka4p9YmvGxMN5B901XgfV8YIVGzyaFdx45uQiWIrpNh0UJSzb+1h0vEg81GYSEuCf/7JD89rE8fkhXD7Z0llDvPf86I4y85pmKUVrY4CFeCf6wyZnaqXqOJ2gl9e1kEaP7m+o5KB5pOtPvLjYrQS3PEf3g/As6lqNBQayUYDmaORkKoxGX+Pw1g1p1L5I/0zL4Obxqbsi3Dgr3b4hyGpyLnawH87p/C4RHaza/wE=", checksum = "b098f2d1be5e7eb3bcc4604962aa9268bdd6bd33d93c657f0dd96e54119bf029" },        m = { count = 502, codec = "deflate-base64", raw_length = 3514, words = "PVfJcqNKEPwlBLJDfMC05ImYgw5ulhvLhDWihTxC4IGvf5WZ7XdSAN21ZGVlldrC7brb0BZu69IfbeGTuvzVFnnSH9/bImz9yb75rcFP/qcuznZy7XHEbXX5Zi/X7oZ7r79vdiFPeT1MTQYrQ10k9pT0JzwtVfphJyc8lX6DsdLvdeHZFLD5UsFKGGnTPVr8wKY5cnN/xMtdNSKWhCG5a4s486mmzbUqvuxp1x/hKOClee9g0937AtefFU2P8Ff6qS7NSnitiz0DHHFh67IB31pc90vPVKYKQfhXwTPW2cDICMhLm70xafNQ+msDYy7t+TNXuOAZfBmWFkHku/aEe38bXn/q5drCe34hWH5lYijHm9A92Ld7bfmVfqxZqrVFZC5tSuauWK7N0U66z5Y1GlWqARAY5MzBJahD6Z8tcs+XDm7dTYAMjR2xbx2CcGJBPgNP88CihqlDHXIlZo6I2cRYgsJ1//qCNSIuZpO1tQtn3KvTg2hzYDloZSae7pOlyp8y9qSxMHTZGUiotqOSXkna/Ev1ezD3fKfCXRsam+sC15ltkT9qoUQP/qkyyp8zLtFmnb6TE0A3v/f4CatO3nviMgu6yJBHfxyYO6+TGmWIuPBI4S8qarzwBDVKb3WfgIRSmbsUSWfkfL6w/D8/W/DFzwipCHPDJhn4BLr9Es9IlPr4rpMId2xOalGG9KhiHVJQURR2U8+mtF65o0UJq7tWZUcPETr6S+jWxyMPvRS6YVSau57MutVsyoXZguwHAFllZ7KVSGQ1EZSUWCwIwn02KU4mUUp6cneuAI8bWp60hsXLVWVcCJa76sKuvZ0ZLupgnBhZfnIe0gXkM1EjIVE8j7CZgaCoESaRdmUZg/rIykjkN2G9stJOFcsNOlUFT35rSaKRXewTkX1tSKK04cl9FNXfLPFOOhh1yRpWelZUAERCJt11A1HKp54KrWxz9a0P0olJJ0UU91SaFzFyio1XR2VnYhsTyyWH+UKNdPtvglHnE9ikOJK74tKkl1tDQLYoFySt5UctvwqQhPCYnrH7rQPU2ujin59S9q+qRLjRmPXYh1hA0Yn6SU22pE+SmeMXdUkdTtO5/FnUJINk1EaIdJfsCddKOXTpQSVGLPeWYD3YD/kkouzErJkzxwQCYFlXSQf1ZEImfeHTVIsFVfFBWSN3154cXCVBFtKBcXJypUpsrRj13LADEiq7FYBPO9LG3LLj1o6cjzwzR2eGi+YKJmT49vdbC+j9VWTfItnFs00siGlaSIj60mOShKWTwEtGtQLkqrtd4NMfUhg05aAlgn6K2lNpUkoVk+8JFAcmcgiz3G6aJIuIMqmdHmqnL9XvQe9ujQtBp4lQUwe1azhFZpMZehYeUcTVAau4O/YcE3/ab1U8IAidnBmSiQB1fpOQafTk/7fhKZ7UrIKVcAH5wAIpGDMKCgkgD9x0wJ6fL1qbZnC+FDUMlyZqedyJmMoX5ztE9Y0lJp6TNpYp6hLEEWrKpK8NlcGUFlZeNSLFT/Q71zTNHJN7Il8JQclaEtVb/ZdwMFic2ZsmJQidtZHsBEuTy0m6MNzeiDzdrlqwZlYM6NIK8bS257BR0mHTirM27M24Ul1YMfDsrLELeLQkur/apTa2k78ov7Upz2KBpjakxKqSvYs91FatRktcRxR1nAGEwMSqllQylhBHVqYCDOw420qQmFM5nIZGWNW3tnmctdqKNkwsaTnqNgJis/EUh81ZQypCro2MHcAV1dqXKOU7HdnH+adUFg4pF++xRqVtgCN3DWWUaFKucQJpnOmCrU0QHZd0GbgbCb0wdzCSGwQRzCMngjBbNZ3mSGFtHqKbj1N01x7PojB1PpqmwGOcca8jkP4S4/wemKW2NVpZsNtAADmI7O/HniCTu1r9vJDwn5odsYsTcfdVVZlJovDQy7jMxta+xXHdlIp6FM/iuAbyL0E6KJ3H/4dB2+EP6TwDjKs791YX21DbGn4+GCdR2vextmSdBp+LW4JWTYxBrhV9XKK+1VRAspp37Vnxz9Zeunvheg7M2Mz8l+WQw38=", checksum = "cc58eb2b069823e97d990859e4de57177a32e5d2fb3a47150de943a81fdc83a6" },        n = { count = 212, codec = "deflate-base64", raw_length = 1484, words = "NVRBkqMwDPwSY7Jb4weEZA57mEMM9g3D1iTBeKiEhCGvX3WLPbkwltTqbimOdvb1Zxytaev3OKYimp18vUIzxOyKrhziWK2h+SOXt794UpW+/og53fVl0deFXD68Ocnx8vWCuP4ocXZua8Rd4kH+pWtb4muOONyuP8pRDW3zIV8r4kb3wmV2s894cu5wpGvAEwGBADsppGt7AJbVG6CeOybTsu4t1sBiQtMBEi+rqR8BYhfQbcotA4xn9SHgSRp6tOm0UEoMsA/2nr5bALQDcaaCkNwUzBfKeh43pM5uaFE9zX4EBfyX0zke9nL524Msq/WEM7QiWdBm9cYs/Zk6uKQgBuUze8mZnTS9R06V4y0izpJ54SzUOwWPnGUg3Es8qoxgqdK4KgcyOMUjSe5BZBpVsV++OVEcVij1svQ0w8VnsDQGHEIdKlRLd1BaGfBsm09Wp2IzD/ESKHeLXhYaNyuWpSNc1cjeCSld6ch0IxaR8X+hPQSniaprRzUfyJlF/sMXrBGZTA3WP2O9V1/vlU+gXrSsZEG9LbXp2dgQYGH7HctOuv3pIaMttMI5jB4BvoE/B5V/jQamXdW0Gi4eFD6FLJa1G2fbPEwdn/ym56vB025PypjUZzAtwIsqiPvhqLmVcVb9KZ4vGdCj6bSj3TCw+PdqGae0ihxsc40UZyWk6kIrWnVISpxbWQJbYwwQLJ/sncLp3KaXVs+xFPC9hJ+09285tv4GnZWHboYtTkYNyRbqLgxyOnIwmIeiG2F2Qz7Tox1xuTnrrtVLzDspp8FIlkvsyGVCmp+dge53yi9tEufU5c2YXB68TItSXqpRzmRQXo4bFu2I9r5EA+ZvgbzcNgvT3tWkG7PQ2dRhBtfcbhxD+6RiwgTll7k90fPMYnS4VlaXJcdN9Oghjrw8YofoIFRbeNEybuVCkjUDuK7U/XmjPyXg8P4P", checksum = "3bbf9d49e08e21a2f18ee73b2102ca749a8baf2aed5d5779a47a863dbfed59a9" },        o = { count = 189, codec = "deflate-base64", raw_length = 1323, words = "PVTbbqMwEP0lsJto81ikkBZpkYpUEvsN46okmBSFXAhfv3OOq32ybDyecxucLk7N/sWp9NgOn04XnRtap21w579Ol6M9vDtddY3+dGpzbXffTtePZic7P9n9h1Pz1Oylrn5ykXKpk0PUqWL0b/JKnVj1Rw5Hp2VX3JoDrgS01fXNqM+4k29d+JJXVJm6Xe/U9Wlw06btIOWrBFfU3KOR8sEe8NhoBrlpB2DRtnPST1X3FiB8BFH+cOnuTvipVXBvvdQ9SHq+W80dqZQXss3YSI9rNqpPHiDSKEg32h1oTk6/Sj/BSdI+LkYeUxsphy4BbNX8MNDFj5BVhVuDw83aUoLeAkS1wiuqlEboHtphK9Ld+XSVGICfH2RbngyvRJr5BeW6OzotjmULGeUL1NVBuIsgpRxu5UpCYuIDJV/b/UOwRP/sZPZSXlx5xd4JvroDi0pHA7j5kzfzxaBu80Oti2M8vMRdF5VY02LbtWdRokwMvtXsjn5Y/OiRs4yC6HoBFnmsEbhqtRB18SSHLGEHCR9CVJwNwFd0E1qrb8S0PcO4BHUSN74C36XARwlsNCcb/T5Bv99E+t0WC5MFrQVuHlUCMlAZv3ClGCmW/zFSrlaTObwiUuRnB0PwgTTHGDAxFTTzqLW//cJ15JA0O+lX9cigSEdI2YMpDydEQ3dTgw55QtJlQv/qhFGcKZ3AZXpWo1MvUWRZVie2TY9xYKPk3ZUjgyvg8GRdKW5KwKqA7qqKughOaH3tWlFCMsiwWyohh18HasbJsSIWNAvQTBf9/2R9YDoccAILJ5wd8iVO6sR5qKI8MgEcWCqv63PzBvsvGDWaCpyBhuOPAm9Di/9EEYglYyZU6CGPdICpCj5IJvzCqUr571E2ibuuVXDzZCIVCw7zxF3xxADBVPheRs3gdPyxUNZg1fYf", checksum = "74b9cb6a77c05aa423398846830bc85bed6a56a4b04ec432129d93e748440a91" },        p = { count = 616, codec = "deflate-base64", raw_length = 4312, words = "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", checksum = "a34bde7449c959b39d0eaaf0c76e72ec16048fc6428836e86c2d655996a1661d" },        q = { count = 63, codec = "deflate-base64", raw_length = 441, words = "PVG7DsIwDPwllIIEH1Bahg4M4KRbYxBGJCgSAtS/Jz4D06nO+R4u+2PhfmB/fJ26g0FbQSa/Y33LOizxvlcYc6iQRlJ4TV6HwvmhELsF9pqbUmL3xgKkZaI3mO6ib3wHhd2aaXub/ABN84s9jL7r3Kv79WeEEOlEiDR+hw5iZ6jM6kCbOVILFYSvcZf6Zf0KN1DhvETO3KJKpdD2GaompVXwltrBPYBSgntAxRrZJcq/uzJFKZSu0S5op0vmJ9GO/CtmmtaonrymTrOdR8bGHLCQAsKL9RP7D8LN8AE=", checksum = "58e56f99b53d050cc64da9bde220688f8251ad5f040e3f4972d04a762eabd7ec" },        r = { count = 434, codec = "deflate-base64", raw_length = 3038, words = "PVZNd6M4EPxLGNbzouMcIk8OPswhwnADPC8YCcaJjb3xr9+uKnlPeqCv7qrqag2zn/ryn2EOS1vfhyVc29q+fNke9vbzdDz8tuE8VDakqePclhv81FW2xK9N+T7M7oG5JRRcksbj7tW+zv082Pairz5sydj+sg2u0NHcYEf3C07ZtjUuunYHWzmmBkv81B7eGAvm0qlhLPe2tjOdfoaZG8Kp49d3wyCu/SFiGHYvSKyvXznsLE5/RmRzKhvLdvaxq6PNpR6R+R9C4pEvYoC4CNnyzNmfuC9cuhqpnHrg4tcWF/miw9HuRlzc5sgz/x5xgyt0dBKQl3wf8wtTU+Hox0AghXyaNXduS2Q0t/M7ohZ0sf+FqC3HCKxx2BJOzC+M/a4AVdi+hLVFLEbcL2aEcA2XZkacY1N+IGoNkUD6RbBuGAuufSEu1RvTRJxB/LkLB78hyD4TkFqwmS48xTJinJeGHMUjBreIVMP6hcEv2Fdxg7vn/HTDScM4UCHfioxRg1sgmB7SoIkois0Xm2NkS3jqsy1flRgysjlEFltifSNHllFdkNsZ4T64JEwUiq+I9ZhaCro44sviZH6FhtP/ehGpTGXTz2C6+MPIVu7z26amWpv6DcG3Uuuwa4QSllwRJ3OwJW7bsCinjtqV3MKdKwEWw2UOaW15Q5TOpB6I/UNVDCArLoE0qHlWY8jVv0qtnyq8h8R36yD2dOugF/+lnyXgWUxnMwDR7V76BCDYcFfwUrk5CumfGhJujFHsgm4Rxd+Ah4dFih2Ej+kIVtxZp8hYzDXI31UZ3XjYuOmBJzSIlRUzchuKz2TDqMeG0E00qxS5crxxX5gGVIevuDJFqtzd5CESGG5ncUl1PxoVl9RzbRhZpMlZDjSdsd3hvsiysLql29xJY/giAW7TlsLl8JNykxfIcKX5MfW89sTt41ZfsyC4UJiwizcJbE/eKb7lWJMOqg7S2DMVfj26HX+yws3WCNbjWXHcLj9D0q+UYg3Coy66dtTnStcIObGzDltZVV7VkWSq5mCL5EazKp4ORl+a6VlJVpIWeUhBW4PPS0t04X+ZUYjCejxSbpP2UZGQdy0z5sqJPCRpCdoljXSiNMkgliaTSk9+WgI2YI5BGCB7OiZdn0Aa8nK+St0we9baHgZ2PNwXShGgokyziuQysBqvHQsou5vpDENszbqMYppOODfZnnZqDATy+0gkCkLgVGPGilxRXe2qWNgRkBEZK+CK8Hnk4KRyM1yKSM0t2MSLVPCbbipvVRUXNH8TOy2ooIStuSEVSPhdlsefBBKwQhMZM7UXt0GlLiAVGx5SXSVuq3yYeo6Z3E8ITJYu6NxJz4olxwL1oP5QOTDxKKz3guCNHY9NWGIPshnoM6qvMDF5nRTpRRykGFWwiCy3kE/Z9trl1wVd6qqmqEZklk5L+FbuZwll7Xi0nlRuJNN4E134k1hnq7SKA4I6zMeGOVxyR5ezr3Iie5wMlBu6mlPTd6vMUQ8sv+RnhdSzaKUM1+Cpc63c9Xb7UCuIrHA6StU8c49ysFcZCxrRqh6nsg+VAIm69ktSTDL4Uq+nQi+du0r7rmZqEKBPZ9O5DXyVnFhxhtKidlZlct6I7pxV984HAXSGxgCqbrn/CZ6/bK0h/mFpJ/pE0tFJVpnyy1F0OOP2Qu9hD1BxeUVmZU9rHoe50Gttr3rAfVvJ21orol7Z3Mw86LSrbjg/XYpfqzZ8dvXAJbwhSaZFJ3tiGeKZRqF0pdo1iVNIKWYlE0931XtXrwsDktX4pRpDtv8B", checksum = "ed730847ba9e6636331717b53cdd8f9af450514101c327b3b0614f46cb655504" },        s = { count = 1091, codec = "deflate-base64", raw_length = 7637, words = "NVnbbqNKEPwlA2YVHtdScHKkIC1ScODNQLSTMHZQwBjy9aeravbJ8gXo6a6uqm53cTG28b6LK9c+vXRJHp3f/nSxG/vrSxfnU/P2u4szd07snb/1b/ZSDfVp3yUH3x7v9m7rroN9dz3b5bFb+survXhcl5RLh3dF1B6nLp4jXpAuvT0hqT75XZU0J3tXune7dXLgd3E2tfa8pPR1/Bf35C/zj+7yaBfcesRpT7/YL6vxHd+trn8aeGt8V7pWj22OD13S2zt7en5tkoEH4wVj9/QHL83bM6O2FCT92Fztw3xr4lecloee/dlOyzPc+R2P6c7xQxdHrj5NOAN/Mrv2aJcXdjMes43tYP6zOb0iEy0SWbiep42aS43UnU/24j9xs6Ta6hOeMLQ4SuVwFKTVPkwOU428FFGH64qvPn5Eejqctvf4Ljm4DhUrnOKMGqRuHdtLh1hqfJfNKFycOtzFrsPZLVnMbrqwYoelTezDw1hbspJqYixF1B8feTN7lxwiXndw7ZXpaRBZtLSWT8tgd7SbzZbWAcdELHb284mRdVelB2nNoi6UEdfZaVniSUcZeev8h8XJv+vTwF/icmQJkQ2Ms1KpVosasFn42EOETCR+6oGXwoCCl6/29ACgAAwWPOBmOGtwMysOIIwAfxM9OINzBEMa1bGV2P9qcMHqkEjLPEDLD5+J8iPxgvrZdwSm25q3DsdEHZLqo4sDllA/u8DqV/nGrkv6RZkwvOzYAYLwOWYiu+szINywHyKCbw0pt7ojBXN3/EtE4rpqZudUd/SK9dg54cGUzw/ANKnSGkfJh9AdeDrKDyRnPIM9gTWyVkOAB4Npxybhh1PLDkgJDbew1RyjBrzfGG53ESLtRHEeq8MX1tZerB+sVIL3rlb/vb+BC25drO9wotXATpyhnZJy7NDFhVX6N6GorurISxfezEU8ppEADr0a6oBI9dHKGjGD+C4iJThl8LAg12gEtIzfGjRJdmNxyvC8wGcOHGL4BJJBF3h6vnvHGSJdbr9kHQymf9WNYBSD4gNvFpNbAeHY73vC5uPMIDbyxMGu6/BLklV1ZzkMpke82/GdIYv59N1lzywZaA0oLQO0/nsgyeHQ2ado26iZeEGrAdf4MPVqrojsjbbAY0c2bL8oPUsTD/wQkfkb+azcWkSWscfQ/YTb1FyEJRCLNRC4bmW/o0XJSwSKdTEY017YQI5AsRdylhPm15SRRQvTA0yw+7vLDgfjdzMLYJlnU1rF2JtWRjT6xiQjZ0i561VGYt46HO/yqD4FknshXVgi2dN29uq7Z4Aj2z4dSdSp+GVVgH5PKjG4HXFdaIuNDOZNMP/i8v7pi4c+Mme9oN+CRk1JIHWVVwdMZwbBAjATOPSOJNCLpTxZGLVFpf03W/vgyD09IRzncw2Sy25k2pQhEW6TFA9ccOUvZybENIBHST2PaeV/o6pRufyN1FXNZ+Zs6dmiYmh8x3CZ1mojCaSjGGwE2yR9JCyJ1sqRxak8fxkJExY8YWoOogZZSVCscJ3UCVJwbdlcEwQTL5JdpqDaEz2rOs7AcAFnLU1IJLBUbP1pRz7joa22NZEMsTksEqKv89sXHAQZbJYvcKKZ1cpPPWI+Dex6B9pGq0FCyo3WqFiIEEdONn7hTyIFMS9s2CJ6v34xyXys+SxcF6Fi5BcLsPrmaZ2gP4t+oVyvIvEXcVbHF5WqkeY0iqxF4YACGIkx0DYJF4buiyg4vupgcCxX9a06BymfgCV6otThJ0lF62CtXcfgnk8WAET2SnIkhwSAORLLSqoENALhomHTiL+c01AxXh6gWN2ozM5a26L21iSWF5ewU/1dxkzqOzvoZvKf+RBqDs1QlojBbqR0v52FMybLcGZPR3ap9p7+00WMLCU5QilPjyy4fCtfKk/rcHC0PwZTRu3pTXt5qewS6ImR5RHPkAsvVjHU1lgKdZ8Jb5NdwXukoBxG+bO4J+9GgDAsKm2TgOnGIK18UHZRh4vWjPIQEtopIIQUy4SscnlzIH/mGo8VQcAa2V3oAM0L48PChH2n5iLFKuXiSP/JqSAb0AEkK2oqgZkLpqFi2UZ3aITLwl1b4jrwvPKy0u/Sl4NYTPgeWDiiYKbeOi+v6PQyqldobc0BKhM7oVy0XcqXr8EayXhiXvnDqlDxgmdwjNMP8j0bHRLqQD2SvyYzxFWsFCitpRi6ukEGDZHwE5YzkuMa5hWH1obTQa79BCtGYy2noxGK1Zx90Di2GvLySEip/9gkTg53DQ5wgTJTbztighh06Hd6IkoWz1A69fSN3WEemoz5AcmyJ9BLzUJddoPRhUu/0KkGtiH0/Y+sn9o3+xBCaI0skbwLNI6ayky4ncq/O59EjlBfPwdDR2bIb6E4nOMsJNZItfV7toVp8RttfSc6VKn2hFukaXCOUDj7JR1SLzMbLbS2mNz+kBLItHIe+b37l/IdfTntnUg1+5S7Hzv5VupRqamglyk1yjPvBuXCMY2M6dI9bVrPoyCDtPU/56NGk0Q+hKbUurGTSaRXZAadDx1Xk+QWNleqfs8mOlVMPbRi0k0JmJkaWumIp00FIn9tMH1WQSJ/OvpdDe5+OFMYPun5KnHkKma33rzKdHOsNuhjsvGN3G/PdvrHg5w0ItGTqRrjDKOCC5k/AwwHyifVnolkB5Ti+XSUknyc6XsW+SwjnUcRGQRao1ces5lRRsQptc9tOCCgyS/FV/1Wa7Rk+5JRYC4HEYSYHWfPNOn7gd1R3ZTWhdf5G5HsdL5VUt5L++cF/GKVlgn2Utgddx5zkAmryrMqrXzyKPtGP9GUtdNRhB7jOokNi2otivLPFHZjIvklA+3A2YLP4+oDx6Tx9FoweGicJZLARMsEs467RKpmsMQXxpLfSLGFGqj6rLFg6JcwMYhfNmY3WoKDZyzwmC8iFnrMOgxGFEWthKoRU11SpoE/1VW0hZRyoiC4Zm14PKnrIKtZOL2LOFRY/VgqjuqcCu5KCFzewGELA+OgVdLEcQ71K+QVXaSVUMKFVO8CWjkKHYIz3jT0am+TRa24lYVbpZQrL7A27LUToG5WO966UMHnjb2Sf501OISDkWZMH6jF6v5qrk8v2qpMjAUKlEXiz6m5KhOy5z1Hy4Uu1klQSi9XqWXOKtRlXBBBRdnvd64+es1qZu8QYHVnV6VKTzWAPKx+mlfm/iRNPT6ri9G+O57IOOQy0MKduPNguIUYrJTFyRRLHvOxpQZ+r4HDKYhSNs0CJApGzr7ZQND2Ev1U9gfh/lE1d8Lgb3YjWgbaAYDdW9bdkwuQCSRZrstmJxgsc4eaCiRZaRdGddiDQtsYhIs5dQp6xJkZRokkoMGPLYrxnxYgkhR4Snk/amkoU4PVIzc10g6TCdAhVYZquGcb4nk5t5rUqo5zAFn49n55FHU9kwDDLoHW/YeXYxNFxyJF37h1MOPCiV0LjVmMsi7vihoSwrlx0k6OLlbLqkHpGWkS80RMtKtVYgZYysxWm4CykHvAbnC43yrHHljC6lF14OYLk/4jnSpHLx+Wt/DXWFpQfacW641cnsHJnHiN6ljJajGoUYixVAMFTLs8MtGL3C+7sQ7Z5TosDS62+cdntOdcXTkPTxTnw/nplSlg4YKhc5wRnPa70aiO02RayBIbdpkzNbPfB7Wg2gOK2HR/MFn+h8WpRGTBuPQye3jQixYh3FZQEaprfwpOnAcLuwSZtn1oGcngTUsLbchLaUARlsV3yqCTilbB5G/ayGt1bAiheO/kLlxzZVtokxiAEiRy0/bAteRW2YpIIWU3lgMzAm/N9U1+EXYtEzvSKPc2C7UqlS/IZs05Bsya3HNk95N+e82GPRUBphtVSSk93E5CTL9rbVjbMIfHXGQFtglMS4+ZRsx1wT6il4K1lbuvKKZUw2e2BVV7IolnJE6smYIVA9hX7TGzC7KLwmkC485jJWfB8MgZ890aFihh0+0JFGsnaTgvN1/AiShi1IUK7ix1NSVLkAod0P/DC71G2JRSgXwc7DkpzwJ8UudgKj9s+pdG6pvLsJoW40T+l8yJ1gaz/nvJRALFQk4+bEAk9vpUQ+1NK4lwyQHHrC0cBHQ6dBwhrCYpviAoWD5ofxaQxUk400qh0ETrpyaM1Vpqa3seNpDCdT7zCasWitmda+xSPT0LrfnYxLo1MJF/n9VHbJLeCQxOffstDPo6oO64ZwrA5VFAedj2mn8R9DVbaGgy8f7ScpqEhNHLzif/qYplQaT4wsEPDpffYWVCCZGrPAiYVZBP+fLqU/t57QSqTfZcY+Ds2Nq9LEB+Df0geWFzcREJMIjZK3mbUjudyPGvsOyi/8cmIgSrnbvkTI5TyyM6eDNYYAYYuletLNXMXGMvwWeh3/mfxoO2WySPMNlwy4E5QH+ewJAfNPjZIK1pQuPjQv+CzRfMnie8S3Wx0RqdcVi8TDSlzoX/nVjUPO34786kld6m4UDjuP+lBZ/G41K7SrC+3BMtqmyok+bMYfrU0AS5fiQY8Nhsq7X9CVaFmYj+Lc7U4UsYufXv4537Qf/xztXxldnNNXNVGo/x31lYxg2agV61aN1pzhkIU/A1PNijdnko+GeQQf1JQHtu+qed+BXlwAWEjcBeitawLnr5Hw==", checksum = "bd8a6e07e749ba4ddd402c97e18d25cd6c17c985eab9dcd65dde7a8a41922869" },        t = { count = 557, codec = "deflate-base64", raw_length = 3899, words = "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", checksum = "890f788a94f0e0e6cce00ed876ed66e6e7982721d0a1c8a0fabae55c62b7be19" },        u = { count = 119, codec = "deflate-base64", raw_length = 833, words = "NVPbiuMwDP2leLJd5nUCQzqFBloolv1mx8s490BSkvbrV0dun0RsnYuOnKAPczh2QR8mn1+4tIHOgapoP278NViNw8zpjcvD6TrQta8HBqjZ6CXQaUQLnXo/fPNhY7mTiszST9Ah+hLUT0tgaXz+y2W2Y8cssy9v3Pm6yx0Xqu5Wf6PFf/yBF593SR1eNqdxuBjC4d1SzWV1xJwqes2c1SSycTHojKoeGaceRkM21kMWyCpfQuHpMfSe1YPoheM5+URnZqQsafbNYuhTI5wHBsFLLneKJwJuEBNst8Td5BBIEf/xKJyL02d0QoiK7RWWQZ7XTuxyZijMiSTUmuw+HH2ldVzEGWTVlpL4m+6eksTee8lsctI5G1ncInle0x4OrRHABBxVsx8wUW/LT8llRJ4sC7hYIpsMIhB0Pt07CY5gb4Vzvxs6C/wouNTSGMCLLuXSOolgFM6CX8hFIhBLq3lv85ct9fXIr+4UAxJcY40ZWEGmbUFGFW/zKwllcBb0Dw7F574lshzvE9sEyx69qL+EmmRwtfLOFIYWZ5Cd07Qj/gD+8sMNXt4mxC5nXSc4Spcy471f/gM=", checksum = "500a738522fa67eeaf5a499767863fca95822c0dc93a9f440443dfef6d801ebe" },        v = { count = 170, codec = "deflate-base64", raw_length = 1190, words = "NVTBspswDPwlApk39QfEoZ3JIYeYwM3Gb5oS4ckrOBS+vtKKd9LYeKXVrkQczdTdL3G0S9dc40hbGE8cpnB+xtEVbfmbwxFP3BrHm4S+vOnlzziaAoGeXfODL18hCS4BYJJvbnrJJ1rbZuFCfz2H9Osd7z1ffniGJwZUwAFAWzwzCfcINV9S0eIyK3ztGiRDPRpaVP+DejQppUoprUri0AldeSLJnp+NpM6xvoCZhH/vrhL4Ayc7hUrgbz0dIIE9hBrytKoEcrrsmyPqiXR27gVApZeTGVTWKTYqllyKdKIS9SKImZREjtpfqEAX9czTlydREN/4pQhij3ubQU5maiFdEUUlO8EVyp+iklQQPaeu1kLnG7iIfzZ/c4HTK+g6ldyynsB5iMysjyI5cIZPnNq8WhT6UJUKZOEKEtzWg9nQNuLD7O9X9W9REsJzxYBZbYzmvYIXV+ymc8aaFeKtKviFCnaGPOxDUrowJysgtZKFMnAuwxxboAcupDkxKOYVRAkzf88uZn7QwKaeYqJXGGUwV+CoVMMJrEXPK0YDYq3+LqOhC0QLcjodU55W8Y8ogvW+KxSkTVIDSMlTocrn7gw7Yn1T3FOF5F1xu7prX12xAcAlD6cztsMufl9fuJL8Xkib7nSu5QkvXigLyYLGZHYXEFQ4HGMFMclJk80w1S442SFqaqjr1lYm2W7w1ukC0ab7kFSJcl+ETlLzS5lWt7f5CONV/yEXzNld4fsPSfVkuv8B", checksum = "0bb0b28b23728fb397fb3197b28a89056479fca43ec3d87a11a2007610b1463b" },        w = { count = 304, codec = "deflate-base64", raw_length = 2128, words = "NVVNU6NAFPxLCGrJ0YOTuFV7yMFJ4BYg5SgDUhJwya/f193j6dUkM++ju1/T5b6v87cuj323e+9yt3X7viv+rDyFqdnNOtmVcjkXfy1cqxFhrfcIW1sc7MqUQjO0uNkML5ZsbnDFbS1vrpcRqaeOp+/uZCGE7vRs1T+Veq6R2soi+KkdDjqxJaW+1sd7e7DVeO6Wxtq1oJPexdjs7J2znHgXq+PMPi1L7j/q0yvKMlkcKyQLa5NX9uB2RrJ4Y7vxhzddrvBdscJWHw+sxzCxXUtNBLd0k/9Fa4mdoYk8DjzFuc5f+F+hCkdg9sB3pXhwX03+ZGFUnyt7sQaJUt8U1rUPhDXOBNJPdf7O1GypJxIxq/CjPR/x49jkGDO2wxtn5ygjH5Qbszi1WwZCZw2ilzC1+cwwYrBFxC2aITtDEz6K99DuD4IOWWayYv+JftazQpIUHhhYLRRSFr9gASVjGjd9wloiKleRmpEc9y9BTvEZOZxBD3xo8Z/rz3x+Lzp6BZUNJo0M9Si3EKklb/y9U5hU+ZWa8EI39rxiTfC0VDmHxgbYA1b3mtZ4RyG/EHnbDvZCsRf+/nx8kZagSInPyAHT5UbIg9YCGwfkbwyYgYUq8BCVOkrs5dAdf/CgHipxxB1ryXuQbKKqm66RbBB/1wsnkjBdan5Q8xGrZosAJGxziJk1gQdoPgmFN0mAz/g85urzgSfAys4u4xdO1elAfYojTRsvJ6ErE2gxgw22/yJ03AfKzZog/S7JdG52NBbZhVkQ8SQ8fpFPTKlBUTxRmBaGH7wjY7ZOxTP9hcoSBPFK7YY7rpqxAqr8Jgjmevck3qHrWbMLT/fwK2FKcU1bRSVHGSDUmrxALYEj+ARg3Zgz3rS339Su/+CPkBROs/QZuEB+lsCC7Hel90DXs2bQxhGzTB5invxGKSKY3YP3UsaCleklRUr/srsX4Zgok7wjcTFHoWw+KzJ9Rwn7RU0oZxwVHjlYmH4taJA5KllCgh5SJiDlNubXtNHlwnZv5x312UETToWitGsOxu0w+32jkdGQBlXoKT6XVXRMGQS+Mq9o8AwxuEyrFps9mLZRDtIgICArRZrd9Ml2k9s80ppj1lEoE0M0Op5kEKIxiYEVJEwnV4ya1vYBDeLzIhdmuOpruGow+5JgEXJ5z10yCO20qeBFm6PvA3TtA7mNtzQfkXdqHsp6VU59Ign5TV6wUZG2lCN9ouUHU+YBOjDt0ki0NEcM1msi7qbm69Onx/z6Pw==", checksum = "98ac0ae4ea2fd8f5c6afe652466d9814a02bffc475603b7c7ee561e24bc7270e" },        x = { count = 12, codec = "deflate-base64", raw_length = 84, words = "S3UPq0yJ8E31yCmOCjdIdQ8rTTIyAfFSw8tT3S0zknJdgYKZUeG+ILnEcBCvMjEcpKEqxd0VpDIyHKwhyagcIpgNAA==", checksum = "971bf398f0f97f4e9bd1d1f44ab9f4120c9742ff5638195388a3a130c9410079" },        y = { count = 85, codec = "deflate-base64", raw_length = 595, words = "PVHLbsIwEPwlElMJPqAJHKjEoX7dbBM1kIRWSVAUvr4za9rTar2z81g3Rj8u9Xtj9vdgT42pilif0a2e3X4KqsOjincUPcUDIatn0bdw4GyTBqxXVyeQmyu/0C1JZmNUCSyjN+CsMCNyieVEFlfuMFOZ8+EVSt9T3f5RK9nTUwLE6swJn4adkFk9ObOVBfrUm5wBdgkZ5XFfXGpY6kdJpNs0bPmYyk8g58zZebOgXN2ww94cLdW7YDY0GAyQenWMySgL7QYlJgIzgFPxZkUckqiL3TmaHUOHwzmHpuxPHCS7t8ecAc50kY+80jXWmZYG79muPK7OTDk7WKrvSNlqDLynfv5/lax7MT97QV6z6y7WyNAvgoQlMb9e5Bvb8NKTu0gwCDlBvrFY3YozzMxJTmBf5diYD3wA8z2TqLdY+AU=", checksum = "89782208ab86f512c0e8efe6e9ee9402160514f935293ed8d72599a9a1d831a5" },        z = { count = 53, codec = "deflate-base64", raw_length = 371, words = "NY9BcsIwDEWvlIbCkAPUgUUWLGxj7RzHQzKxGAZIUvf0leR2pdHXk/5XRJXh3kU0C7THiN/rcJojNouzW0T1dNcLdSPYL+oeATXP/K6Ld3PwtqJu9ZaQROJM4hZaIs0EtmPRkShFOrBnWsheTr+93NyC+BVbM/anQvKCmYYrlebtkK8U0vyUgDtvtbgz2SwgZPpPbW8iSrJqaP/2CFEz8Hp6Bn66yaHWErA+FlueTcBPp+zkP7qpJTU7qL23nyKK39oXEVrNcQPy77nnSOoATJpKyPRyNUUaPyLefgE=", checksum = "eef42c4656e353ffbaa62cf320e4fec299d5ce55f455c57ab60fb1f8b8b791d6" },    },    total_words = 9074,    checksum = "5cc1bcbebbd28f9278e1e887e031e0db982cfd2e0092b5f5ce5cacdcb1875ab5",}local WORDLIST_SIGNATURE_BASE64 = "iQIzBAABCgAdFiEEeRWwgx3yC6/0IY80fYjFs3TmXZAFAmpb5gcACgkQfYjFs3TmXZCUVg//by7oszsa+28N913FadvzUtCSSq83MWM0yi6EnH64wNh4z5z4G+5M3LfKCcrCi7At9P6bXtbIKTdQ1hWA+h3+4Bn8RbCcTtlH4YEvIUWo2I6fnR/UI1sbimI54UvjSDwk9LyXKIrkopLoeU024ifQqjfDLHIzKLVtt7x3QWT7+OWAb4XiIztby10i4F5v8EQ2xyDg89I3lrTzJSK4ktZI5gmwfx89KY1ualfA13S4rP8GuTaiKk8dz6oTQUzCSjSCK2D1T2w7N5MD3hvHnSuomSDFMsvXyl3qrBF2RarKzaUC318P3ujsC5AkRL31YkWPyryWAzdByIT0KJ2Js6JCYAQo/827qcorK5MtppJw8oCvBgnMUdycJBSdAndwZ+fJtR421Nb2LTSRiPEyU5DR47hKVFSMHYetfd6XiQpbCQvYJgDcPW7J9UXxRU+9/ifgV3+QTQh4Q5WWaPtEKYD9KAoLmg+CPK4VwAYA7i/zzcAsDIQJuYi/VkzB/v7dpGqgDdgJyIYC6oCOBxdJX357WOE+yf7otlMpkQaHlKWcBa5jwjoJV2jc0vHlXrS8hRbnl/l0Fm05B/ViBSSonWKVGsMRc+aOfYRnKFL3QSWeFJa9HZbgwjQ/tGI368vFnSYGWqQe8oG3Q0jvE8LXdznR3nA7DtnXFyFjazsccPMekzo="-- END GENERATED AIP56 PAYLOADlocal function json_decode(text)    local position = 1    local function skip_space()        local _, finish = text:find("^[ \t\r\n]*", position)        position = (finish or position - 1) + 1    end    local parse_value    local function parse_string()        if text:sub(position, position) ~= '"' then error("Expected JSON string") end        position = position + 1        local output = {}        while position <= #text do            local character = text:sub(position, position)            position = position + 1            if character == '"' then return table.concat(output) end            if character == "\\" then                local escaped = text:sub(position, position)                position = position + 1                local replacements = { ['"'] = '"', ["\\"] = "\\", ["/"] = "/",                    b = "\b", f = "\f", n = "\n", r = "\r", t = "\t" }                if escaped == "u" then                    local hexadecimal = text:sub(position, position + 3)                    if not hexadecimal:match("^%x%x%x%x$") then error("Invalid JSON Unicode escape") end                    position = position + 4                    output[#output + 1] = utf8.char(tonumber(hexadecimal, 16))                elseif replacements[escaped] then                    output[#output + 1] = replacements[escaped]                else                    error("Invalid JSON escape")                end            else                output[#output + 1] = character            end        end        error("Unterminated JSON string")    end    local function parse_array()        position = position + 1        local output = {}        skip_space()        if text:sub(position, position) == "]" then position = position + 1; return output end        while true do            output[#output + 1] = parse_value()            skip_space()            local character = text:sub(position, position)            position = position + 1            if character == "]" then return output end            if character ~= "," then error("Invalid JSON array") end        end    end    local function parse_object()        position = position + 1        local output = {}        skip_space()        if text:sub(position, position) == "}" then position = position + 1; return output end        while true do            skip_space()            local key = parse_string()            skip_space()            if text:sub(position, position) ~= ":" then error("Invalid JSON object") end            position = position + 1            output[key] = parse_value()            skip_space()            local character = text:sub(position, position)            position = position + 1            if character == "}" then return output end            if character ~= "," then error("Invalid JSON object") end        end    end    parse_value = function()        skip_space()        local character = text:sub(position, position)        if character == '"' then return parse_string() end        if character == "[" then return parse_array() end        if character == "{" then return parse_object() end        local number = text:match("^-?%d+", position)        if number then position = position + #number; return tonumber(number) end        if text:sub(position, position + 3) == "true" then position = position + 4; return true end        if text:sub(position, position + 4) == "false" then position = position + 5; return false end        if text:sub(position, position + 3) == "null" then position = position + 4; return nil end        error("Invalid JSON value at byte " .. position)    end    local value = parse_value()    skip_space()    if position <= #text then error("Trailing JSON content") end    return valueendlocal SHA256_CONSTANTS = {    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,    0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,    0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,    0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,    0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,    0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,}local function rotate_right(value, amount)    return ((value >> amount) | (value << (32 - amount))) & MASKendlocal function sha256_hex(message)    local bit_length = #message * 8    local padding = (56 - ((#message + 1) % 64)) % 64    message = message .. "\128" .. string.rep("\0", padding) .. string.pack(">I8", bit_length)    local hash = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,        0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 }    for chunk_start = 1, #message, 64 do        local schedule = {}        local offset = chunk_start        for index = 1, 16 do            schedule[index], offset = string.unpack(">I4", message, offset)        end        for index = 17, 64 do            local first = rotate_right(schedule[index - 15], 7)                ~ rotate_right(schedule[index - 15], 18) ~ (schedule[index - 15] >> 3)            local second = rotate_right(schedule[index - 2], 17)                ~ rotate_right(schedule[index - 2], 19) ~ (schedule[index - 2] >> 10)            schedule[index] = (schedule[index - 16] + first + schedule[index - 7] + second) & MASK        end        local a, b, c, d, e, f, g, h = table.unpack(hash)        for index = 1, 64 do            local sum_one = rotate_right(e, 6) ~ rotate_right(e, 11) ~ rotate_right(e, 25)            local choose = (e & f) ~ ((~e) & g)            local temporary_one = (h + sum_one + choose + SHA256_CONSTANTS[index] + schedule[index]) & MASK            local sum_zero = rotate_right(a, 2) ~ rotate_right(a, 13) ~ rotate_right(a, 22)            local majority = (a & b) ~ (a & c) ~ (b & c)            local temporary_two = (sum_zero + majority) & MASK            h, g, f, e, d, c, b, a = g, f, e, (d + temporary_one) & MASK,                c, b, a, (temporary_one + temporary_two) & MASK        end        hash = { (hash[1] + a) & MASK, (hash[2] + b) & MASK,            (hash[3] + c) & MASK, (hash[4] + d) & MASK,            (hash[5] + e) & MASK, (hash[6] + f) & MASK,            (hash[7] + g) & MASK, (hash[8] + h) & MASK }    end    local output = {}    for index = 1, 8 do output[index] = string.format("%08x", hash[index]) end    return table.concat(output)endlocal function table_size(value)    local count = 0    for _ in pairs(value) do count = count + 1 end    return countendlocal function base64_decode(value)    value = value:gsub("%s+", "")    if #value == 0 or #value % 4 ~= 0 or not value:match("^[A-Za-z0-9+/]+=?=?$") then        error("Invalid AIP-56 base64")    end    local output = {}    for offset = 1, #value, 4 do        local a = assert(BASE64:find(value:sub(offset, offset), 1, true)) - 1        local b = assert(BASE64:find(value:sub(offset + 1, offset + 1), 1, true)) - 1        local cchar, dchar = value:sub(offset + 2, offset + 2), value:sub(offset + 3, offset + 3)        local c = cchar == "=" and 0 or assert(BASE64:find(cchar, 1, true)) - 1        local d = dchar == "=" and 0 or assert(BASE64:find(dchar, 1, true)) - 1        output[#output + 1] = string.char((a << 2) | (b >> 4))        if cchar ~= "=" then output[#output + 1] = string.char(((b & 15) << 4) | (c >> 2)) end        if dchar ~= "=" then output[#output + 1] = string.char(((c & 3) << 6) | d) end    end    return table.concat(output)endlocal function reverse_bits(value, length)    local reversed = 0    for _ = 1, length do        reversed = (reversed << 1) | (value & 1)        value = value >> 1    end    return reversedendlocal function build_huffman(lengths)    local counts, next_code, tables = {}, {}, {}    for bits = 0, 15 do counts[bits], next_code[bits], tables[bits] = 0, 0, {} end    for _, length in ipairs(lengths) do        if length < 0 or length > 15 then error("Invalid DEFLATE code length") end        if length > 0 then counts[length] = counts[length] + 1 end    end    local code, maximum = 0, 0    for bits = 1, 15 do        code = (code + counts[bits - 1]) << 1        next_code[bits] = code    end    for index, length in ipairs(lengths) do        if length > 0 then            tables[length][reverse_bits(next_code[length], length)] = index - 1            next_code[length] = next_code[length] + 1            if length > maximum then maximum = length end        end    end    return { tables = tables, maximum = maximum }endlocal function inflate_raw(input)    local byte_offset, bit_buffer, bit_count = 1, 0, 0    local output = {}    local function read_bits(count)        while bit_count < count do            if byte_offset > #input then error("Unexpected end of raw DEFLATE data") end            bit_buffer = bit_buffer | (input:byte(byte_offset) << bit_count)            byte_offset, bit_count = byte_offset + 1, bit_count + 8        end        local value = bit_buffer & ((1 << count) - 1)        bit_buffer, bit_count = bit_buffer >> count, bit_count - count        return value    end    local function decode_symbol(tree)        local code = 0        for length = 1, tree.maximum do            code = code | (read_bits(1) << (length - 1))            local symbol = tree.tables[length][code]            if symbol ~= nil then return symbol end        end        error("Invalid raw DEFLATE Huffman code")    end    local function fixed_trees()        local literal, distance = {}, {}        for index = 0, 287 do            literal[index + 1] = index <= 143 and 8 or (index <= 255 and 9 or (index <= 279 and 7 or 8))        end        for index = 1, 32 do distance[index] = 5 end        return build_huffman(literal), build_huffman(distance)    end    local function dynamic_trees()        local literal_count, distance_count, code_count = read_bits(5) + 257, read_bits(5) + 1, read_bits(4) + 4        local order = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }        local code_lengths = {}        for index = 1, 19 do code_lengths[index] = 0 end        for index = 1, code_count do code_lengths[order[index] + 1] = read_bits(3) end        local code_tree, lengths = build_huffman(code_lengths), {}        while #lengths < literal_count + distance_count do            local symbol = decode_symbol(code_tree)            if symbol <= 15 then                lengths[#lengths + 1] = symbol            elseif symbol == 16 then                if #lengths == 0 then error("Invalid DEFLATE repeat") end                local previous, repeat_count = lengths[#lengths], read_bits(2) + 3                for _ = 1, repeat_count do lengths[#lengths + 1] = previous end            else                local repeat_count = read_bits(symbol == 17 and 3 or 7) + (symbol == 17 and 3 or 11)                for _ = 1, repeat_count do lengths[#lengths + 1] = 0 end            end            if #lengths > literal_count + distance_count then error("Invalid DEFLATE lengths") end        end        local literal, distance = {}, {}        for index = 1, literal_count do literal[index] = lengths[index] end        for index = 1, distance_count do distance[index] = lengths[literal_count + index] end        return build_huffman(literal), build_huffman(distance)    end    local length_base = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 }    local length_extra = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }    local distance_base = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 }    local distance_extra = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 }    local final = false    while not final do        final = read_bits(1) == 1        local block_type = read_bits(2)        if block_type == 0 then            bit_buffer, bit_count = 0, 0            local length = input:byte(byte_offset) | (input:byte(byte_offset + 1) << 8)            local inverse = input:byte(byte_offset + 2) | (input:byte(byte_offset + 3) << 8)            byte_offset = byte_offset + 4            if (length ~ 0xffff) & 0xffff ~= inverse then error("Invalid stored DEFLATE length") end            for _ = 1, length do output[#output + 1] = input:byte(byte_offset); byte_offset = byte_offset + 1 end        elseif block_type == 3 then            error("Reserved raw DEFLATE block type")        else            local literal_tree, distance_tree            if block_type == 1 then                literal_tree, distance_tree = fixed_trees()            else                literal_tree, distance_tree = dynamic_trees()            end            while true do                local symbol = decode_symbol(literal_tree)                if symbol < 256 then                    output[#output + 1] = symbol                elseif symbol == 256 then                    break                else                    if symbol > 285 then error("Invalid DEFLATE length symbol") end                    local length_index = symbol - 256                    local length = length_base[length_index] + read_bits(length_extra[length_index])                    local distance_symbol = decode_symbol(distance_tree)                    if distance_symbol > 29 then error("Invalid DEFLATE distance symbol") end                    local distance_index = distance_symbol + 1                    local distance = distance_base[distance_index] + read_bits(distance_extra[distance_index])                    if distance > #output then error("Invalid DEFLATE distance") end                    for _ = 1, length do output[#output + 1] = output[#output - distance + 1] end                end            end        end    end    local chunks = {}    for offset = 1, #output, 2048 do        chunks[#chunks + 1] = string.char(table.unpack(output, offset, math.min(offset + 2047, #output)))    end    return table.concat(chunks)endlocal function validate_embedded(data)    if type(data) ~= "table" or data.version ~= "AIP-56-WORDLIST-CHUNKS-1"        or data.word_length ~= 5 or data.token_width ~= 7        or data.encoding ~= "base64-standard-trim-final-equals" then        error("Invalid AIP-56 metadata")    end    local selection = data.selection    if type(selection) ~= "table" or selection.pick_per_letter ~= 2        or selection.candidate_count ~= 52 or selection.final_count ~= 15        or selection.case_sensitive ~= true or selection.case_entropy_bits ~= 75 then        error("Invalid AIP-56 selection")    end    if type(data.chunks) ~= "table" or table_size(data.chunks) ~= 26 then error("Invalid AIP-56 chunks") end    local groups, total, material = {}, 0, ""    for index = 1, #LETTERS do        local letter = LETTERS:sub(index, index)        local entry = data.chunks[letter]        if type(entry) ~= "table" or entry.codec ~= "deflate-base64"            or type(entry.count) ~= "number" or entry.count < 2            or type(entry.raw_length) ~= "number" or entry.raw_length < 1            or type(entry.checksum) ~= "string" or not entry.checksum:match("^[a-f0-9]+$")            or #entry.checksum ~= 64 then error("Invalid AIP-56 chunk " .. letter) end        local raw = inflate_raw(base64_decode(entry.words))        if #raw ~= entry.raw_length or #raw % 7 ~= 0 or #raw / 7 ~= entry.count then            error("AIP-56 length/count mismatch for " .. letter)        end        if sha256_hex(raw) ~= entry.checksum then error("AIP-56 checksum mismatch for " .. letter) end        local words = {}        for offset = 1, #raw, 7 do            local word = base64_decode(raw:sub(offset, offset + 6) .. "=")            if not word:match("^[a-z][a-z][a-z][a-z][a-z]$") then error("Invalid AIP-56 word in " .. letter) end            words[#words + 1] = word        end        groups[letter], total = words, total + #words        material = material .. letter .. ":" .. entry.count .. ":" .. entry.checksum .. "\n"    end    if total ~= data.total_words or total ~= 9074 then error("AIP-56 total count mismatch") end    if sha256_hex(material) ~= data.checksum then error("AIP-56 global checksum mismatch") end    return groupsendlocal function secure_index(limit)    if not random_file then random_file = assert(io.open("/dev/urandom", "rb")) end    local range = 4294967296    local cutoff = range - (range % limit)    while true do        local bytes = random_file:read(4)        if not bytes or #bytes ~= 4 then error("Secure randomness failed") end        local value = string.unpack(">I4", bytes)        if value < cutoff then return value % limit end    endendfunction Aip56.self_contained()    if #base64_decode(WORDLIST_SIGNATURE_BASE64) == 0 then error("Invalid embedded signature") end    local data = WORDLIST    return setmetatable({ groups = validate_embedded(data) }, Aip56)endfunction Aip56:generate()    local pool = {}    for index = 1, #LETTERS do        local words = self.groups[LETTERS:sub(index, index)]        local first = secure_index(#words) + 1        local second        repeat second = secure_index(#words) + 1 until second ~= first        pool[#pool + 1], pool[#pool + 2] = words[first], words[second]    end    for index = #pool, 2, -1 do        local other = secure_index(index) + 1        pool[index], pool[other] = pool[other], pool[index]    end    local selected = {}    for index = 1, 15 do        selected[index] = pool[index]:gsub(".", function(character)            return secure_index(2) == 1 and character:upper() or character        end)    end    return table.concat(selected, " ")endif arg and arg[0] and arg[0]:match("aip56%.lua$") then    if #arg > 1 or (#arg == 1 and arg[1] ~= "--check") then        io.stderr:write("Usage: lua aip56.lua [--check]\n")        os.exit(1)    end    local aip56 = Aip56.self_contained()    if arg[1] == "--check" then        print("AIP-56 validation: OK\nChunks: 26\nWords: 9074")    else        print(aip56:generate())    endendreturn Aip56