{"id":2135,"date":"2026-06-12T20:56:48","date_gmt":"2026-06-12T12:56:48","guid":{"rendered":"https:\/\/www.openlife.fun\/?p=2135"},"modified":"2026-06-12T20:56:49","modified_gmt":"2026-06-12T12:56:49","slug":"%e6%80%a7%e5%8e%8b%e6%8a%91%e6%80%a7%e5%8e%8b%e6%8a%91%e6%80%a7%e5%8e%8b%e6%8a%91","status":"publish","type":"post","link":"https:\/\/www.openlife.fun\/?p=2135","title":{"rendered":"\u6027\u538b\u6291\u6027\u538b\u6291\u6027\u538b\u6291"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &#8220;checks&#8221;: {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;ciphertext_sha256&#8221;: &#8220;0631d4f31b7503e2546ba3cc77a99df87e9fbf9082b5d9b86d42e82722ff1e0a&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;plaintext_sha256&#8221;: &#8220;d66f4c70a6f4f9e7062fbfa036ab42cd746310924aff67b26795d75e65227384&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; },<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &#8220;created_at&#8221;: &#8220;2026-06-12T12:52:56.215597+00:00&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &#8220;encryption&#8221;: {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;algorithm&#8221;: &#8220;AES-256-GCM&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;associated_data&#8221;: &#8220;dGltZWxvY2stYXJ0aWNsZS12MQ==&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;ciphertext&#8221;: &#8220;zdwlmjvRpwOhPtwfYTBe+YP\/Yg818erM18dv9ieNR8XGJi2hs6R0oAiABHN3UdRu6ZU\/aCLnZcBwvPDxAb\/p5VocsAICo74Yq1803Oj+wQCqS+RgMMCLDbFwMga2RyQkXI\/8Sy6Xw48BLgaJ22jGC+PPw3baWccAzmDLOsFILcQ9aNZtZlawvZwd4zDeP4O7YFTCMQmkuQ9eAtajCLhdSe5DmmTzlqqQoyZMRiR4cSZofcSjymerQcizvTL04YCun3SmLpU1XHE0Yyxzi8scm0ywwFjCR3EBguXDLRSPL4Bc9JbByTt4Fga8S6XmefeqzzezFJnAJel1kKZlI+a5bZlh1hu\/brqaHIsfVCvO\/QohC+zp22jvc5kMcAKxbU6xuWCrxR7w6oJG0cp2FdZoF8\/Eo8NXF\/1xnfLqT+enXWybesrCryZx3TK1U3Ky\/BjQPKofYsY8YE1sasSmacoDmt\/yeMgmV35yrjgeny7x4klmLkQjv\/G87SzrvFAprlcn95K9sC\/Ik0A+JgxCSeHgNVbdmhAfSE3VsyszMsr0M5vkLytsGTiJeJS01CSua5BFfkMNHUeX3P0NZtYGEAmGJBYf6SnUml0RFF3fYlXNUxJM31+CwpL\/4rblFs3hZFSXYr\/lyv2FDFamJ8RC0YjWPsBKSohMLPbcZiY8j57OrwUeE7ntB2csIrvXNmqrTfbuoL7aHOTrGMwi4pjXE+6Ga4tWePKDOq56yCo5wyX9XbrPOsEXPelzY+NZBxsUmagwEidUdbLq1QuqDMe9AFgUOCThG2AdiXLzFcBeq\/n+J8dCmneGZAd0jrXCdSwb+JCLkGn1PtV\/MOIOyVIRx5XtsPAi2RjgtWVshpccXGvoU1jjR4TYC\/aT3I+tpWUElY\/AFR6c3t5XnLpV7njxJV32zq0WyrRRiANZR5mNWjrx7\/hxfmTV7DemXGWWUqF5zQnTDQCepl0PE4rW6WEIdNSj72zpf2rBZ6L+4qVKkGh1oaZZq\/wHWKvb7bFLxCSBU4e40kOSMbVThCtsXS\/BR5krSndxV0I\/TIGIHHXc1\/osHAkJ+WoWX2g8wqBtEe5evaiNyfIGQJpW08lE02MzLozOuE9aMcVMAPtMr0d\/QlKd3m9\/UWbusj3zY49+pu8GPGAiHQ+LynEdyvmCUZumGLkB\/P2jzfQEDF6ofq27x3KK+qfHWJpwJ+yGOpGKW03xXw3\/33DMKDFwAmEY8Zwu7NYJG1nVmJDs24mmR7\/f3jLnjaKTAMIOdE1M\/S0\/u2bG+8esCXIJRgGG4KuYUS\/MPDsxaq599F8dZqvbYpzCj6suPJQw91wq\/pxFWt73sgfI86HQ8wh3F3HrV4QiJ652Dn+sTwFiObZfNiTS2iAjg4DF9IrTefzRc+TkDFv5lqqp+uxlRhBKhubbQMkEdaDuh4zR08MymXeE76qXWOYPx2ygYEhYo67WB3nZLswUWBt0xLLtakAOEKZMAmxqyKb+9oCH5mqeUddVpsoE9IukLG5OmaH5ymDc15a1qyjbqeOIAbQVsDljM9vYukz7YqVvU2v+3xNMLElwku94rlFb5bUovtnxFMx4137BieeoXJbAjFRQ3a2tvJL3S1wS2ryeV3yB6DdGgNF49T\/3hxxUIxRlRKNP3StmH\/yJXKhqgoJKDdw0u+YEGfbZ0FpneyupIGL6uGE5sXGcW064Wbpdy7ghnQqymkjNm\/ga1FFDZNaXoXcyjhF7ukiuT43RMmbPlLauQ6O8QLwC0jjS0iYNPgYTE+BaKX50n28kOw+n\/3cUKCBlF4GfW6TBuyST6dapIyedDKVxdIFXxC8Wr+nBgycyX\/MclWF9zQGCYvj8PthXVzvEaTPVxuWG15TyeG7YqoxtT2PqIW3vatb\/mxVL7R6gkX2Dnu6eY6ODIDQ8UuJmFTW5ZW9YWD8el9RnyJdp6H3NUEv2hz2n3VCaM73DwPeSBmxNkxh2\/q+L84dUNxu8HfxHNDwOCXG8eaOG43I16i91Zd6aGDrpGTLmMUoyIwvFEI2tJqT+YZAme47bLSer\/OzZmVmvuWkluu1quHWf+MKXJx5oTasN25IWz5WOTQdfiOtSnCc5+3RtQfQh6\/+kbaa1IKSDFd62HuWuQY0Qg43NIUaF5s29wDfA9BQM537h9d4+WU4\/vNBWhUMUWvFQxeiBk6uT6\/CjJmmxYoLBhwuAz4jdT+arYfsyBqV5XIyeNUdG\/sBbsFpVrFTR9l6+FX1M9YTj2BcPFEtHW833mMqSgvDDeejGSMOjSGptDudgwfzQv\/VzLQT1CWrPFungGfoFXkOU+Q+kTj9WZNGKutOxQkTe7pYp5vRdtmwiTH5oaVtizBUJmQOkU7kVSOk3kzCJvIyXTgoNQk\/SbScSizfbeqlz32GGoGDJFEq\/9rOeAjwAvTru9d0uK5e1n7qdtHFq9cZ49WnRXUmdwGvHHuPwQG0JklAa4cwiANZ3UbftS6q6bycmR2vg8jWdD+lEJRQuUltfqbkSodU1OeQfahAGLPG2nkYHSPTLBw9lDmWk9H7JxrN0AWRnrZlAJic5TouaIiUJvAAgOcSBvltS+jOTiDwTgRSnmpmHHtAK+9Zu3Dcl7PN1mdt2ILYdElIX6DLtwS0gNRz6m4yVLc5XN73x9oZFYMbpPSYw71cEVnFFBcFQVRqy5OYMexwbiu\/sKGaDjJ0pQwUfeB5kE2BM8jnmXFuuQ4tte5u84a9rsIgQ4+MEhDnkF4VXspWKOLtB9+BK+yJzzKEu03e28ZE9dQs2F97qxOgKdA7Rrpa3EXSK2Dnbf5fGEnr0cqJzfeKErMnZHAZdeesLMTA8GBzfrjMGgSzrZSbGp9shZDUQwveyi02VuNMXjwInrTQAq9wL6tFq\/cKnonOhwpziplVelhH\/RA9+KuzUx0GPfi\/dQCKhuo4ANMwdT9HFggJbMuzEqZbvSrsGKpnhGCJrA8KVmXOWX44JmB5JH5\/fsBSoP6ZzNHAIlPzZ6MDjeAr+NYt\/UFIbFns0Hv1AYrglejyX+bmYUY2dxT5STwVoAQGLEiRpBftAAKk4XH+IAf\/1SZ1PN\/Q\/fDSRT5MpAwy0sNMp7zuVe3UtVDR\/hSb1+0pev3MLo83U44B1BlCK\/c31DWRZ8Xy+OJXfbHBewitO2UbK8soz8gtCsWchpxesX6SabYe04FSuMuIxOxZjZxrMMOYSLLxo14j+uDHEpa8S59yRS2q65AR3JmaBopc5rYnL7\/lvGuUTqibIVS9LbaSpeytSfsTRRWDTQ3chGfxR4zru5qOIoFJo90aT4FSprWni+FvYBAqA4DRk1BDb6iqKRQtYQ7JyGpwdRLT77rVjBOYjkoSZ8k+gci6n9ued0duLMDtnYaRWRureUahEsuQvsretlUjG+fvMJSSuMK3dFceHtfq8y5UctnbLeI7jfqRU2qeW748PEqTwHw2guF6JVqmouhGLPT933ECWrt2mEND1++YQqu4SR+MUkwDQSXAoGQRbU4Nj0WhbLMn2gp4SjJQluwtsJUlraEatbv8bb0A2si3ysAUxYilj5KU7HvFGLWLFYW1VY3JHUKq3DUGMqmHQUEHPjD03ZsHMhPfrySERBZxgSBP4M27xu433bNyEYSylYGDI0AcqInFP9mG0AcZYpN1At2LcVVwSWASVwUXR2K0Xfue7Xe5NqvUyJUPk7Ht2Ly0vLBgYKTU5AvpVa6tIxWDjqnxL0JaElJ0uUiqJmATWAN82yir9vvmeWM05DZCO+IMvieH8qJLlFjJbeCyPYDHsnVrFu+efIAWHbogrfTCe+BUiKBSSv9PZzPpXgehgmsE461yCGZ4YSYXMV2WvJ9xc49\/vlMVNd8\/r\/k2wNcFT7AH4kly478QVC6lhzbmr0PexbtOwzRZ1yRoYd+cIC\/uZJFPjaiPDaEFla1McwQhN0GRIBBeRf1I\/r0dpq+96EE4uYHktKlW6LrG9xsRXHO848opywB6Ehi74Dll8vgU1mXo03FjFBwjanT1\/Wj0C6qTtzF00fNj927e6TR98mFH5NFwhesPoMKUw21rGo+zWJ0r9ySM9IRaNOrTUp8zlEYDsZVEHGf0rlP\/zpwYkxRnDz7NdR6nHdaRzN8q0b7ognGnKkOig0oAzIIro9j2uqklwVkTYBbXas8+i8wIv3udnq\/kBahaNwJqpYt90FbazBYsBJM34qwUHRyFZSF9WgiMSfN0KuNWk+\/DrCHpXQIThGEUAsRCpkk8jIB0OwC4lUqPqhsm3n5Rm2\/pkoNY5SKB5sW7NaELl3mFKccNl9qXOJNZcQ46jBV0hqrUfDtWWajfxvJrNZpmdqHWjU59ocGxeSKZdkuBB8Q9E89TslAiVFcyi3g\/lnbQ1IunEg4ZvEcTTqw6OR6xnhhFjRUupKHVcxnTfNuwAC4bLKHYAeOL4vSYUEkG8gJKpc5h7CdnvDP3bto7L9uVeq5Tz9KcHqIDoNyKNfuOw0HZDZZh+b0B1bNA5lU5DpRUV16Zsm9jlsYlH2coLpbKj0XSs34cbWRClUNP1Gq6ltynyC404ep5nz2HPrkdzOD1+Re7zYqipOvS5Y2CTPhg6Jad8apyrAuxUhBKxr9izpWJ41PbtnRutdK5ztKgy4K+iwsKyadZtkdq2JQv6nt4vHfUdwWReTX6RPONjnaL+itXtc3TnkdlNgcf7VGI0k0G2pJYJzTm28bQvpuDyuVDAyhRxJ\/7OtGatf3G6Je7aMf8Qm1gXWIaV8dONegzdC9\/m+tg3xZMBEClShfhEX4G9ooqdWtqBGhRgxJlylAGZEAiMb2X\/3oGBoLqQ7r6zA0GpOuxwAZxIZDo99M7TUmzVTmN2QhjR6vojmb+dOPf2CMLLEjd7t6oVTPtP7vykiNpTG1dSD753DM5oZTfuMZqDGVfysqhk7Rv3FRjX+TMIFLGkFLb\/P+FbHuePd0TjU5bBrDkyinsoIdV1tQih7KwJgFqjuMpvnWf09baISm1PmHgMS+vTBlUFUisH4QGK6HOQmBg6kBucYUPlY399Xe8\/UhkqqU48esJ8zaToZ43CXIzstYAYQV+z2\/ehvyqUDe6KoHDHQIq5thrjmR6yBx\/l\/5IYLDM05hsrDfu5a9cYvuqzDtIQCJdJ+e3pRSUfCKg\/95O6rhrIde\/6rgOD5bg\/YcSMZYCJGF5s9XVG+\/Q4H76zVFrLuj93C2F7CK9oejrZYc9c8YARQ4JxBFrUJO0WL0p4qXkXloSUkRyOgWnjUIxnNCwtr5L1ChVQkQSet+ry55Az6+z354fXCGPGiW8SD9Op9hG5VjEAGlhLHYJZMJEAcTR6g82qWHqdCR5BsDRYs4C17q4j7syOCWjFKEMmCeqDxAO20uAoSsjhJQ0k1QReJRTPgqiqYKRtXolSz7qKYVsXzJDfBkwiIoKxzYtakxNTsK9NLbwJZ780QvQzm02ZO4JEAvKk9mwL2igW8A6k2NERr7Yih41xLPA03Mw\/Gx0lZ6KVfgRh2iAI\/0BIvGlQ7c6UrwXIPXsCSpYUY2mUwMgGnTknDhWYnORnSa62gxo3OKd3sQ9jQzDhQ9K5UnD2zMDrc6qvyqYY9oLjSGHsoRhZO\/iYjHLE0gAUhEiouFjVI1Dv6vsYibpxMxtFCIFTfeMf8oUb0UgeNZ3NPV7ok4TOYZ2xGehowoRTnZqzXrofoq1S48+7Evp4uGW6cA4ZkvQq5tiI\/U6ArMd5n03N9J8G8wqVRe4gy9qIL8rSGvfyIZv2XE+hiMuu60hg11ToYx4eRHjqX1ZeJaKs58u2T3MmdVBUXYw0dIYcpkIiSS00U+B5oiXxtH6JQrRBMiDlbYxPz8htzqQvW9hVz1cKwT7qxPY8X3t3Q5H+Ms1MCUUoDPexNNHWv0TCJANl6ZuI9jMnZodHWw7EeO0QJXO1XPeRStEdI5kq\/19UGFAWywPs6IcmabdHZpvRr4Q\/ifdvIn3F9EPjhDP4rZFvUZUFPaJH0YfXq6URm2vVFg1T+29keRRex8JZ\/GpcutUZxwXgSCI97zp\/6zr8O6kvMqaaPU75SBN5MYIcT+3jfwYwLRWlEtWNLUh9assogIOnKNf7q5Qq9joSBJ9XAr7Tr92v1U3iCUCECbkMev5KO1oXyz1WpzRxCj5FviYfAl7ZgtvQ2VoifdAncE74HRFC0uAA04VfOUFN9idiTrfA2RbtJ2cma9B2xWQ8idhMNjImFPANCDsaC3Cgw38t4oMXfop5sj7KsOW3VLaEMQENB2pTaGBqn2G3G9P8\/2M9jrpSJiP70MWmk86TT5ms+UKmDVCypk15usONsH+oFYlD9WCA+q\/0Hq84XVdH62JfBqyDvTREqJ6YWQ7uCpFvfkA4S8JelA4wQ25AE9dldLhKRAF+f65hUj6izSzV2Pw9bVO08uvEb+Chj06OeNlSOCqT9443QSH8pPDWMPkaFsjseFuchyPbvIPgLxBbw13MaJnzVaBoVB8+J3eC+29Il5iLZbIy5isOAlc5eJLM049sGNkh9747TSGvjwjyKEMrX285mC6a+1Rlbf6EJJxRchesX9ryRc90cvxrGi9Z7JxphWA8kPjBzgFE+4Oe4Njs0sajiKs1o7Bm9ln+Z0lxY1ZoU2Fww27NefocVknVRFBdfDPhRMUX\/r9rS0FowFXm6tiiCSdms034IAQnv64HmiCeFeozRUS0nnmAEISBPu6\/\/FscKEvZpqSAAgDriWyX2C8NuomuZChMuXEQSabPppBtmv03qSIAYb4L\/zji7eDe5GLgxt25BiOc\/6Vt4QElyA64lP8W76aeqsvwSeVtx8B61T4UooVcZUDC2hNEqRL8X5y5T5H\/xOJNFQV8qDmZsK0MgvgvqgteDy2y7RS14ro56\/qHoqoaqQMV487OfHqS3PICa4hK36xdHSZBV5nf6fzNjxjx2RFq8oDwnKrshXgx2Vv2pbM8twtL9wNrMG9VyO\/8rwb5AFM4lmZBeKSoOTi2MA+QSO3E85JEY+l8ZP5F2vJvAQT8pAWrRnYXQFg90Uk655Z2I3mvMIM4MPU7EkrRkpucVOEw2VauG4SGHOgqW5KgUEBMILosAz+2\/BiHTE1HAFzwZFkRAxr5QURyeDoxjAMG+1RXMVvzRfv\/r\/sUZHF7yRemD1xBzg3kA3nm+0p7FK9YFepVOJFTLFmpAgmk\/RlNm4GqdAF39DEIXysVLHOwQ8Sk3+JLC+nYEr2kclb26eH5ikFmAjj\/8\/sQelwgZTZXNiRpoOT24DePSsQQJVRLKVfBqRAYgjXU08CuMRCRH8ge8akgwQQHe7ypjmPPwtsa8hAdNKCePvqfaY9IUDfxlx80G1c1tyBBLzS7IBZ9m9CVLxA26v0kamTU8gofJQRpjXjZ30DmpTUkIX6VHZVw8i+UKNC6R6cHoYIJY+FQct01xAW4hPDO0XDVuBKMawzjP4fscKgtgzCFhL+oqEPgTAJkzb+SEslPREVFyph4WnoJY5bnJwVVlYEzNalKaLb8UeOI8tq4IpNddRK2xYvJi9oHlomBT4eGVowmsr+rgTiCNUHygJRxJNTSfW\/o4r3x4LxNykw7GkjzOlb9AXL7dR3PmpcLXqw++qZL5gDUxMMgQFpIs0cjN3MdB4B9wo3wuny1PYaW2jg6qIYZEFRvZkUC24Nbed+jJmSCdFh3CKRDwRmAQZpEn\/CGe+zH7PFaFdde85A581mg5mkks0WH1KehbTCus3TmnRSGKR4lqRkcl6jPEvkOF55qYqK7ILJA5SyMg6Cp750Pcw2ekjaa9dj88qoZim\/k60faHPmyDyId2pOn5Mcd73LgzrG+qME2GyJoWVsi17VHW8NYCGyFB\/lfoekIimTRoiE4+181+7IlBFzgajk8moqREV4aV077JEKIE3+NF8SG9tb8zI0Wp4BNyuIvKbSouYWfghVVBUPUldFO85iJohFp0mmCe6hCQpnoA6osqIP8TUqpL8bsVW5Q0cuev1bGelbfRBu5q0S24c5tQQbzl2NfTJuKvAcAIo0GqMEdOB7ANdIntZG0at+olOgo7spxKat\/q5R1oVwIbXcmhiKkZQ0ZMJN35r3NBvf2lP2hOft29RiMd\/h23YkqvjGgC\/DwGPmimAoFeIrDiIlFBYh9dneUVxNOdxIJcQYVdd9fJHMcu7HscOP4qw3ZJwRnRgWaZhQOkDUjhauOsJgTh+HdFlr4lF1dkCKwBYpydnn02QWBpgkk1dsbdpysd3UxK48V0q3nRRJToEdOvEBFtg2t4gwh2SMg6fPccSUmx3u2GUqBZVAuMjxBM2CJj1AdmFCiNCsR6VgvMvO+HybqXTbzqmhxmEq2Ei\/OYmRhZWQdPhwy4Ee5wCWi8xQgF9CA4gdVoTpIPjBNKPkio57Kq1j\/jAeOyhx+OUnasHsk6C4hP2u27VBuMi\/fPdfAJWNyb\/jfUCUghECjAJJ5i3WuerbyVtO\/xif7uTzqDHuRXbNYGJOu\/c+S7gT1Wtdu6Kgpaar4m8ZLQ1ul5ikjwzFs8fm5uSBM+PLCRRLByyaLyzBBMZJ+V6cPy5K4SmfXHnGRYoQfLK5GRJQPaVRllp8xlPPoD0oJU2RE75Uuiz3QXNUVM3rkf8mRtwCVFKpdAUEz1BwetfW5+iloSS+oFajluD17BNo5oTjLDHiSBjqTRqmboRRWF+0d9JgzWIDxRfxXRb6Yp\/oHV5Gwc2rZRXrT5wdgzSI2FUTSQKJep9v4kayZAEpulPDJcimV4dY6ZIQnUeg7DNpXhG++p6qcOR\/BH7\/KEcO\/9T2OMcscLoPYALRXm0KO4YTW2DSP9ezAQYC87gDU3Ti7\/OjlNPctqOBJafjY53PrTtzuMihR4yd1985tjQJDIK92Q6Bkfez\/NrCztEoNzhdr2aXyvuYxSv3VqD\/v+0eUlbHPVXKCRzLYgy8tEqyZCiyRU1ndE1UEnBQ6jZlo27yKzDTYJn6PhWcF9kiioBCSyf3MeTkJFJ85C1Z4YUndfYSmptkccGbWe4hLGwzdjeHwExzZJj6L3Oazq+l5kSNrlSubjdCGCTwwV+wi927fc4nD+dLMNx\/MHg0Np57FdVMlPQLtZ729bAvpr\/+HoWIA\/xx\/3BrHA0\/\/4TUqgMMQMA1xE1+mANrpF0gYj\/SDvnKL05n9xhOuy7uK6iZ0xTGVBxBcJ5eZi45F43NXY+LfG1mjggxoot0xUrDiseDMlE8qv0uyazeg0mOdeOvRmTccB2Fq1XIcOQWu7xdZkURrRXfJ3MwnT9omnBq0c1MfnisglLXP9DxUrHh6k1bVGYwWSE2k7UEMJ0e42tUsRxvno1zqXApKr9z3kYVi4zxnSa8jfJqbbhibU+3Zu+Y5SA2+HZUa8OxlyQH2FfV1h7QIEvVpR4kZNmknmDxSITZAgo+R04s+PtfFihbk5t+SEf3lLh2QTKgRyp3PSsrpj01Zv2OEJBk0aZOcej4ZJegLjuOK8vyFC5w1qSMIr0o+33LyFiuuzN+LQ6\/txRK2WfXTCAmQL\/AfNW9kYxa0kapQGFzqmq5ALa7SRdZCAIEfPn1zkZnfqjACCTj4whsnjXNfIQdEmRQno\/ka89tGOfRv36PObF01L9SIzaGTOy+mPs00LVhJYwLEvTW4xppzw62Xh+JEgASyC2mUWn+Y58reHPJUd2HfB\/TOf51hZqIGGFvv4UHTlDgwjKtrmkcl6+Nb0+bbxSSIDJ\/qZMqzJY+Du2aIMH\/uWKzWED3k9n+lcKE1FtEtt8X3DdvUvpynVls0BCnveXO0rCNlFG5v3xyDbJTpBBKGoc8pw1aYb02WWkB+9+aFhoC9D+MtqsIk08jFi3X8PPUqs0gl1HV29lWf1TezBs3c1qPrI+iVX4gRlNgDpF5M3ilaz5C7tmIb\/JRHhLW2Byc+JJh+po5ZAgmpDjtjq9JPX0g7uPBkV+qrMowiEYFMQaazsN2XYu2k00efzFf1GsTL8V9Wtf5zNoQa5EJ8rMi5M9tVsPQOGCZSCmVvGbW\/nH+y9s\/6PO\/qiaLw2QL6BzvR9I4j+aHASY6AEPJot04K6DtfoLG75nFirVO2gvEyXrjmkc0+I8EGm\/itITK6u3u6jANfzrGDkC6QjD0rNGXWazNjkEav+uS3Ja0XM0MCFPfcsGsFNaSWzAp07kAW3pc5JQu4smPONEiiu3m0AFH5ZH4fJSee69NaDUt1\/Xe1RPz1IwBgo9R6zAIOBCLEFp\/bcUHea0R7leEDIgrNsZO9hpBZAnOibwew8uIoEbYa2GrAJ64ss3Rbs2WiALRA6HyLJtF69MhrwauZiqD9GhMOgzY2k2AxrS4D0VYtEcnr6oa+YINVfoWKcjmMJfwp9Krp\/VSCC7UwLOPINxXKcnDCrCbfHskRpIVx1UWpRbDli2NI7zq4PCBOuIr8bkiN5opXlvgAbDhOQFp8Le5SA+YrkmoN0uTnjU6\/UPay4wCD1UuR7n8aKyvclBrqnNJ4XMFREriFxO0VYCC5WoR12z4s5fHMbmSPPap3IUekHpyvqBkBUFji5GcMqEqDDWa+GPbw1kOg8rSjtHaUco3XLSh9ddDNBTOYEe8Fj+Aw2dP3VnKXcXo\/2dO3KKv1fO7WzFpzJQOvRVlgzOqCsjVnkOx2qif7bNdByQmKTXi+7tfxY65s6rGhtHnOGCgbwFEJ4PW1Zwr0r82wUHEx4tLtv0UJtBQccTvTe6pr7GokzrRSwC9GXeokCMWaGyUtpQlpzSyYKYP4D+9mxPTBd\/Ky1xUXQU4QDr1B5uRl2JijNS37tBdxD8ICWFXMLC364gkv9GB9YsGJvvQJBDiJFWfNiu3M9qcJb0KJtVgxiJUsQA4Jr03I0h3OdcYEsOZkLu4NU5u1gno9Y4Ahc07wB6BErirCHy+hyA\/IV62CyDxHS\/lVxwvoXOzUprPCrQvfH7CQY1PXdjp6uS2qWw85McPB\/uPejdUvROHCc7yONV8dWKb7zPi0zASMFmZ5u+ov53FU611IkDtxHqwNpfgWbbHNxjcUI8vygDoJLlg69GYaIxfAfSiF\/PV38tkf4LYEXsUz2bNV9AmZZV2Vpi3LkkdkdhQke2p0k4M7nE6YVoDX+LMps18Mjw+ohnElA+qdgTc96\/9linyuuJa3+WNHtLVOMq1c76TvyBkFgCDIIrKui3nz\/Ndf5o45vFaeLYa8Cp3ViupXw4KI0y2y1v2rZCB6jbQCWxf0KfVG9YYocbbw\/DM23mV04nkXA3LMUnaX5xIX02tnhvYMsvR5Smi3TJNy3whdzy\/Dp27APmNt\/0vCQS26cNVK1EhsVJ5GoiSvCpA0JlfAEcRmtla4qcvln\/P6jxtz92p\/mPgn5\/tqa1RPklqCVUlRce3VIeQYLj+7V7xqSWmQnao0b+qUi+0C+BpJxZYehLTaWTRbcRKMzQQQV4hqgEVlxPLNcjnDz29voa3HFHiYGeLqQNF+YXiLjusqOp+oeFH5jO2Ht3O3EKASETTTG61MAX12Pjovo4Mp7pRl2MldHWyzxE5eliyn2rNd44EXFoO0aiZk4pWNg3y+w8TKPo5TkqKiQgienF6MpRKOryiCbYnCHkAJLSpxRG9+\/gcOTwN14tuL8ji5cXhxPUjPVujlQETtwMdqQokIzPmCImRZ\/qGdFucwmy0G+SgHwpSEtO+\/JYrZ6XYKI2Uq9+Pj1BATRsZVohNrMhSC8OARfPAUTXhXCgkF9qSuDbrqHMn5b+CbpKFG0lvEOalNM7UgKi0Z+VeqgNMD4Kp78RGLM5IG1dsYhlAefrIEnH9ZvRp4iXX2UP6BX6TtIhfZQjGPrILvuABatcH+7lrt4XTl0\/l\/ED19f7DqZYGojcKHkEmB3Eai\/FDOJ3I4HCRch7Vqg0kxVUOhgu0vCUdwPV7\/YgVdy+fe+gqYf8X1qVoUiEz2KQ2ndEG1esfkHjRyLTKjgyXHIpIipUm46wULPhwBjnCTq3KgZl7Tpu+RoLV8O84Uq9NCsPrBFecpqYSDgDiChunZEjGX2xkLwMT7KBz+J7cBW+w8u9s9VJvPIp5gbPGR4RWb2+827WeDt9uiVzqMdpuxJ1sb8gnT3Go8fYFNzYdZBnO+sXf54454HhS9gE90BysL7nLkCRegoNetcGJkmafxqRVABKIEkZjBIQ4vcR62DXiQ9HBEUOzy+mOPYDhBUo8qyg6RcA4Lcb3VfVxYgiz86Zri8p8NF+bDgdawABbAtuKB7LGo1qN95RTYdA0ys8qfc9bnEVcQ\/rPqoQ2znW2wMY+5KcPMrB\/40Y13odNRpm7SgdniO1VxV2msdQFC9n9IT7l34VZnpBc0n0uZhednfHruIIkTnA7BlYthSEAt6VMnYNEfe58bXg+gdHwYrkyTo6TCO7BRWffTr1W9exL4lNkk5R5wrt1qEMWhOxcaPa0HwD6Y6iWsXK0TiUuvbvJe8ca5QnyIDStRQP\/w95mZV6uWN7Hd6Tc4rr2r8Jb641mGR+Ny+v1Tod7ZB8I0EqT+Jbrqu+h7WguFfHLYfM0MLIOOWq0W\/qra8fY8yl5nkQ9\/Ikz4zf7pZi8dmKmDv2PzNKRQsZSN7hdewcEN+pl75PBV6zn38rh2Diqz3zk0GuiRc2JZWw2XUwnpHGvPWxOO3L744nvyRWd6muJ9VNFGzBSuQdLHz8Fo+MoAibOAQdpuE7bCHc9RvmLQvahox1EBURQAHnEREEx5P7gsYqUMilEEGvdMyK6yiKJ+Z7fRo5xdpg1BRqNFTfd\/V\/V3dnuTvZPENF\/It\/QnV83rPGdv6+p1dOhRpyBdiMvFpoMLBr7g\/fCmorB0kh4HGPH7tMFL1EGGb4AhnGTVX5mBf6CBa2mVlvHxG+xST1NLpm4txmEb\/4lNanJaHhnn6Q7ZV1XSepXLCr9lLZ1T17b\/aB7nxJpWdNTOS2L3x1dtA+Ca3WdUBquDD8IKpGbvMzGFqAg9jyS\/U4bX5Ud7cKdCi\/SP6wo\/JbUOmZg7aFsJAQ\/41qkfHa93OqO9tdH8URTSmWChsehQ95Wm8nwJ1Kn0Z7kCQ7+ilxWg2o7t28vQ8+ISF8KA7\/RRFK1kGiVNtl3iDyHiSFR1eRsjRqrfGyaz4nhiuJRHdU63S6H0eFT1XWhZ4iQ73FlL3xO50Y7GWwECVsXG401GnnXJdLWGdm88nwOuipgmsYjJQsf3keAtKSQaNya\/za3gklppBTkhXFucGSxUPEsuMvw80kgSBXlSs8LDriiRkzXLRYfhAxcFiVhLHM1f9EYtgsNtFCsoQ47+SWxtFY4FTkXP0fCF\/F7QGYt3oe\/LPGkgMdAJOwgTfggJjkrhyjptsuK\/WFQu8UaoJOC+cPiKiX8bBMgLIhtDhd7OYGd23jROKY75KITxOI6tF1danMYdr\/VhmPmJMWStDeD6Xdz7ZI2cqt6EU6xwa5Xvjp7HwY79dmFl94ll36BTmVabljbAKlgjilzQ8VU5Yfla8SC2PCMeWuSc5S+M0tOT2kfsqFpzo5xwrU6g9wFz7Bv5FwDpHq0NzD08Ms5OhfGI8qe5HbPAKW7pHpIJGXzAVxAtOgHvW8l1Wm86\/OPWzN5IHAI2AezPfxFLsXnuO\/QuS6WZo+Skwdiih4THFkN42uPDWAYUr\/w7oBOAnFRGDUz3f2ePO\/0oyK4JMdrU7NqH5qfb6jrPJKcamEonZLtwSIwu7QidY\/9\/HEAoECyaWDmVAQ0qXY3SE+F\/LTC2OFX8iqXqQpgSdkqj0odgetMRz0OWuPFFajV9Tc0SdiJGcqHuldJSqy2IQSaIPvDGT5PfCbOqFGXmS6IhzS+92WwedGqjRC\/8jSs+vJz3C0wFXFGxB37dpobUVgRzAH\/q4GryOERV4DIJQpgv+JlVbPSXEiYcxIfHb2wx+WkuP9AOeqeSrRRr46pmVx7n0PWXB8SPtN3rY7IsIoJBQmWSC4TYpc89ZCgsKphjNSruwdTMVHPLKe6Qs2h7pCRHU87vkZuIvvuPp4UcToQhMNjE7cnkbVYWGX1wGrweDwK4Zl4TN277gT4aK9FaJnmtnTAGSrQla5t1eo665yM\/OMb7mL4LttZATkXL2DVeUxzdSf+Ha396k9NeYrfOZv\/l8UQbu51W\/wVR37WHjceMaPRDQc4ZzsqWHkzn7Ec88ylyK2zkNNChwdkO0YL+cJ1HPE20CUgHxefOinYyYKzZo36AVsL53uLxbSHb1Gx9jl9cvSEJnM7booZV1w6kP++yG9Yp61jPFl\/ASMqOtA2j2ClWAyrHnvzGV2mX+RP1LS+Hw8k6kzhL3UbV7uN6lyNNtR2dBjWife1A7sKaXG1OTLciyPVyiFD0STDpkcbswAxAAqKClLfhHGLs6UDFaZ9lg7r9Q438mbwaHbRU4\/cA9e5IQSyL5SqfOei95nr2SLip8bB1G4NaK6IDnzSXv2321OOvDhT3SC7+N8H5xWXuZudijFZ9V8tqezY5pVSKZuwBOWydinsDScDOUhr2aVhzCxWAdW9sRDq3S+u1n7bXVBfGJ9qafHPmdIMOL4gNmLMOoh0D4vDjhQVAnveoqI+JKZ1sJzWryH5i9aFf6nNjWp7vAL\/Yfw7peC\/2B+WAGxED2Guwq5cKkNY831Bf6iO\/nQ2G0YTwhubQCkynhw3pCakmUBt6aAlK3ZGTJ2ZA1XbZ7UMxwugWWs\/oIXOd3\/YFG9mM3c6\/SV2GqN4m0nfTGDHqZX08yN+G\/bVS1fVFtckUq4WBqaRBfoPdR7MAnAsDAvaqBSYcqkXN2fWyAslEGIGmqrcpY1rs4Nao8v2LVFB9W0DSFZhbU0Xgw6FqZOGPmKTCOvOSlhxV3fdOEZlTN2DOzrN0WMEik\/bWIoBjKJGZGGmmBH+t990WPtxxn6Jpwc7SSTBnMsJsgwTo5TGzT1yCC6cmdSp6KUO\/NCXzCf\/rGIUqk1\/P\/D7WC2wJ2hzirParRucFtPCiyqFM0QGj68lOboE5hypc7y48pZ8b\/BUVL30u3V0CJsFl8fuEDFXyk2BwS2x795DjCbfMGySmqqaHLcri9hdqxJ0sHvXx2WAGacjcCWUIMV93T0sKTaPgzzICGBXgRNWgoDQknHZYLNgMmL6aKnZfljbNfH8q1ubsEVr4mFbs+0QTn7Caw0w8ox4yIZc4xf9CNmJ9MrTMK5Krdjni+54VPONBKNvvcEhpbV+uP8+WwLymMh8lXQUJMDTv\/CCeslklJG\/y7v5Cpv8HtieNCP1D1J9dmJNm8xjZ2WS8V08+Xch1rjgL01BjCKnpolFZ+o0hnMvSAXoKLB4C\/s7vl9fE87X1XsLjrXMfIRg4ga3U4c09CuC1PNvIoSkRRytZdEeaPVsn0BXGaS+vuQIi2b9W7VkuGmMgYUrKC65EVetKcnyNY9AZ1EqbGxBn7q\/btkBx6oL13eT2CN+zLRkhO2ilzvH1Ik6F16SRaLe3wYXARdPBhHw7T3ZhIwRaRPeU4KJnEZlmdwmyDbQV8RjSHApzKSKdkNMdCA35I5Or3Y3nJCIrke07qNj9N27FU0Qx4OrWYw\/CMHAczlMiSBoE3Ss9c5LIY9bFdoNzt15DQeF6u6ToN9xgdBp3ElSP\/cN8eajsYxG1wIn3eZ0\/nlzZ96K5D6yBDx+G4DTobrnGT9UMpUhHNIOup+GtNFKXOarcjGJn+6hANcY99fO1Radw9fEmhx9A0JVxtMABX5cswxlfnpx137LAFkvg5y9lYck1QqJif01U0SNty3yWwFI+uSB5OAabbiR4n7myRnikv\/05UF9eE+iLCKH\/+iYaIbYoDxPgVpOvUKefGqVJsR7vNT0HHl6az7bsBrx5wMkCr1+mzhob\/BBA\/78Q59iTpjrRXmNoIiTI8VcO\/wZ+HRsyQREYx0C0dOarJ43OLK\/aJlBD9GnTB1U84ibxl1P8tpv4PPHaP8HagyWxdKuC2l8WIwoP0lkr5oE4feCoFb0o3Bjeaz1D9vwumdkdwzJ0FIQ\/ooJ86I7tkfjGEnvHtB5WVKNFjeo5n7yF49dtV3OXqWJHabkOJobVZXmWN4Q+V7WcbKq5pZK0qw3ZdnesMcpPq5idq7oR8s15yKfX64dCYJPdpSuZrtcqLghS0zahE5VoqQY8\/3XHXoK56I6FXvOeEUBouFLehA4\/2Z8K4mqjW7pt\/343UOLVwwq1AIswlPNJQdkNy11Dab2\/lQfT+Z0EVRiiN10Cze+4saZLjCiw7LailJW5fIbP1\/1pPXbU0PO+naIr9V6FFcn4Lz7kj1vGUuKO5NJ\/6mHge971tR1Bit5Mh4kJiIyKAaOHWYXoLLZjTzdZJ0F1pDEvNqO+HH7c3Ov9PV8eNlmVrgh9\/UuZcK52N21\/rXji0jK+LWEo41eUmJ7SbtIJqYta5nb10ZlcXcS\/\/LUEhfOUKBx+cVkhIXKOKYpvMeadlCFTzRHPZvRFal3sfGtDtZDglfEq\/ifLmshSR7Ofm56\/3FRpsDZ38ZYNtmvZqRc5GK\/eM0fpaSHgzRg7eLBPsMJmYLCU6wWGec5HrRpftWZdLA8L1wUAzBXdfZBLA\/pl9Z6xJstFhRMbHMOhKCSGMfWR9GjQSaHRA56ZaKzST5sK1zxiqXYN5r7Iuc\/83JxzunCzYFquPV9abvQgjwqPQqMZcttoFy5xmuajTwNZFMba9DfRq6nOBz0Mqz5IchybPtjxKaHFviJ1Gs3t\/csvzwZeZbotPUvWa\/3\/qs\/yjutXL6yAF2jNjvZGrgbbxCz5\/JviV+q2eidcUqRhSB9hOmvAc0uIpZkA33RNO+V0cvRNRtz9wuL5yiJNFEJY1xWZARCsL2a19wQEuXlGdZai3kmuTFG\/LyB8CzE61ZtczCM\/aaU4yYkiQhIqrCZiujzG6Ze7k8YPwLWL3QW6HlkN94PlyRSUY5O0Iz35PFyqppBUFNsAnccgAzxErgPyRYS1cdRNjJkrbgyUhjVft\/cKrHJsB9QFZAXfZDgT7fPWEfyLdzwuGSml\/Jn\/51zbXMOmrQdgkoC9ko\/+0ruuErTPgKTyrYP3Qz75eBi8BEOWgvuW3EpBcL2Mo+9MSe9T5R+IImltZLGFN5nezAiEqMyXzOhFWeebroVvLdoR\/nD7iHVne745tZHtGyPdNZe8cPsDDyXAR6+7ao53L++gzc4Pd46uRj3jePRpJmONEGl5AkWpqRGoiU7oIA7A3JY4t0hLnE52WC7RjCQijSfWQqe3Tgo9pwXRoASqdQxA9lMffzCdADnUOAomIoZG0P9+wE0NbIdZuc7r9t1F2MYg\/cdvgYV2GHXOMFj5xOffveqytAbtakSipBQUSLzNe0YLrV5InWWgX+c\/VrRpeadHel3A7vBe\/Bwjzs3\/9evmmBjMy4JVCsxJbS0gPT5NaChdEdQer8hx7n6tHbUm+IWa6i3QzBPcXvYhmN1WJh48P9db1HNTaRPtihNp4idAtCRYDamIAfHZYRNH7212oPlIZ11qcffZkVB0FrjB60yNUU2jrw8xWx9ri4Vp3PvZva\/C83q4hRqTICWFpa2E5ulTiJwjUWzcyORkcF1ZK+j\/W4nliae951baOUcfpTltGEf8gJMKENxE249WdC2MzLj6cr6VR0nBi0BFS6R6hd+SpzPLYEf7VwM\/G+4kA3GaHDqoRHTic1pB1YQbocOSFXjqLcqRuoTR0Cfbz1u1s1mbVMwFNMs44li7WaJtrdoYdwj4b6uop\/7yx9qPXXs529ii\/LTZff0WBv9l5AG6lXZtXBMiUqewveGRc+GTXbIBOdMcWwPXDPee8kCcT3gHMOrV8bhGS1Xr5NQzUdtiND7zj2pBufjS54Bf\/q5UGvspLuErtmMvZeq\/Diy6xOqMwcdrpEjZL5JeLdKiPqUQCSLGIa3S20YgR710xwSPtsah9ncFQhzDqb2T6hPGT5zeRsiTMpELjrjcv0E\/pCm3\/topwDvSJob9z6TzQ3a+w1j+96wlvYG5kzj5D+WLeibMtQjaPv2iac\/oZq6ltIqp9NQnCjwyRawElL9kfl1Ps3HnKadNdjijBDDRv+7Wjo7rbF4Xj7k08mAx24aJ7qgBmODk8V20w9IaQOMtgwSWbdHdwvoQqnUiKr+8fthOeLLl34AwTmtSGWlRwqkaPbkUlGE8xLWvplIAGZXBrbRbLgwkFnXRQMnlGN3cRhvELkHAFu4wY3Xpuv9\/9D90AJL1rCpGbChJ95UlvouoXqtf0CQyb3HJUSDOZlayTgE08VsZZnd082EZm9+rLItCMpO76cHK414VSa37e6Ii\/YZK5v\/HN+8ovys2flXqy9alOPON1BccNFKeCn\/rIp9YzDrDe70zOQSKeQ\/CCO8qbQtqxkEmZylDjraDXauR4PhBBzoNRuV0U2YE8D4vaQTBEmlbapgTO46kPK7bihmY9t28r7aOrM8KXUxbmI4B4U3NAEt3S9dXOWSamiUPKSPkFmzaQgZB4lup6LKjJp\/h4M1obF5iVUhZ+qb4sgoG2TlXl+jWHQBzBLjDqRp93iaJOeOH8mh\/amc47qGDatldIvfg6su9P3biOcjisj3Wq5CxJbustKrKR0QzZKMUW\/lJ1YNUfqZyoGQ2cH\/sNRQ9lGXsEw0GELDTheN3pUSeoDEe6tQP6uYaa7TZv2A3hLUAJm9HOJ9XLYH0OB5CvC7\/zQEz\/+XBW7s7Aw1AU+KJ5M62ZtqhdmzR0BJziE3DNTWeTs3nwksZgLu5ibxWnU09pAX6y3QUGe6bNfadkcVcEBzLCcDr0I3uBNQ7aW1uzBad93Fz7+Cv09M0HJWuanhpxigSIItKoONW8yBSxuDWfuUbwDUy1hMUXZtkTynWH\/nhFKY\/GEJC\/JLUmJD1i9MxDE21X9W4\/ExlPlJ3JadueByoUYCeRfei+tJgZ\/CLjZMP3UoQ1+lrWTZ1Hkhz2cHcLwHM91mVpmJ5EOVJCFPtS\/pOWj7y4Yz2kEUw8fiQKPV7VaMq2bECfL+3CapLda5bS0qRnHCp3M9vc3Bg9DUB3orUoC4+VjqpTnp6QWD4L+VHUAyJUWYIWypD+AGn8cSfs4bmjHCubc\/ak33eoGXCxro1nNKIpnBX4e+bN\/rDNpRO5f0EaBCVsRC6a5079b1XWoK0slm0sc13IXoabGQ5SZpnRlpLuR15vMyWys3MuDECJPPI4kMWjFSlTFo47ibO9b7+Mb4xZt1EBpj05D\/7bhRK3j1j1DESUZFSe8TE39aQZv5jBIo\/+iA9Rfdpa5ArndJ6IJcCW3nS3c0eM0bSFV5u++kZhw5mKBOciblAnuSKYGiFtxSB8wBd46fQCWQDsn6g2oYFMQkg6UJiv9N4qI\/cN+U45seOrqvxHU\/\/ba8DiTLkHO04aIOEZAGYn20ZhAp9wxZ2uu6QRsxaFhVMOJD6Wwp0YfOigdbpM5QqbeTl2wr8ZAkBDcK54xhLxdMi\/njFKlLFRLueG7lTPK4n3JAh7YasytmF2FifK6g\/SF+4pvChOe3Y5QLsWZdmFbrGp\/+6sJzyWi6QoBuUQoorHKBtFdHPXZV52Tyn1J6aTEVhgCYhA+MjdX5sa+qPQlHkOtCCndSt+H6t4HDOJjJQ484t9\/bwuXgjynwLBcnMD7yraZm\/O+PkoX0DDaSrua+KU51yAzoCRXCuJDh0nxDi78Jnj5\/N40ahysBixlwDTP5u7U6btRivGugKnivO3bOPip1xRGYzFP2GYWv+CD63FEqb6bT1g9s1eA7O\/DMlmBJ3BEQc7gE9Bszzj+LH+jR657w+2Fqfk\/bRe0h34YcS+BatOEmtZ65ZHgoJ8RA8DMSSy66t34UTDMQzdifCUa0qm+gcCP2sqop+c0MTmzSPHI1Q+nfhR2kZOnZGXfte2VrF\/dwk03fj3cd6apRJbZv7ZmAyzKAjPGvYT+dfzLz5WLxipn6F85S0AbWUvh31HriuboykkxcnM2Ecn9v0QYFHGzwhjfF6pTd2FOqBt2zoLEckbMhSNiStflSgKe4OD9afzNBWY+Wf42ec4QRdMdVXWKqChc043S5KiguWm3EInchLyNUGglOi6+60jALDSF7ap7OcD5L2A4IagpSfhDFdqhnG2F+qD3rmsrqQWbMq6mWQRb991LPvgE7J38G6LSPKnEbS09ZD4+y1TzX51PYz2VJD9LeJD3LKPJ\/sISzDXYNR3lSfDFaG239R0xrqmgxE4V+zBix7379UfwuUC+iqYj0iXtIgvXkJbk5MxgxCb+a6YA3S4w+bYa\/WnaoYA6Chp99VdFpJhELbbUrDIIMr4W3RnAfVK\/tH8nVbr0vWYGzsXarwOLVC66WNXkAC8nokVmruvVZSy+bm3Gqwyy7p4VAMtZ82jMT4aCgNDZ0bh1nV258fzEpBL\/fL+WJilw9KtcPlW2CGTddqZ2otRBxZ+9eJbF9c5Ro5mnYgIllqVQuzjvaWdavxTUf8AJSLNhQ6eQIJr9mC7lM3UYGzLzVVwvelB1\/1cSiOcbgFCKPZI8vih50Lu7McEZUk9DShq1gGDw53NexnV7zS+ySmjlGo\/jOK1iTnq6UGxtie7ecg8arJi2CcyywaFHpq9\/CikmzXH56SyuKhSKUqMhXhq8It5X3Ebv3HzjxO3bHvTJWcbl5z6T3Rm288VgihWiHR\/nF+GxkzaiRGaRztB1DU3athL+koYb3rjinwnsfaH2H98GxpcfMyuwDrNH5joIW7V08DyEV9ajLSOJrFzzsR9RZQQVVuj41FxZHr\/Hm8dERMQUGcHKpEUVj+crGZD5bEMMljjwFx9sFpuUim7gGtChKfIPM1O+1K15wZ4GogVuGNQKx2mxnK6VaVzvl6vKR3PLdXFIlKen0oqnF99Z3uQwO2qTZwzA\/XmZDYPuksa2f0TtTuwwOqTBFhP3WUQ87GvsVywuXZ37fWZSDXtHQw0B8tCjoGKt\/82lFOcV0J0+ktzEllPtZfGaJ5PdMnyCS0pnr6AY+FFgq21w8ExlUCkvDWcrHKNxTfItRCZbbuIRPZUWX53aP8NnUdbBQwjzSwk3bSADK6yt2wFUq93fYDFWONJe\/ZINoR2EvkThsFcGSL0WZBhOT7iwXF\/kh9JVDJFOiFeskkL3gUkAm4GxNpREzSiLVUJIu+2hPCHTKVzPpzC78jsb+v22rRxJ6BFE1Js3pNmThPX1U0kRSO3dIcTdguiLoJcrvu00cuZNxLRhE8HiMK+RYurLI5Zoc7CMQojGCKZZMnLFJ\/yuvgGAP4vFGqXfwPmYuxVX5Ga7WiKwIVR0XWwo5pv\/\/PLebaxRBLgkGJhFa4Qsbapp+OVVc6+ADZN1Z5Q6B21qlh2RQlUvMU8xjQLzeMLzAwLW4mPrjbcDr2mKlEz5+Of6y2odoBIhYi2XdExerMEZQUSTzMH84kR2FE62l54flBgPxdAMOZfYAc3prOxkQKGg+VEj5KbDm\/BFPDltIK9mic1S\/AebQYVwCHCpezn7E4QIeO\/SA2jXszyjpzc3Zi2bMJ\/56p75xIV+Jw7Mp9aQjQIa9lws8PJrkXhpasqouivXO\/aCg057HdEnLXtATgL6\/mBP9e1QZ+qeRHogWsYd0H07+N3ZdXCP9Anq8F7t1sxc33\/QqwPtQQck+oD1GYOZeE0CEUusRY1N4XiLN6QADP3n1oDpEpQNt9oXCNw+s8N9gQwsA7V\/VCVdVeLbf4nOxW1dO568sqFlNlIP6XhyWqAxQy7TB8uZWxkpv0Nxdvp11HF7x\/nsLiqPURndMUDTNVfSPlMZLe3EqRuOII7AdUaLe\/P4TaR\/aXP9cr5r67fx73f\/\/DVvvEARRNCE7xxpwBQyjT8vIBshcTRWBnvkL7arLZYOiwaKgkzYKooUUvDxmqHOt6m2rEfaT\/fiClvSUXvo0s9cKiG8X9jsKJZQk378UernXhhc9YAxjrHXYUSP4omi9p9OSyUE0LOTGhktC+rseJngLUeAaRa9Mkosjf\/bQzZwpP9DEdv+YcqVFqI22FhfZTL5hfbeGqAAxyJWJwC0a\/V0LVhnt8N2M9kct2A+iHg1yKBt5fTdBf6R4d7mBEw5sUfd2WopRkrf7yawXYNYqDVs+JNsVFshEabwXHf7X6gIPNZb7lGH2C7tF8e9XtQen2KpcF7eoXRfnUwL4RlkZXBhTePD0d0EmSr\/OCPKb94\/JaiW1qhYTzbvmTJt3p0KEGOU1KwCw5hINJaA8A1Dbd2fqFyIkwG8WZKjUdQaV4yciWRB+kBKiqYQ9UDJY8dHrbkzceZx8Er+h8vG9rSCQk+TtAsuLNI6HznxlzAUPorb8VsumEt6lIIPyFp4+QlZnU0LPjvLLijHbdo9EqDGJL6NI6ssaTX+q8Cs92HsqxN3k9Zo2HT+5CljXYYLBtbIdkVggfligHSFRSPb2EETUXZ10bttBMiyzpLMSNARymEdZas6LTQyF\/QG8tUk0HWr7XTgHADEDApRgrjr3jDAvQYOEDZOcgqAPtDEFnehFdDYVKpjhmpqypiCsSvPSxNXmtNJEDyBXUGBjFSHZTsZ05uxYejnffL0cbCVvW\/aLPssVTVCU4wxaS9pPCjiQnvcIXBSB0zQVj0\/c8s4aVOAo+v9b\/XkzLdCURiCwYoe\/LluLv6I2Z5p6beihHkxwR1tZq8w8baT1tg9XH8owyucQthQqAh\/881DEsBzY4tn\/QQnwv\/v7RxIIpryypHdKISCQ3kxLm+NUv3qgCi6YIrxz8R71FR84lDCum6oVkAh\/mBxh3CMn6VbjNd8C1Cl9bqHJzzBhDtIwyeSgV3xkO823t5o1R\/0QB9Ti+oYEtzw5hcNke\/LKXFwQZFUZO5EeWHtMgvye9YBCZotySL713W+TDPFxSlFqy\/XZsuU3+P\/lvoipZgcIflvZMmCY+5ISMGhCcc2A\/x5aKxIUKWvJBtFD1e8ZAQjXbCnUP1TF\/iPxc52goxcuS6tFjyPQOcsZCzWnYCKM5IKlpHkwE3b\/DaXWJRguq3sip0Vv7NBrU9u6ZoRu\/cCdTfT4VKXQ4sJ2866o\/8ZwDJntZ3TVWEE5DjxAMoY\/O9VUc21x5RVO9afy\/YGnh5BnErn6odZ6ODGe5Fl6VzvJMUJglAEItyX\/mC4yRU4vYCDdYC0bXsu3\/9L3MjZWdsPv4yN4TLCwPYj7a1ncITm\/RBxNABMIZy0TOdpRUVJfftuAJKldutK8vWEs4v78h6VYfUq7GobbfaOkC4PnwKJKg5A8AIEub4ooe9cKiWgLR9bVNdTpHIhkqvEgpG1Nd99hlatZmpCF49+ERKtw4AYAtUuZdyWYRp5JyI0GJoMGCmTQ\/gHYJvA9nmHEqSEA1nFFl\/HcSqtYV0mtqwi1xeqAXDt4cljobJWUZLPANrT\/ZXzlc+N\/ie1ysfFKdV\/Z4ZDiTwGuqOsLxRKGJLRH\/almt+qfaa6E+Tgxbfy75T0BImlCdGNvqo66R8\/xkGbdou6ECQwJho4OPGb1xqbxW\/onZLuT5Fs5dwW0imnTRlmcD1cGlYgfQ3FWST2lV8yubTZqQ4IfvrMy05+dervV1WviyG2SdIlaXxPB1\/WAOtF+GF1ahNbQVtqfwnnn2KMD0Wrrd\/nyEPt\/GzXwIqkn\/GUmK6tTj4CWFDUKbBI43gqTg05osNm9JMe9darEo8J\/5aWmZ1SkEFCOgaGckhasPCPqdabxU+douWlds2NGULSehA5ANkJTyaHNjbH7BId7DyFrst2tED9OU+gtH3tSCfyZz8vfcgI3xcOxHriRu4uAJg9Ai4KV6Yy24yjN83mUpjGyy\/fNf6Z6JcX1Bc0cQxLhUcgihd\/FShg\/4H5rvPA39lJW0ti230lljcDIpWdY5FUwwMrZQj79ad60010B1ufK39CRfJfY84AuFW+I61rQlUGAoCJul58bLlm7lfeQjckg8y9zOu2KzVoaT9yRDKIEJuw1Jaz6+ltata8a1Wu9ef9cWqPaJnSx2gSBCGSVFwMvZVPjFYCtWcgIdbqb2I9TDw9LABoppvi\/YjyzeVt7wCtjXHYn2GWqb9AbOePjfudZz\/CqncmcbU6Nz\/xLYscCuoIZdvqhBUneeCON+pktrJmP9SKxPe2yGyUm5nmltzt92wwtynlilHSy2ksZ94MKsnXK9rCau1a3hW7VoUMBtrFsC1BX+zCV0E0zhAfwXVaMM2fDrdyO3YFxaY\/4xI90Cd6812+eSmWgU0uaV\/mZ6Ze7KOdrWVDtX4n2LrNlJ+T+z51UM06nlFxg3ZUfXK86SP9NuGLOYdvImSE1vzlFqTKa0QByi8FX0Gq\/pBYIKKiaZyWmMDm42+sfXpL8tl\/lDVzFrA1Du1lTP8oW1UN+AvCiRb5MvAQKPfJ1V\/Mko7aDKmZPAyOtB5zQZ2T35KNaPMCGccfjdLsxRGgWiY6bpu7APC9GQgqj8Zf48YSAhssGj6vDkI6zf959X0qu7kuzdlmoDCTYQO6pz1CGytuNw6V4+0JiwC5ti1F\/eTUyqX7+IcXMJzCr11GDRf4qx9PHtNaosNuliY+8iUYUw8w42TYds\/qqmWpgXM2AJYPUpbSbgSR0Sh4GDymGaamt4GFExqLWZlupYCPTAJOdfKtgyZsEzGfgvJjz8bIeLbKzevDUq4Wa8MO5Mm+mFqFeLdAns\/I05RbpUXVrugur\/Hoz38gPg6hHPuaPcfx0UpI3i8HoVoQXsQj2+wC\/3Z6ccpOK1WMs+WI1lL4XQlijDZTS9MBzzsHniRUgYyJcFiRT+ZSiQ1OGqcDWmCBtKYvY3XxasMAlgYaP5jYNb1JNn2V893bKhrayrxkJndH66X7GlrTYMUwT\/xekdYFoGLgO3tcTbBwWf9VZ\/jcOGNhONZQ3h7CbZdBcjfgAuP0CunbMkUech81W52uerPvXW93fI6WB8Yu9VU8n+uc+9MmNwhXcaz6tuPP\/Z3iZcXoAPifzQA7jJ1SnQylF1A1QWgltnU+mWU13M0w2URWEL3AjJCWtVyd6iI6\/tzGKOiFsrGJqBbd\/QIlHeEld7vsnTymVWDY1WbCgBHmn22koWXEYWsMmBZ4Mgwv9hEGW\/Y16EoGfk1W8+DsS4myeBtUA8Yt6QRAIaYtkkdDzb54WSjKP8o71bjBzJunQxVBdJfELc\/EhoBglhBzwO2ZlJXh3s8Om+jXBHIXHB1TOviDKbFqffv10ENDW\/WbbaKn9qsAzEKLjk7AxP50oHyC\/iFD3U0wgk6IBoQkChOGIckfxvlX8fWrwqB6eI81B3AgxUSzg3+nLl5bAGWtEtQsIpS9et8Sygq6E2MKgTNBAzF7X0VycmTpsKaY2c65cpMUV+6ylpnJTeegMuG+Ub4HRK+2rz+Z0LUXLEXPlzII5\/6yIjLfE8m1XydQGb9OTVhnYvFhrsStnHZvlUJLxMdnK+4d5IDeOhefrHKqKbsQeK4zVAi9Mxo13C12WOEsu46CNaSa0jCm9QTgeZ3UoKgSnxYJNIqyZnr0CR0va\/j9j6vtH+aTUIUV37gOWBJyeOfze4URN2bIZ9jyKAU\/5nMXJRhNzd2c7gx52JUIcIV6HlSSluveO0y\/YBRgqObexiBBAEZtWNlFTl8bz7yN7rijm2H6aiPDIS74dqLyaerrMKg2uRHnLEnT9OMGlyx3UX6ghQaf9sTe2gt3GeqfIATVUSB46U7UmWpr4Vqlt4XMTheIVa6LdPAC8SqZ44x7WwwFE6MuBCV8AVwJtCkEHo8wiaJoT1cNa5akZK\/GL\/0dsGmr\/EZSWvyL9eXsw5mXJ4Tv\/LsC4dbiAtWYJ7DzeBcJObieaPbPzRQ54jswENTxea\/QdThMjEe5EoeXPYPpN1kN5uD4etDV9rJLTCpm3BVNWwlHrH4Y4WVS4m6p3z57jfPCCaucpCBffUd\/aXRA11spqcQ\/oZqn6DFFFBeergBU5Iy9MEy7nvadaqgjfvzKsHNxRmXK8VAUqXghIuAiYfJonQYVeFVIyyhQLpk3AP7KXkgdZE4AyAvCIL1xGtbVdlIH+WJ9p+KfR6V4fa1qaIdPqMZppuf\/hC542l9pLUi3q\/zhqrsfY7E0Fr9KurQslnRuuLnMQbTqPBZbSDeK0HPaDcM9kxqr\/2IiI3qxUDgFYvOvaBe0aCNBJIlbe+\/fp7kRCcnumFVkEILptqpNednyMFQAfkrzHnkpCWsZxiFnubSWgZqYZyZFfH4DroRDvXkbdz8eU0cw5UmqyTZEPXIyvCa6ZxjfqDAD9SLa\/bvQIr765USMLiC\/tkEIpJHELaU\/hmcSMIESlo8uQzQ+lr1TWFgPyJ9nKBmagdGLHwBRSAvfqoADFdon1YtW8Dekdm6Zl5ocNVljSkFv8dzGTv+3XMe7\/Aw2fXCu9y8s3vWgIiVmKuiIaJRr\/9Oe8jY4YAX8WH70hwnmfoaiDjMwLcG8NKnT51NPtIZBrCq4oM+5nMqRyD75zShfCSIGr1TKHEDjZxUxVieXYsBu1WmMR15aAPcFTPugtWUrqPlEtjrkmAebmSPno23mMwJ8zLiDs2KMCtS1CQ136WElay\/0svCmfx9TvFmwf5TPEWWnwHgEE3fqcB3OwwP5bGH10OP2hv9dWOpiFIaUuAjhrfIH9WIB+0wGe2J9is2ZE1YL8oweZVK645xY5MoqtY\/qz4tzJ3ISToucXeXOf1bxIGLyAUCtUgzAhAqNOlMYt9oGqr2YwZzgJ+a\/boRx5oZCTNc6GIjBgSmU6fXafu8Vy\/UClh0eZpJWJrc2kAt1ypAp2FgmN7c8HmRa4U5nCHtkmSM4MWUqqs9BU7mCqG3CQYSJdyH9jfcrDNwJpobYT\/SxTlR7ySqCdjZucnpLLHFzq0og1Iw6M4M0iU2YTzow5Uzv+pYr2RbTCWhAMsdghlNasGW7zPRnsbu7yq4q0Avq13vAxt5Ko59wo11nGLOP2auTtzAwfVHcGfrujwF280Ouv9n\/OYsFVHu1iF+6a+rBB058shOFlxDAcajIeaG+nhYaP+OJ6DxAzIMIwVPFokypIdFowE+XF15KVjN\/5W1zNzm2OjtXb\/+yGyLczrWDKIM4\/usUdesTQ1sfb2EY8mesVPAG2CNRtIi2KRr8gixdTJ4+IJCYW3KaLs4s7u3erHTPb+sfKudsCPRYoGKOh9tyCYvJzRFFUNbU+gIRCXRQJllC+2VIyTIFUl17szhz72hWMvBEw7QwLJ3cHxN9YvQVQXtaLqdNulRK7MjCvag\/5Sw\/b3DKJ3Fs0KKBYpT4ySWrKAboSiUSswL87AnoOKkFdlvTE3cxRXIZ1xh9tkDnW+71d9WRD+lKVueM97a2qEGyQgN\/biaIkhxB7JzYBaErDVgQ0hYtH+Q0CzErU3ybQAeVPp7oWw0fNiBde8OlC6PVSpHHcFsuKq7TyNOS6U8GZ8t5GTeMc7fMJfZFh3IhJXKvdTsUk0YIRNHZkr5qqCGiuXyosK3MWSq1dPCfTfXePJ8GmrYvrCufc4WEk\/URi3hYO6LAN1ow19fJsos4QaugMjRayDnmBSKycFBlTNA5N7Et69fvwZrs1L929momdB8RY0XDAeT95G9MFfKUqOEroUMh85OwbBK3Hhq2GqfUBJYBTGrzIwGNIVbzLZ\/827rNi19S9gM2RMzHvpXdxRj5xLhnZzEX7xV+gU4mC2D620lQ6vbWgLdqbzSjIuJbeXRP\/4EroLeGIgVEkF7KsGNnabJQAsTbH8XuLAfDYqhWetJyLSqxXjiK3\/caDI5uBqpBoutekK5H+PsdM7SIQqHY38j1otSCkT0H1LDJWiaHTJb5TC7wl3oOouTOpz+q9UbDLWubmVqbyi+Mo1nt4siihK\/OgB5ThN7sEb+u5gVUloXjKHIoH3kBMGfpIse3uH0UkyiGbdn4nmfTW1Qrng3HXblBkKWUT7zgIRG03JRlq6+8kybWF\/P17vUouqQegHwfispxctlu8ANPAy3TmxGbc30MgOY48UogATdy9DstifhOBBc1WgHqwf66SEP6BSVlKYI9VdT92iHj9vkVGce3hhh9A9bXUkBtcl+6Vh9PnHuwh\/GPvxehGSZC4MzDOeOAUm8vvscfYIaOlydc5nCG6ZB8+prd73HviZOigpJ5nQZ74Ep3NNtzLPx9LO6QrJLbHMxSmgR9KlYcpoZVF0rsb\/AJyefrowx0c9b2vytaWJ4D20qNY+AqJELzEp5D\/y+RPoGxJv20FC67M09yK9O7hboeulLutAmAXZly34MPUDAZocuMZ5ATkJtJvrxBRkDlMtM3cXjO3psQf+Mw6HGaOmxcrHYRlu5ccfGsNHcr+XVtaUUnbSzVsWbXmGUxLrx1otdGVpBlBYJm7fUuj\/Wmqqz+cjsmoDjbST3v85pmhib7gwBHu7n+don9FdgCk4jLH+tIBZn6uN8cTE+3hI6\/VHTwlYKmSoi5OSkWIoGELVeerNcLqR91OkeMGG0ApaBTL2lAKWdk2saXsvyGDg0Ym0H3V6RF\/0+fEjFaaH3ttMD5RpBhJYap23Vu21ZRFynfgc\/K1HNZGI9GfwS9L\/QIf8GZIvgQEZf\/klyNHuOYPc8ROR7kxg5q5NB+Z\/XeTRoc6L4rOLDmpv3z\/z2v2\/lD51AnEna8Nr\/RWRX88qOoYbIqe6qg4Y9wftRGxbr9+yGGpMnwcPNZKiv4S3g0XNADqQ2Y9L0y1OEr2okBF0IhCM8n\/6O7FX5m\/3VcE06QKHqU5y47GMYU\/Zqh7nxDTdTyEvgtml4vsghj5B3egpilu4EwA8kKKrHV9VGDNC4rzllYvhXKJwQdgH9vASNJ7BiVaQx\/j+IUQqQtW3vNsl82CM6D2W2mCn91RfJtCLbAvTUKmPTiQ5Io3S0rVifShBflgfykohOx43cmY3arWhNXUnnh7g4Lv2yxR2M0Aj95YYScxTPTeAhl71Rx4zjdJhBhs8ohSr6zBnPfqhMiaJDfVo73NqsVDNq7Yg8eu8pxSVzY54hj3zgexB+f4tyB\/c6JgyliwvvBK9AGTy1pJJN+5ibyGAZN5QEcJPulKZYaE+Q55mS8nsDMjylhlmdFaS109FgDTbTRA7rcsPxZAuFEv6XPHQkQbTqicNGKbz2EtFvMM7Ot7hXK1eJhS4UgI211gUIn3UJfhwoW9eNT44fKEvDguv4xL2IgV+gZiDdcnAccG8KyLcwDAi3f3tFEyiuGhMTpY+VIXZeMmiTqts3AayB3Y5rNl9d8NcnxIEF+igzeIBCayOiLnhxGrjZY2zp4OC5xaxHS\/4a8wLlKw7YDBj4TWK8PebOHtoJ8m0cjWxv8C3q5bn929I1Zal9b8Bg6NjciG+HYP0V8vJDFup112SS2N4446BRXJhoYhXP5wpW8loFOKCJ5zxPylqfJO1qW2RfLrpnxe5sdvqhViesaPQunvSzroeeKHY\/uZewHHgrfB4QyCzI75\/E4Oyr5rN2M5sA1RyQc\/GYX5RTXJvR\/BUnv40voRSCHip4yeWJWOi1EDtaWCzDWAcAVN9pt0vNQ6pJl7GlojBR1iK79bvkrX+86N93zFmp0PwudcfgqDuKJcaX0AZiRWIMgD1+zFN3\/TPGgBhUMNV45Dxq1wLNLzh3gqCB+UEAtt1cClF4JfncWHvinGuQkUmap6M2xejTXVtshV7N\/rdKcW66lToikW\/4e94pafau2mjzt2Sezyzn4jfdEeJMW3SEMiDwpAV\/pG\/CytVLihgW1oUNfgnTsOL7y+42B+PgR5W1xCeuVixOElUdrl1Onb60\/rRHSCaSTR0gnk\/fHROUQKLJY8mvjhlp6wSz9\/Ba6UUBHzsvxHxqM3S45XDMmKnlbwTH1yGtnIbWSEUg1C8ICn5UxRbkGW8Mesrc2cRlAj2BmjaR8c76\/xUzDwNDIedPv4vwZFWkCFyviF6msP5vWTBe+VKUclaS+J22ADBHb+1W9uvj9Qmdc\/V+TUu9af22bUUvXd7HVVDbvVPq3jksm\/TLTmpW5Wy\/F5BcvqgtHdRJ9Ra+sVic4sjb88cjX7SUmSJoQk\/IfMyl5x386AcURtPnDDG+EeJ7P9RbPO10E\/lN9ZQkJj+OnPGgjghTti08KvZLJku0GIub85tC2asvGFCQ87hLazw1\/3gdyEifvNuhh9YXlCvY9VbOST07R7CZlY7IWdegqj5Sh7CxNVIxxUXovzrrxNrc5ZfkYcIODf4u+TkMOtAOf5DcuBYsOyBN1a7gKJan7Gc\/\/jjou0lsaYl\/pWH0p9KH\/CNZnajZ8U58I7cR9aiEOBR5oCbkLQZXyb5FIQbcZQp1Vv0CP7oo4GG10ikQh8qCp+atW0rgaI463iI+EGl7pUUHdchuhw7vG4UOBsKeAgN2AvHVJgn\/OXb3nP5bdxfMeyjoN0ZNrAJqW+faGE2yZmvbJmdpJHgQQlmzMwsiZrcIQqoY8jma+cEhKvwkxb2Vd41CD7JQ4QroPY4cVeJqf2Jr3mv7kFd9FvUyypn1lDtsPwDzQPv1pXiX9ndQZKfpFlxh\/LxWUTMJQDdtru5VKnWsXwSq3LTJT3QKWaCc+I1\/IQh217n+6yijEJk0mnUHIAGipbQn1q\/x60B5olGaetMSnXFbu67D1gQWXaS7WA8QIHVmum8M9XaxjJrPDLmltRI6ilmrRG8teM6Db+GQ\/qGCYfC8jtFJEDOj9x9if3i6vaYvKF5p3HcqR3TF+OYSfEbVrQ6fgYZWaoG7EG6mNAEsT6\/Nz7U7+o1m2jClhQ9xTnZRdZmVDr4yC3iwRORcuWsymdErcFmnMpW0DJTNWpyusDlvkAaxE348CxOEl2gAGX5Op4KQIf3JzHDnfF2XoCZmAHtx9K2AL+\/8T6KmjDYCBAj9XVB\/u0qc1g\/zO+6tlJv848WfH1bs0M9lA8owepl\/PcQXK42+s3CRwZbwEPNkMHWyONThgktuGZpkpeTk8vlsCgR75ViAI5vp9PpwMxTehzkXLGc1kDhVytii5U2AztoY8O6S89jFxjirwG7jy3PY0q9ITt+GFtAL3lFrKmCyVhpkCH4iV48xaLE+QHX5M\/ekByFiIC+PPLmQZp2lk8uQ\/b6+b+TtNV5yrJg3a\/WT027w0WykJXjNQxkzvFOaA3xnitISBnB24m8XFy9uAltDNHdMP227zzqiGpiNWc2SZxhf9TPsskVAFXb2oLL7USwALGODl8XIK6KlL3ca+zNPayzlNXMAidvjjSnlqlqyx6daO2EuKvTsSgKwrgUuMvQSY9lWD+eFvJFW70ysu7ylx3ITMU3Wa2iOl5qpUwmX5R2fSHk6odmDgSyxer+K9R77CQqofhQm5mTQTBCc8i65ULW\/2+I8iQKvTNwJ8V29PQTiQORzNn72hKNTTg6E\/lf7BvjzCCrTgRFmoLQzxMyvEx4fLvVS9n1MjLUQxEl0fT05k7ozgFkua5Qi6egsk0KvT2vvn+b9uqaM8b4BemE6rWZVGDOqfB\/bTUMNGohDiRSrPWsS7veB3kAxMWpRL6qOwjrjoVYMqAHG0ifGuV+lQ8AOaH0\/DmRk5U+kfEinxnc1Ek3z68CRMXyrnidoMKM8JXaJkeFhf5JdJ53nzH9NURTIOkghY7PE49qnqgw8o433RmiuBbwKvWf52Xv7iYeZTYbG7J2JiARlSyzr832nbCPxuZceD13PW6RB+Ea6tKMpkVsOGjy\/yPLpOB4YUfypBSfOK+rXEGfCs8jr69UvDb3vTFxSAFz+F4tf9kMuT8fpRDqMyX2QJJdITkwKfnn5ktiiRLl4HPsWoDCf7qRumGxM2DZ3H1Dtjfn+52mbUjp2mEFpC4diy\/QQzpwTwsW86\/JpvHjEdvhM274MXPNd8ZeurD9eF+bt2y7nR6SLrI9szplxgAIPAAeaJhuizmqJ2PQqgeWFP1M5rDOJGCoX56SqsD8pY7LLpYg1pSrtooQARcH7CC3UgRX1TKkQuPW\/D2sjxK1NObsvwqec6QHYZvUa\/klZY6IecuL0pBD9guMk7dFhXDvt3x4Foaoj7ux5So8CIiEaJqI9BkELQEkOQRY1z6+RVj8qy5BueNqM5VPz4R0uMdHjq1Ns2pGaaCp+igYY1vRHzmjLD1ZLe+YkUqu6NmmFZsiqNc6\/9P4XKQvPF\/n3xJP0EW2kGMcXchpOTG3TnH1fiDzNBJ2LDlTMRP4Gr\/nvPh7TIXpBqkXlt9xWSkouyYfMoae026kuduc0M\/J\/lsjIiabOMrd1Ad\/giNEg2v6fcey2RpJ2wTZvqR1lU6WNpxeXfW6JhbjZFA\/\/hxwqvkBB16pvCuMpJrbDV4KxaBTN0SKyHfCa+y65leok6ACTicmtilko3edB8dhhJXcBKexdP42pLAAs2K9vgzBWnAFn5GzEqcIqarS7UcOS42Q0bTOxfrD2mDS5oir0xOlZVgowjkjSdDbAwqrxEnDu9pzEnEuPBv2+48andlSUr\/KFQxa1s2iBiOhAbzSB4XW5SMpRH32Nw23I0mOGFUH+lAtre\/DxBjM7tZihGEcHGg3ZFxvgFZ0I\/q2\/EfUe1nsJh42q44aE7kCE7TRTXYsJdLypGUeTrt8dPizbSgy4YJWCeJa9ylvDPNeFeBxPYDQ31QrEzhWQmJAVCk24LXd9y+GpgnDEB7QRxMofJhenRuuDqqCL4\/vRKXjM9luID9EUL5K8LJo2ZfWzIqY2FtK+rEuVORVHTRe7pb44dtofnQq\/568IhOy3vvlMTilCPPPwrETQy3PbhsN4sENJfHvWQMhyQ+dtPp4mxov8I3n9wXy2Urinl8UKl2AfRyZIuo8MD0nX0a2GR\/J\/9232wGIorKa1jfkf7lDI67YfyuYsXI1jD+4Vk97d0IboiOMIyzbXRGFGnxTKG2mKxSNN+4dv7drnCYIRk68QZWPA1B5sUFbYwn\/Jpc7jv+l\/kHoplBpop8uWIxigXfAqqVqtPa7oVCk68ttaFSLclaUFaqVETgqnS1ixMfCH9JaJZBoi+x9bqxaMnM0ln4CGFA+N26OEKy\/mD22ngaqm9P8YZkEPq++etZAWsskFsLutMOM2Fa5XvmFjRf9XCzBsDoWKenNYxx3lXhH6L2tk7caNrAYWpecZzmT0AiCi\/DzSA0CUqoMFsWHYprdgRSiEOzLuKSrGoXZC2LxXxRJBZAFaVlqhYRyc1pejdTVsHk3z16mOx5C3pjQ8qoFcK\/AOFmIii0NzaBBIwW5xBRyYtZDwe9OZZVIiPrHR66kTVb8vL2mB9rUSqEffP1rlgc0L4YugvOt4yXN0EzoB9Ka8INxUlWpsjSLjihCC3NMw0eqsVZUO2hQdJwfZx3dcLuq1LJYhFXPxmfeRi17RGOKsXDzABW\/DSlaotvnoJCD3v77sAI\/aybCscyi+UyC75aCEkfxX\/NvSsF4NsShhJ7UTLFu\/uko+DHrRkalEqDFt8NiBjgd+KfWX3mp07sRyjGe2pRycmVMHNHwVT0Z1qSzHdjmNnQ1tCDegOPtD7OlVCrYtdAn81WzyEVxTWJFHdxiQVFKXcx\/2vuizibyzuaRihZd27iO64qL5dI3fsXIiJ\/ibQItBCQxwT+lHJ1VpFQRyrGKTQGb9yzdSroGVFal61SiXbQaT74m9vF6CVR8sOJQ3KREM\/uqOCXJs\/kfVCIqtmc9NRKoD\/8F9xJF14gddKxD22YxBTVQTyx15b\/UobRPsSixgLFgHx78Jp2KhBohbqr3wqV8tB13vl5cKXWSWTLFBtx4Tz88039P4zsWCzUS+QdgB25opcvEW+cCRrxY4Q9jf4dMPwVeN7uR5fxBT5SpKv7EDbcR3AsjWPvUYVRiijPfWTANaStg0XZCIIpYA6RxHaKNfRbqtdgBV++cwe\/tEILmCgtXl5GMhM3MX+S4O4Q1WWyTTQ+G7+yAUfpwBw4nEpL9slSDi6bte54bVqe8gvx3mX8860ZA&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;nonce&#8221;: &#8220;tHBh9KHUl1CNAMsG&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;tag&#8221;: &#8220;yte5RCRnKG5jgWMO\/mSUZA==&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; },<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &#8220;format_version&#8221;: 1,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &#8220;instructions&#8221;: [<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;Run: python timelock.py solve PACKAGE.json &#8211;output article.txt&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;The solver computes x = a^(2^T) mod N by T repeated squarings.&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;The AES key is wrapped as key XOR H(x,N,a,T).&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;The package intentionally does not contain p, q, or the raw AES key.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; ],<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &#8220;scheme&#8221;: &#8220;RSW-time-lock + AES-256-GCM&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &#8220;target_delay&#8221;: &#8220;~10 years of sequential computation&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &#8220;timelock&#8221;: {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;N&#8221;: &#8220;0x5b4a5f1e633ded13c8a675ec4f422415f1678a7f870994705a34a5a2ebeaf7895061311cd0d2e61f5d09cbe6d75793de86763c4618f01368ca2415cdb627fa3ea5ee76248ad517bf0fa490fae03f0ef469ac6da1cc2ad53a2963e654bf7564b5fb7bc9cc52ed3202c67470d9c77183634e21d4fc7b2a9ed75b43afa0e353a946abd94624ff40b82b59595d6ace4eec5fe378330785d5c7d799ea7674e2ac0f010d9d2ae2a5f662a0fd168f8213f1d1e9c815a72282589145a37112b98bd70672a81f800f754294e750c6963034bfa81506878f96122d1e8c553e0f117167355b4f0b2b78516d1592282da1e0fb7ae61bb93efa77d87bc24bc3feceee3fb43ff3&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;T&#8221;: &#8220;30473866916236&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;a&#8221;: &#8220;0x1235bb0009e67a5132ca7ecfafad191e8affd6afaaf94abbabd3e13f50409efff96d614ae66f716c723f98b2c321364287ee2bdd9367e2bbdbff00891a71cfd13235d53779e934357cc4413fdfb14e9bef8ba791a5fb2b904101e32014dcee3203dfd2d4e52898b0fa0c8ab06c8763e08e6ee8372ff633ee1fe6409d57c4a24b80bbe89d26d49dbcd533579c0db5f98bcc89166181fd1785311802cb2cb855d809e2b6aff701d0214b6103a25033d118691a599fc9e30c2cb0da82cd5f04358bcee9cf33073be079cc57a657d032a4fe0d03cae3145304087c8635b6c12711017f07953f90cf5d87861d331de58d32b99555cb422eb004ed0fead1c5d14c145e&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;key_mask&#8221;: &#8220;SHA-256 counter mode over solution,N,a,T&#8221;,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &nbsp; &#8220;wrapped_key&#8221;: &#8220;qbVLlqCoBeMo4RX9ZA1ZCPcPzxsRVdJvrNA936nquHA=&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; },<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; &#8220;warning&#8221;: &#8220;This is a sequential-computation delay, not calendar-time release. If nobody starts solving, the delay starts later.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3\n\"\"\"RSW time-lock encryption for one-shot public article releases.\"\"\"\n\nfrom __future__ import annotations\n\nimport argparse\nimport base64\nimport dataclasses\nimport datetime as dt\nimport hashlib\nimport json\nimport math\nimport os\nimport secrets\nimport sys\nimport time\nfrom pathlib import Path\nfrom typing import Any\n\nfrom cryptography.hazmat.primitives.ciphers.aead import AESGCM\n\n\nSCHEME = \"RSW-time-lock + AES-256-GCM\"\nFORMAT_VERSION = 1\nDEFAULT_BITS = 2048\nDEFAULT_PRIME_ROUNDS = 48\n\n\nSMALL_PRIMES = (\n    3,\n    5,\n    7,\n    11,\n    13,\n    17,\n    19,\n    23,\n    29,\n    31,\n    37,\n    41,\n    43,\n    47,\n    53,\n    59,\n    61,\n    67,\n    71,\n    73,\n    79,\n    83,\n    89,\n    97,\n)\n\n\n@dataclasses.dataclass(frozen=True)\nclass Progress:\n    done: int\n    total: int\n    started_at: float\n    last_report_at: float\n\n\ndef b64e(data: bytes) -> str:\n    return base64.b64encode(data).decode(\"ascii\")\n\n\ndef b64d(data: str) -> bytes:\n    return base64.b64decode(data.encode(\"ascii\"), validate=True)\n\n\ndef int_to_hex(value: int) -> str:\n    return \"0x\" + value.to_bytes((value.bit_length() + 7) \/\/ 8, \"big\").hex()\n\n\ndef int_from_public(value: str | int) -> int:\n    if isinstance(value, int):\n        return value\n    value = value.strip()\n    if value.startswith(\"0x\"):\n        return int(value, 16)\n    return int(value)\n\n\ndef int_to_min_bytes(value: int) -> bytes:\n    if value == 0:\n        return b\"\\x00\"\n    return value.to_bytes((value.bit_length() + 7) \/\/ 8, \"big\")\n\n\ndef xor_bytes(left: bytes, right: bytes) -> bytes:\n    if len(left) != len(right):\n        raise ValueError(\"xor operands must have the same length\")\n    return bytes(a ^ b for a, b in zip(left, right, strict=True))\n\n\ndef derive_mask(solution: int, n: int, a: int, t: int, length: int) -> bytes:\n    context = b\"|\".join(\n        &#91;\n            b\"timelock-rsw-v1\",\n            int_to_min_bytes(solution),\n            int_to_min_bytes(n),\n            int_to_min_bytes(a),\n            str(t).encode(\"ascii\"),\n        ]\n    )\n    output = bytearray()\n    counter = 0\n    while len(output) &lt; length:\n        output.extend(hashlib.sha256(context + counter.to_bytes(4, \"big\")).digest())\n        counter += 1\n    return bytes(output&#91;:length])\n\n\ndef is_probable_prime(candidate: int, rounds: int = DEFAULT_PRIME_ROUNDS) -> bool:\n    if candidate &lt; 2:\n        return False\n    if candidate == 2:\n        return True\n    if candidate % 2 == 0:\n        return False\n    for prime in SMALL_PRIMES:\n        if candidate == prime:\n            return True\n        if candidate % prime == 0:\n            return False\n\n    d = candidate - 1\n    s = 0\n    while d % 2 == 0:\n        s += 1\n        d \/\/= 2\n\n    for _ in range(rounds):\n        base = secrets.randbelow(candidate - 3) + 2\n        x = pow(base, d, candidate)\n        if x in (1, candidate - 1):\n            continue\n        for _ in range(s - 1):\n            x = pow(x, 2, candidate)\n            if x == candidate - 1:\n                break\n        else:\n            return False\n    return True\n\n\ndef generate_prime(bits: int, rounds: int) -> int:\n    if bits &lt; 512:\n        raise ValueError(\"prime size must be at least 512 bits\")\n    while True:\n        candidate = secrets.randbits(bits)\n        candidate |= (1 &lt;&lt; (bits - 1)) | 1\n        if is_probable_prime(candidate, rounds):\n            return candidate\n\n\ndef generate_rsa_modulus(bits: int, rounds: int) -> tuple&#91;int, int, int]:\n    if bits &lt; 1024 or bits % 2:\n        raise ValueError(\"modulus bits must be an even number >= 1024\")\n    half = bits \/\/ 2\n    p = generate_prime(half, rounds)\n    q = generate_prime(half, rounds)\n    while q == p:\n        q = generate_prime(half, rounds)\n    return p * q, p, q\n\n\ndef choose_base(n: int) -> int:\n    while True:\n        a = secrets.randbelow(n - 3) + 2\n        if math.gcd(a, n) == 1:\n            return a\n\n\ndef fast_rsw_solution(a: int, t: int, p: int, q: int, n: int) -> int:\n    carmichael = math.lcm(p - 1, q - 1)\n    exponent = pow(2, t, carmichael)\n    return pow(a, exponent, n)\n\n\ndef slow_rsw_solution(\n    a: int,\n    t: int,\n    n: int,\n    *,\n    report_seconds: float = 10.0,\n    checkpoint_path: Path | None = None,\n    checkpoint_every: int = 100_000,\n    start_index: int = 0,\n) -> int:\n    x = a\n    started = time.monotonic()\n    last_report = started\n    for i in range(start_index, t):\n        x = (x * x) % n\n        done = i + 1\n        now = time.monotonic()\n        if checkpoint_path and done % checkpoint_every == 0:\n            checkpoint_path.write_text(\n                json.dumps(\n                    {\n                        \"done\": done,\n                        \"x\": int_to_hex(x),\n                        \"updated_at\": dt.datetime.now(dt.UTC).isoformat(),\n                    },\n                    indent=2,\n                    sort_keys=True,\n                ),\n                encoding=\"utf-8\",\n            )\n        if report_seconds > 0 and now - last_report >= report_seconds:\n            elapsed = now - started\n            rate = (done - start_index) \/ elapsed if elapsed else 0.0\n            remaining = (t - done) \/ rate if rate else float(\"inf\")\n            print(\n                f\"progress: {done}\/{t} ({done \/ t:.2%}), \"\n                f\"{rate:,.0f} squarings\/sec, eta {format_seconds(remaining)}\",\n                file=sys.stderr,\n            )\n            last_report = now\n    if checkpoint_path:\n        checkpoint_path.write_text(\n            json.dumps(\n                {\n                    \"done\": t,\n                    \"x\": int_to_hex(x),\n                    \"updated_at\": dt.datetime.now(dt.UTC).isoformat(),\n                },\n                indent=2,\n                sort_keys=True,\n            ),\n            encoding=\"utf-8\",\n        )\n    return x\n\n\ndef format_seconds(seconds: float) -> str:\n    if seconds == float(\"inf\"):\n        return \"unknown\"\n    if seconds &lt; 60:\n        return f\"{seconds:.1f}s\"\n    minutes = seconds \/ 60\n    if minutes &lt; 60:\n        return f\"{minutes:.1f}m\"\n    hours = minutes \/ 60\n    if hours &lt; 48:\n        return f\"{hours:.1f}h\"\n    days = hours \/ 24\n    if days &lt; 730:\n        return f\"{days:.1f}d\"\n    return f\"{days \/ 365.2425:.2f}y\"\n\n\ndef benchmark_squarings(bits: int, seconds: float) -> dict&#91;str, Any]:\n    n = secrets.randbits(bits) | (1 &lt;&lt; (bits - 1)) | 1\n    x = secrets.randbelow(n - 3) + 2\n    end = time.monotonic() + seconds\n    count = 0\n    while time.monotonic() &lt; end:\n        x = (x * x) % n\n        count += 1\n    elapsed = seconds\n    rate = count \/ elapsed\n    ten_year_t = int(rate * 365.2425 * 24 * 60 * 60 * 10)\n    return {\n        \"modulus_bits\": bits,\n        \"elapsed_seconds\": elapsed,\n        \"squarings\": count,\n        \"squarings_per_second\": rate,\n        \"estimated_T_for_10_years\": ten_year_t,\n        \"note\": \"Use a lower T if you want a conservative target that may open earlier.\",\n    }\n\n\ndef encrypt_article(args: argparse.Namespace) -> None:\n    plaintext = Path(args.input).read_bytes()\n    t = parse_t(args)\n    n, p, q = generate_rsa_modulus(args.bits, args.prime_rounds)\n    a = choose_base(n)\n    solution = fast_rsw_solution(a, t, p, q, n)\n\n    key = AESGCM.generate_key(bit_length=256)\n    nonce = os.urandom(12)\n    associated_data = b\"timelock-article-v1\"\n    encrypted = AESGCM(key).encrypt(nonce, plaintext, associated_data)\n    ciphertext, tag = encrypted&#91;:-16], encrypted&#91;-16:]\n    mask = derive_mask(solution, n, a, t, len(key))\n    wrapped_key = xor_bytes(key, mask)\n\n    package = {\n        \"format_version\": FORMAT_VERSION,\n        \"scheme\": SCHEME,\n        \"created_at\": dt.datetime.now(dt.UTC).isoformat(),\n        \"target_delay\": args.target_delay,\n        \"warning\": (\n            \"This is a sequential-computation delay, not calendar-time release. \"\n            \"If nobody starts solving, the delay starts later.\"\n        ),\n        \"timelock\": {\n            \"N\": int_to_hex(n),\n            \"a\": int_to_hex(a),\n            \"T\": str(t),\n            \"wrapped_key\": b64e(wrapped_key),\n            \"key_mask\": \"SHA-256 counter mode over solution,N,a,T\",\n        },\n        \"encryption\": {\n            \"algorithm\": \"AES-256-GCM\",\n            \"nonce\": b64e(nonce),\n            \"tag\": b64e(tag),\n            \"associated_data\": b64e(associated_data),\n            \"ciphertext\": b64e(ciphertext),\n        },\n        \"checks\": {\n            \"plaintext_sha256\": hashlib.sha256(plaintext).hexdigest(),\n            \"ciphertext_sha256\": hashlib.sha256(ciphertext).hexdigest(),\n        },\n        \"instructions\": &#91;\n            \"Run: python timelock.py solve PACKAGE.json --output article.txt\",\n            \"The solver computes x = a^(2^T) mod N by T repeated squarings.\",\n            \"The AES key is wrapped as key XOR H(x,N,a,T).\",\n            \"The package intentionally does not contain p, q, or the raw AES key.\",\n        ],\n    }\n    package_text = json.dumps(package, indent=2, ensure_ascii=False, sort_keys=True)\n    Path(args.output).write_text(package_text, encoding=\"utf-8\")\n    if args.reveal_output:\n        reveal = {\n            \"format_version\": FORMAT_VERSION,\n            \"type\": \"timelock-aes-key-reveal\",\n            \"created_at\": package&#91;\"created_at\"],\n            \"package_sha256\": hashlib.sha256(package_text.encode(\"utf-8\")).hexdigest(),\n            \"plaintext_sha256\": package&#91;\"checks\"]&#91;\"plaintext_sha256\"],\n            \"aes_key\": b64e(key),\n            \"instructions\": &#91;\n                \"Publishing this file unlocks the article immediately.\",\n                \"Run: python timelock.py reveal PACKAGE.json REVEAL.json --output article.txt\",\n                \"Keep this file private until the intended reveal time.\",\n            ],\n        }\n        Path(args.reveal_output).write_text(\n            json.dumps(reveal, indent=2, ensure_ascii=False, sort_keys=True),\n            encoding=\"utf-8\",\n        )\n        print(f\"Wrote private reveal key file: {args.reveal_output}\")\n    print(f\"Wrote public time-lock package: {args.output}\")\n    if args.reveal_output:\n        print(\"Destroyed p and q by not writing them; AES key was saved only in the reveal file.\")\n    else:\n        print(\"Destroyed private generation values by not writing p, q, or the AES key.\")\n\n\ndef parse_t(args: argparse.Namespace) -> int:\n    if args.t is not None:\n        t = int(args.t)\n    else:\n        seconds = float(args.years) * 365.2425 * 24 * 60 * 60\n        t = int(float(args.squarings_per_second) * seconds)\n    if t &lt;= 0:\n        raise ValueError(\"T must be positive\")\n    return t\n\n\ndef solve_package(args: argparse.Namespace) -> None:\n    package = json.loads(Path(args.package).read_text(encoding=\"utf-8\"))\n    timelock = package&#91;\"timelock\"]\n    encryption = package&#91;\"encryption\"]\n    n = int_from_public(timelock&#91;\"N\"])\n    a = int_from_public(timelock&#91;\"a\"])\n    t = int(timelock&#91;\"T\"])\n    start_index = 0\n\n    if args.resume:\n        checkpoint = json.loads(Path(args.resume).read_text(encoding=\"utf-8\"))\n        start_index = int(checkpoint&#91;\"done\"])\n        a = int_from_public(checkpoint&#91;\"x\"])\n        if start_index > t:\n            raise ValueError(\"checkpoint is past package T\")\n\n    solution = slow_rsw_solution(\n        a,\n        t,\n        n,\n        report_seconds=args.report_seconds,\n        checkpoint_path=Path(args.checkpoint) if args.checkpoint else None,\n        checkpoint_every=args.checkpoint_every,\n        start_index=start_index,\n    )\n    wrapped_key = b64d(timelock&#91;\"wrapped_key\"])\n    key = xor_bytes(wrapped_key, derive_mask(solution, n, int_from_public(timelock&#91;\"a\"]), t, len(wrapped_key)))\n    decrypt_package_with_key(package, key, Path(args.output))\n\n\ndef reveal_package(args: argparse.Namespace) -> None:\n    package_path = Path(args.package)\n    package_text = package_path.read_text(encoding=\"utf-8\")\n    package = json.loads(package_text)\n    reveal = json.loads(Path(args.reveal).read_text(encoding=\"utf-8\"))\n    if reveal.get(\"type\") != \"timelock-aes-key-reveal\":\n        raise ValueError(\"reveal file has the wrong type\")\n    expected_package_hash = reveal.get(\"package_sha256\")\n    actual_package_hash = hashlib.sha256(package_text.encode(\"utf-8\")).hexdigest()\n    if expected_package_hash and expected_package_hash != actual_package_hash:\n        raise ValueError(\"reveal file does not match this package\")\n    key = b64d(reveal&#91;\"aes_key\"])\n    decrypt_package_with_key(package, key, Path(args.output))\n\n\ndef decrypt_package_with_key(package: dict&#91;str, Any], key: bytes, output: Path) -> None:\n    encryption = package&#91;\"encryption\"]\n    nonce = b64d(encryption&#91;\"nonce\"])\n    tag = b64d(encryption&#91;\"tag\"])\n    ciphertext = b64d(encryption&#91;\"ciphertext\"])\n    associated_data = b64d(encryption&#91;\"associated_data\"])\n    plaintext = AESGCM(key).decrypt(nonce, ciphertext + tag, associated_data)\n\n    expected_hash = package.get(\"checks\", {}).get(\"plaintext_sha256\")\n    actual_hash = hashlib.sha256(plaintext).hexdigest()\n    if expected_hash and expected_hash != actual_hash:\n        raise ValueError(\"plaintext hash mismatch after decrypt\")\n\n    output.write_bytes(plaintext)\n    print(f\"Wrote decrypted article: {output}\")\n\n\ndef inspect_package(args: argparse.Namespace) -> None:\n    package = json.loads(Path(args.package).read_text(encoding=\"utf-8\"))\n    timelock = package&#91;\"timelock\"]\n    encryption = package&#91;\"encryption\"]\n    print(f\"scheme: {package.get('scheme')}\")\n    print(f\"created_at: {package.get('created_at')}\")\n    print(f\"target_delay: {package.get('target_delay')}\")\n    print(f\"N bits: {int_from_public(timelock&#91;'N']).bit_length()}\")\n    print(f\"T: {timelock&#91;'T']}\")\n    print(f\"ciphertext bytes: {len(b64d(encryption&#91;'ciphertext']))}\")\n    print(f\"contains p\/q\/raw key: {contains_secret_fields(package)}\")\n\n\ndef contains_secret_fields(value: Any) -> bool:\n    secret_names = {\"p\", \"q\", \"prime\", \"private_key\", \"raw_key\", \"aes_key\", \"key\"}\n    if isinstance(value, dict):\n        for key, child in value.items():\n            lowered = str(key).lower()\n            if lowered in secret_names:\n                return True\n            if contains_secret_fields(child):\n                return True\n    elif isinstance(value, list):\n        return any(contains_secret_fields(child) for child in value)\n    return False\n\n\ndef run_benchmark(args: argparse.Namespace) -> None:\n    result = benchmark_squarings(args.bits, args.seconds)\n    print(json.dumps(result, indent=2, sort_keys=True))\n\n\ndef build_parser() -> argparse.ArgumentParser:\n    parser = argparse.ArgumentParser(\n        description=\"Create and solve public RSW time-lock encrypted article packages.\"\n    )\n    subparsers = parser.add_subparsers(dest=\"command\", required=True)\n\n    benchmark = subparsers.add_parser(\"benchmark\", help=\"Measure repeated squarings per second\")\n    benchmark.add_argument(\"--bits\", type=int, default=DEFAULT_BITS)\n    benchmark.add_argument(\"--seconds\", type=float, default=5.0)\n    benchmark.set_defaults(func=run_benchmark)\n\n    encrypt = subparsers.add_parser(\"encrypt\", help=\"Encrypt an article into a public time-lock package\")\n    encrypt.add_argument(\"input\", help=\"Plaintext article file\")\n    encrypt.add_argument(\"--output\", \"-o\", required=True, help=\"Output JSON package\")\n    encrypt.add_argument(\"--bits\", type=int, default=DEFAULT_BITS, help=\"RSA modulus size; default 2048\")\n    encrypt.add_argument(\"--prime-rounds\", type=int, default=DEFAULT_PRIME_ROUNDS)\n    encrypt.add_argument(\"--t\", help=\"Exact repeated-squaring count\")\n    encrypt.add_argument(\"--squarings-per-second\", type=float, help=\"Benchmark rate used with --years\")\n    encrypt.add_argument(\"--years\", type=float, default=10.0, help=\"Target years if --t is omitted\")\n    encrypt.add_argument(\n        \"--reveal-output\",\n        help=\"Write a private AES-key reveal file for future scheduled publication\",\n    )\n    encrypt.add_argument(\n        \"--target-delay\",\n        default=\"~10 years of sequential computation\",\n        help=\"Human-readable target delay written into the package\",\n    )\n    encrypt.set_defaults(func=encrypt_article)\n\n    solve = subparsers.add_parser(\"solve\", help=\"Solve a package and decrypt its article\")\n    solve.add_argument(\"package\", help=\"Public JSON package\")\n    solve.add_argument(\"--output\", \"-o\", required=True, help=\"Decrypted article path\")\n    solve.add_argument(\"--report-seconds\", type=float, default=10.0)\n    solve.add_argument(\"--checkpoint\", help=\"Write progress checkpoint JSON here\")\n    solve.add_argument(\"--checkpoint-every\", type=int, default=100_000)\n    solve.add_argument(\"--resume\", help=\"Resume from a checkpoint JSON\")\n    solve.set_defaults(func=solve_package)\n\n    reveal = subparsers.add_parser(\"reveal\", help=\"Decrypt a package using a published reveal key file\")\n    reveal.add_argument(\"package\", help=\"Public JSON package\")\n    reveal.add_argument(\"reveal\", help=\"Reveal key JSON created with encrypt --reveal-output\")\n    reveal.add_argument(\"--output\", \"-o\", required=True, help=\"Decrypted article path\")\n    reveal.set_defaults(func=reveal_package)\n\n    inspect_cmd = subparsers.add_parser(\"inspect\", help=\"Summarize a package without solving\")\n    inspect_cmd.add_argument(\"package\")\n    inspect_cmd.set_defaults(func=inspect_package)\n\n    return parser\n\n\ndef main(argv: list&#91;str] | None = None) -> int:\n    parser = build_parser()\n    args = parser.parse_args(argv)\n    if getattr(args, \"command\", None) == \"encrypt\" and args.t is None and args.squarings_per_second is None:\n        parser.error(\"encrypt requires either --t or --squarings-per-second with --years\")\n    try:\n        args.func(args)\n    except KeyboardInterrupt:\n        print(\"Interrupted.\", file=sys.stderr)\n        return 130\n    except Exception as exc:\n        print(f\"error: {exc}\", file=sys.stderr)\n        return 1\n    return 0\n\n\nif __name__ == \"__main__\":\n    raise SystemExit(main())\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">cryptography>=42.0.0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong># \u516c\u5f00\u65f6\u95f4\u9501\u6587\u7ae0\u52a0\u5bc6\u5de5\u5177<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u9879\u76ee\u5b9e\u73b0\u4e00\u4e2a\u4e00\u6b21\u6027\u53d1\u5e03\u7528\u7684 RSW time-lock puzzle \u539f\u578b\uff1a\u6587\u7ae0\u5148\u7528<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">`AES-256-GCM` \u52a0\u5bc6\uff0c\u6587\u7ae0\u5bc6\u94a5\u518d\u7528 repeated squaring modulo RSA composite<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9501\u4f4f\u3002\u53d1\u5e03\u540e\u7684 JSON \u5305\u53ea\u5305\u542b\u516c\u5f00\u8c1c\u9898\u3001\u5bc6\u6587\u548c\u6821\u9a8c\u4fe1\u606f\uff0c\u4e0d\u5305\u542b `p`\u3001`q`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6216\u539f\u59cb AES \u5bc6\u94a5\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u91cd\u8981\u9650\u5236\uff1a\u5b83\u9501\u4f4f\u7684\u662f\u201c\u8fde\u7eed\u8ba1\u7b97\u91cf\u201d\uff0c\u4e0d\u662f\u4e25\u683c\u65e5\u5386\u65f6\u95f4\u3002\u5982\u679c\u6ca1\u6709\u4eba\u5f00\u59cb\u8ba1\u7b97\uff0c<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">10 \u5e74\u5012\u8ba1\u65f6\u4e0d\u4f1a\u81ea\u52a8\u53d1\u751f\uff1b\u5982\u679c\u672a\u6765\u786c\u4ef6\u6216\u7b97\u6cd5\u8fdb\u6b65\u5f88\u5feb\uff0c\u4e5f\u53ef\u80fd\u6bd4\u9884\u671f\u66f4\u65e9\u6253\u5f00\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## \u5b89\u88c5<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python -m pip install -r requirements.txt<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## 1. \u6d4b\u57fa\u51c6<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5148\u6d4b\u672c\u673a\u6bcf\u79d2\u80fd\u505a\u591a\u5c11\u6b21 repeated squaring\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python timelock.py benchmark &#8211;bits 2048 &#8211;seconds 10<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8f93\u51fa\u91cc\u7684 `estimated_T_for_10_years` \u662f\u6309\u5f53\u524d\u673a\u5668\u901f\u5ea6\u4f30\u7b97\u7684 10 \u5e74\u6b65\u6570\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u4f60\u5e0c\u671b\u66f4\u4fdd\u5b88\uff0c\u5efa\u8bae\u9009\u62e9\u4f4e\u4e8e\u8be5\u503c\u7684 `T`\uff0c\u4f8b\u5982 50% \u5230 80%\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## 2. \u52a0\u5bc6\u6587\u7ae0<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u77ed\u6d4b\u8bd5\u53ef\u4ee5\u76f4\u63a5\u6307\u5b9a\u5f88\u5c0f\u7684 `T`\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python timelock.py encrypt article.txt &#8211;output timelock_article_2026.json &#8211;t 100000<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u771f\u5b9e\u53d1\u5e03\u65f6\uff0c\u4f7f\u7528\u57fa\u51c6\u5f97\u5230\u7684\u901f\u5ea6\u6362\u7b97\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python timelock.py encrypt article.txt &#8211;output timelock_article_2026.json &#8211;squarings-per-second 12345 &#8211;years 10<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u751f\u6210\u7684 `timelock_article_2026.json` \u5c31\u662f\u53ef\u4ee5\u53d1\u5e03\u5230\u7f51\u4e0a\u7684\u5355\u6587\u4ef6\u5305\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u4f60\u60f3\u672a\u6765\u901a\u8fc7\u670d\u52a1\u5668\u6309\u65f6\u516c\u5f00\u5bc6\u94a5\uff0c\u800c\u4e0d\u662f\u516c\u5f00\u660e\u6587\uff0c\u53ef\u4ee5\u989d\u5916\u751f\u6210\u4e00\u4e2a\u672c\u5730<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u79c1\u6709 reveal \u6587\u4ef6\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python timelock.py encrypt article.txt &#8211;output timelock_article_2026.json &#8211;t 30473866916236 &#8211;reveal-output reveal_key_private.json<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">`reveal_key_private.json` \u91cc\u53ea\u4fdd\u5b58 AES \u6587\u7ae0\u5bc6\u94a5\u548c\u6821\u9a8c\u4fe1\u606f\uff0c\u4e0d\u4fdd\u5b58 `p\/q`\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u5fc5\u987b\u4fdd\u5bc6\uff1b\u672a\u6765\u4e00\u65e6\u516c\u5f00\uff0c\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u7acb\u5373\u89e3\u5bc6\u6587\u7ae0\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## 3. \u67e5\u770b\u53d1\u5e03\u5305<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python timelock.py inspect timelock_article_2026.json<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u786e\u8ba4 `contains p\/q\/raw key` \u663e\u793a\u4e3a `False`\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## 4. \u89e3\u5bc6<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6c42\u89e3\u8005\u53ea\u9700\u8981\u516c\u5f00\u5305\u548c\u8fd9\u4e2a\u811a\u672c\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python timelock.py solve timelock_article_2026.json &#8211;output article_decrypted.txt<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u957f\u65f6\u95f4\u6c42\u89e3\u5efa\u8bae\u52a0 checkpoint\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python timelock.py solve timelock_article_2026.json &#8211;output article_decrypted.txt &#8211;checkpoint progress.json<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e2d\u65ad\u540e\u7ee7\u7eed\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python timelock.py solve timelock_article_2026.json &#8211;output article_decrypted.txt &#8211;resume progress.json &#8211;checkpoint progress.json<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u672a\u6765\u4f60\u516c\u5f00\u4e86 reveal \u6587\u4ef6\uff0c\u5219\u4e0d\u9700\u8981\u6c42\u89e3\u65f6\u95f4\u9501\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`powershell<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python timelock.py reveal timelock_article_2026.json reveal_key_private.json &#8211;output article_decrypted.txt<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## \u53d1\u5e03\u5efa\u8bae<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; \u540c\u65f6\u53d1\u5e03 `timelock_article_2026.json`\u3001`timelock.py`\u3001`requirements.txt` \u548c\u8fd9\u4efd\u8bf4\u660e\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; \u5982\u679c\u4f60\u751f\u6210\u4e86 `reveal_key_private.json`\uff0c\u4e0d\u8981\u548c\u516c\u5f00\u5305\u4e00\u8d77\u53d1\u5e03\uff1b\u5b83\u9002\u5408\u672a\u6765\u5b9a\u65f6\u670d\u52a1\u5668\u5230\u70b9\u516c\u5f00\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; \u5728\u6587\u7ae0\u53d1\u5e03\u8bf4\u660e\u4e2d\u5199\u660e\u76ee\u6807\u662f\u201c\u7ea6 10 \u5e74\u987a\u5e8f\u8ba1\u7b97\u91cf\u201d\uff0c\u4e0d\u662f\u7cbe\u786e\u65e5\u671f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; \u4e0d\u8981\u4fdd\u5b58\u6216\u4e0a\u4f20\u660e\u6587\u6587\u7ae0\u3001\u539f\u59cb AES \u5bc6\u94a5\u3001`p`\u3001`q` \u6216\u4efb\u4f55\u4e34\u65f6\u8c03\u8bd5\u6587\u4ef6\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; \u5148\u7528\u5c0f `T` \u505a\u4e00\u6b21\u7aef\u5230\u7aef\u6f14\u7ec3\uff0c\u786e\u8ba4\u6d41\u7a0b\u80fd\u89e3\u5bc6\uff0c\u518d\u751f\u6210\u6b63\u5f0f\u5305\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{ &nbsp; &#8220;checks&#8221;: { &nbsp; &nbsp; &#8220;c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-2135","post","type-post","status-publish","format-standard","hentry","category-life"],"_links":{"self":[{"href":"https:\/\/www.openlife.fun\/index.php?rest_route=\/wp\/v2\/posts\/2135","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.openlife.fun\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.openlife.fun\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.openlife.fun\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.openlife.fun\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2135"}],"version-history":[{"count":1,"href":"https:\/\/www.openlife.fun\/index.php?rest_route=\/wp\/v2\/posts\/2135\/revisions"}],"predecessor-version":[{"id":2136,"href":"https:\/\/www.openlife.fun\/index.php?rest_route=\/wp\/v2\/posts\/2135\/revisions\/2136"}],"wp:attachment":[{"href":"https:\/\/www.openlife.fun\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2135"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.openlife.fun\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2135"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.openlife.fun\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2135"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}