diff --git a/apps/docs/src/components/sample-data.ts b/apps/docs/src/components/sample-data.ts new file mode 100644 index 0000000..7c52363 --- /dev/null +++ b/apps/docs/src/components/sample-data.ts @@ -0,0 +1,1358 @@ +export const sampleCredentialSimple = { + version: "v0", + witness: { + type: "simple", + issuer: { + _type: "PublicKey", + value: "B62qqMxueXzenrchT5CKC5eCSmfcbHic9wJd9GEdHVcd9uCWrjPJjHS", + }, + issuerSignature: { + _type: "Signature", + value: { + r: "27355434072539307953235904941558417174103383443074165997458891331674091021280", + s: "22156398191479529717864137276005168653180340733374387165875910835098679659803", + }, + }, + }, + credential: { + owner: { + _type: "PublicKey", + value: "B62qqCMx9YvvjhMFVcRXBqHtAbjWWUhyA9HmgpYCehLHTGKgXsxiZpz", + }, + data: { + age: { + _type: "Field", + value: "25", + }, + }, + }, +}; + +export const sampleCredentialUnsigned = { + version: "v0", + witness: { type: "unsigned" }, + credential: { + owner: { + _type: "PublicKey", + value: "B62qiVGZQdBJJrxnzhvqp7LKe6jDiFcpU3cF5xHoZof5Pz9qiL85KLx", + }, + data: { + age: { _type: "Field", value: "42" }, + name: { + _type: "Bytes", + value: + "416c696365000000000000000000000000000000000000000000000000000000", + }, + }, + }, +}; + +export const sampleCredentialSimple2 = { + version: "v0", + witness: { + type: "simple", + issuer: { + _type: "PublicKey", + value: "B62qipmSo9Bju1XPtHfH8ukLWSMgur6e2xiUcfzbqwKEMdzSfQNbfbS", + }, + issuerSignature: { + _type: "Signature", + value: { + r: "15369596967930537948249866433896467790855310091967164859503093172192059176638", + s: "18498891580394813079080734274552796309574738769075217343428610783674309728163", + }, + }, + }, + credential: { + owner: { + _type: "PublicKey", + value: "B62qrVPwPbeogxQKzPcV5dTSTmNo39g1T2hAM19cJ5Dtwk1p4STmKAE", + }, + data: { + age: { _type: "Field", value: "18" }, + name: { + _type: "Bytes", + value: + "416c696365000000000000000000000000000000000000000000000000000000", + }, + }, + }, +}; + +export const sampleCredentialSimple2WithMetadata = { + version: "v0", + witness: { + type: "simple", + issuer: { + _type: "PublicKey", + value: "B62qipmSo9Bju1XPtHfH8ukLWSMgur6e2xiUcfzbqwKEMdzSfQNbfbS", + }, + issuerSignature: { + _type: "Signature", + value: { + r: "15369596967930537948249866433896467790855310091967164859503093172192059176638", + s: "18498891580394813079080734274552796309574738769075217343428610783674309728163", + }, + }, + }, + credential: { + owner: { + _type: "PublicKey", + value: "B62qrVPwPbeogxQKzPcV5dTSTmNo39g1T2hAM19cJ5Dtwk1p4STmKAE", + }, + data: { + age: { _type: "Field", value: "18" }, + name: { + _type: "Bytes", + value: + "416c696365000000000000000000000000000000000000000000000000000000", + }, + }, + }, + metadata: { + description: "Credential storing age and name", + }, +}; + +export const sampleCredentialSimple3 = { + version: "v0", + witness: { + type: "simple", + issuer: { + _type: "PublicKey", + value: "B62qrizXhsswtreoKWPNJMj7sGDiHTJgDEuTTM3Bmgetb57r1zhAcfJ", + }, + issuerSignature: { + _type: "Signature", + value: { + r: "2375499275092969274281993786192209114937573386384308353982489033458104679563", + s: "15269406577464524067213377409024505430282582322616178910470378547952824825132", + }, + }, + }, + credential: { + owner: { + _type: "PublicKey", + value: "B62qrVPwPbeogxQKzPcV5dTSTmNo39g1T2hAM19cJ5Dtwk1p4STmKAE", + }, + data: { + age: { _type: "Field", value: "20" }, + name: { + _type: "Bytes", + value: + "426f620000000000000000000000000000000000000000000000000000000000", + }, + }, + }, +}; + +export const sampleCredentialSimple3WithMetadata = { + version: "v0", + witness: { + type: "simple", + issuer: { + _type: "PublicKey", + value: "B62qrizXhsswtreoKWPNJMj7sGDiHTJgDEuTTM3Bmgetb57r1zhAcfJ", + }, + issuerSignature: { + _type: "Signature", + value: { + r: "2375499275092969274281993786192209114937573386384308353982489033458104679563", + s: "15269406577464524067213377409024505430282582322616178910470378547952824825132", + }, + }, + }, + credential: { + owner: { + _type: "PublicKey", + value: "B62qrVPwPbeogxQKzPcV5dTSTmNo39g1T2hAM19cJ5Dtwk1p4STmKAE", + }, + data: { + age: { _type: "Field", value: "20" }, + name: { + _type: "Bytes", + value: + "426f620000000000000000000000000000000000000000000000000000000000", + }, + }, + }, + metadata: { + description: "Credential storing age and name", + }, +}; + +export const sampleCredentialRecursive = { + version: "v0", + witness: { + type: "recursive", + vk: { + data: "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", + hash: { + _type: "Field", + value: + "10004415226961678011613781895787507059143191442658557645176003500242334644061", + }, + }, + proof: { + _type: "Proof", + value: { + publicInput: [ + "0", + "26227234720204021054517909417970907532340033574635469836085766982785994507247", + "0", + "18", + "65", + "108", + "105", + "99", + "101", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + ], + publicOutput: [ + "26227234720204021054517909417970907532340033574635469836085766982785994507247", + "0", + "18", + "65", + "108", + "105", + "99", + "101", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + ], + maxProofsVerified: 0, + proof: + "KChzdGF0ZW1lbnQoKHByb29mX3N0YXRlKChkZWZlcnJlZF92YWx1ZXMoKHBsb25rKChhbHBoYSgoaW5uZXIoZWE3ZGE0MDE2YTM2Y2EzNSA1NmE4OGFiMzllMWJkOTJmKSkpKShiZXRhKDYwZDBiMzhmZmU5MWIyYmIgZWFmOThlZDI5YWNkOWM2NykpKGdhbW1hKDI2YWE5ODU3ODViMDUzZGIgMTlkZjQ1NDQ2ZWI4MWJmZCkpKHpldGEoKGlubmVyKDJlMWE2NWZkZDJkODY5YzIgMmRmYzllMDM2MTc1NDAxNikpKSkoam9pbnRfY29tYmluZXIoKSkoZmVhdHVyZV9mbGFncygocmFuZ2VfY2hlY2swIGZhbHNlKShyYW5nZV9jaGVjazEgZmFsc2UpKGZvcmVpZ25fZmllbGRfYWRkIGZhbHNlKShmb3JlaWduX2ZpZWxkX211bCBmYWxzZSkoeG9yIGZhbHNlKShyb3QgZmFsc2UpKGxvb2t1cCBmYWxzZSkocnVudGltZV90YWJsZXMgZmFsc2UpKSkpKShidWxsZXRwcm9vZl9jaGFsbGVuZ2VzKCgocHJlY2hhbGxlbmdlKChpbm5lcig1YjY1ZGRkMDA1ZmY2OThjIGQ5ZDkxMWZhYjUzZGYyMGYpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig5YjBkN2UzNmJlZmY1NmUzIDQ5NjdmYjNjYjEzZjRiMjEpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigyZjdmZjA0NTA1OTQzODhiIDg4NTIwZGFlZDRkNTQ1YjcpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcihiNGZmNTI0YTFkOWY1OTc3IGQ3NWU3ZWZmOWE1ZTg5OWMpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigwYzMzY2NkYmZiM2UwYmI4IGFmNDllMDBkMjVjNmE2MDYpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig5MDFiYjU1ZTdhYzZmNDcwIGY4NTg1YWViZDkzM2U3ZGUpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigxZjI1N2YwZDA4ZjY0YzhiIDRmNDY2NGU3OWFlNDkxN2EpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig4Y2U3YWY2YTNmMjExN2ZhIGY1MGNiN2RjM2ExZmE2YTUpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigyNWE4MmM0NDNjMTBlMzA0IDMyNWY4NWI1YzUyYjJlMmEpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigzMjM0OTQ3NmJlMmFjNzQ2IDI0MDhlZWM2N2VjYTBmMTMpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcihjYzgwNjFiNWQ2ZmM0YzY0IDg4ODc5YmQwZjI5M2UyZTYpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig0YTliZDBhNjA3N2NlZmZiIDY2MjIxYjBkZjg0ZWFiMWMpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigxNzgzNWM3NDhjMjY1YjI2IGQ4ZWVhNmVkM2NmMmQ2M2EpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig4ZDdkYzM5Yjc2YzBlMGE5IDhjZmU3Y2ZjMDljOWMyZjQpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcihiMWNiYTNkOTY1ZjE3ZDliIGQwOGM4N2Q4MzU4OTAwYjMpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig3OTc3YjU5ZjFlZmZjNzczIGI1YjZmNWYwZGRmMmRhODApKSkpKSkpKGJyYW5jaF9kYXRhKChwcm9vZnNfdmVyaWZpZWQgTjApKGRvbWFpbl9sb2cyIlxuIikpKSkpKHNwb25nZV9kaWdlc3RfYmVmb3JlX2V2YWx1YXRpb25zKDRhZjk3OTdlOGNmOThmNDMgMWY5ZDM5YzFkYjY2ZWUxMSAyODdiMTg4ZGExN2Q2Y2RlIDFhN2U4NmFmMzEyYjYxYWIpKShtZXNzYWdlc19mb3JfbmV4dF93cmFwX3Byb29mKChjaGFsbGVuZ2VfcG9seW5vbWlhbF9jb21taXRtZW50KDB4MDNEQzk4RUI3RUEwRDExRTA4QUI1MUQ2MEQ5NEFGRUIwRDg1NURCQ0FDRTlENTU4QzMzOTRGQTM1MjQzNUY0NSAweDEzREU5ODNEOTI1MkY4M0M1QzhGNTEwMDBFNEYxOUIyM0ZFQUZCMDg3MjdFRkNEOUZGQjA4Njc5MTlCRTVGNkUpKShvbGRfYnVsbGV0cHJvb2ZfY2hhbGxlbmdlcygpKSkpKSkobWVzc2FnZXNfZm9yX25leHRfc3RlcF9wcm9vZigoYXBwX3N0YXRlKCkpKGNoYWxsZW5nZV9wb2x5bm9taWFsX2NvbW1pdG1lbnRzKCkpKG9sZF9idWxsZXRwcm9vZl9jaGFsbGVuZ2VzKCkpKSkpKShwcmV2X2V2YWxzKChldmFscygocHVibGljX2lucHV0KDB4MzQyODAzRTRERTg0RkM2MjA5MUQ2NkNFODUwRDE3N0YxQzdCODUzMzRCNUEyNkNFNzY5NjU1QzA2RTMwMTI3NyAweDFFMjVDQkMxQThCMUNDODYzNTdFNDQ2RjI3REUxRTNEOEQ1OTk4RTY2NUU4MTQ0QjNFNERGRkEyMjgzRjVBRTIpKShldmFscygodygoKDB4MjI3NEMwNjVENDE4NkRBODQxRkMzRkUxMzNGMkYzQjg1RTM4M0M0MDJGQzFGRjlCQjY4MzVGRDcwRDVFNDg4NCkoMHgyODI3NUYwMDQ3MzdCNkU1N0U4NUMyMkI5MDJFNDA1OUZBQTYzNzNGQ0ExMEU1NUUyQkVENkVDNTM1RDY0RjAwKSkoKDB4MzEwRDNDRjY4NjQ3N0E5NjhFMjA2MjgzNDVGODdBRTA1QzhDQTEwRTU1MDFBNTcxNTEzNDU4NzFBNUZFQjU1MykoMHgyNjY4NUMzQ0I4RTY2RkYxMTNENEFCNjgyM0NBOEQ5NTcxRTI1N0M4OUE3RjM5MjI5QjRDRjRBOTlFMjlFMkREKSkoKDB4MDRENjhEQkY4MURDRTRCNDI3RTA5MEE1QzQ2Mzc3MTFBQUVGN0Q0RkM0NzFDNDI0RkE4RkY3RDRDOERBQjExNykoMHgzODc0MzIyREY5NEE0NDU1ODU1NTFGMEY1MUI2Q0I4NkU2MUExRTU2OEQ0RERGRTU3NEFGNTkwQzI3RjgzOEY1KSkoKDB4MEVDNkEwOTYwMkZCODAyNTA1QTI1QTAxMDA4RkMyNzlFNDE4QjMzQTUzNEVEOUNCQkVEODI5OUFFQTY1OEY3NSkoMHgwNTZERUIzQ0UxRTI0REIyRUE2MjMyODZFN0YxM0EyMkI0QTYxRDlGNEY1RDgxNTU0RkI4MkQ1QjczREQxNUIzKSkoKDB4MkM4NTQ5RUM2NzkwQUQzRjY3NTgzMjRDM0E3MzFENjk2NjEzQ0Y2MzU5NzQ4NzEyRjRBRDMxNUY5NkZBRjE3RikoMHgyMzk0NUJBRjU4OUVEMTE2N0FEMTQ0OTI2NjRFNUYzRTFBMTQyQjgyQTIyMjBCRkFFRjg2NTlFM0E4NTk1MjNFKSkoKDB4MTdDQkNFNkZFQ0E5RURGNENGRjZCOUUyQUY4OUExNEU0QzI2RUVBQjJGNTRGQ0QwNTM2MDk0RkY0MkRCQkZEMikoMHgzOTQ5RTkwRTVFNUZDMEM2RkUzNDA5RUMyNENBQzQ1RUYzOTQ1QUUxOERGRkMwMTZGQUQxQkRGQ0ZCQ0VEQ0Y1KSkoKDB4MUMwQzE2RkU1MkQ1Mjk5RTQzQTUzMzQwM0RDQjU2QjRDNzVGQTE1NjcxNDc1MTJBNEY2Q0FFRjY5RkEwRDI4MikoMHgxRkYyRThGOTJCNDY1M0FFNURDMzQ5REJFODVBODJCQjI2RTdERjBGNzdBRUYyREFGRUVDRDIwNjU0MEFBQ0ZDKSkoKDB4MDI2QTQ1RUFDRjE5MEI5RjBBM0FENjlDNDgzRkExRTJBNDY1QTBBRjM0MzYzODNBNDlFNDBGMUVDRUY1QjI0QSkoMHgzRDkwOTVGQ0VENDdBNTk5NDNFNjRBMjQyNkZGQzE1RkE5RDkxODcwM0U1RDA4QTJCNUQ5NzNGOEFCRTg0MDg1KSkoKDB4MjRDNTk2QzFBQUZBQTFGRDM2REEyMDAyQkM5NUY1QkZDMjcyNjA4MzA3OEFDOThGM0M4NzhEOEJBMzA1MUU0RSkoMHgxRThCNTY1MzhDQjRGNjI4NEI5NzQ2OENFQjdGNkFEQUQzNzBEQUVBRTRFRTM1OTJBOUY0NjQ2QjdDNTcwMEJCKSkoKDB4MDQwNTMzMzQyQ0ZFMzFFMjg3MjAwMUU4ODE1RUM2NURBMUE4Q0FFNjg5MDA2OEI0MDQyM0QwOTkxRjQyNjVDMSkoMHgyNzJBREU0QzUzMTc3QUNDRkVCQzg1QUQ1QTAzNTk0Qjk4QTUzMDJGMTE0Mzk5RDkwMThBRjAyMTAzNzE2NzVDKSkoKDB4MTUzRTZGQ0U1NTgwOUFEQUEyMkEzMDExRkMxRTYxMjk0MzU0RDI0QTYzOEYwNUU1NjQ0N0I2MDkxNThFMUExQikoMHgyNDkzQUY5Mzg4NTAxQzdCN0JFODAxMTA1QzBDODlEMUNEMkI2REFGQzBDRjIyOTZCRTJENUQ0MzkyNEM3NTVCKSkoKDB4MTI5MjEyMTdFQTQ1MDQ2ODFFMEVDMDIzMjJFQjNCNDg3NTYyMzRGMDI4MzAzMzUzOUFFMTJBNkVGQjQzMjA3NCkoMHgyMjczMTNBQTBCNzc0REM5RENDMUU1QkM2NUIwMUY1Rjk0QzJGQzY0RDY4MjI0RkQ5RTUyOTg1NzdCMzQxOEI1KSkoKDB4MkZBQTk3MjM2MENCNEI1Njk5M0FDODNEMEMwRDRCQzUzMDUyREMwNDkxOEVGMzBCMTMwQzcyOTlFMDcxMjA1QykoMHgwQzI3REQ0MEQ0Q0ZDQTk1OEU0ODQ0NEIzNjc1QTMxRkFFNTU3QTUzQTdFMDA2Qjg2RENFNzNDRDlFNzFCMzQ4KSkoKDB4M0JGNkY0QzVBNDkzM0E2MDg1MjFFQzQ4NjEyMkRDNDA4MEMzM0NEQzk5MDgwMDA2RUJBNjQ1ODk3Q0I4ODdCNikoMHgyNDVEMTMyOTZBQTMwQkY0QTAwNEVFQzUyMTExNjgyNDc1MTEwQUI2NDRGQUQzRjM0RjJGREM2RjA3MDZEQTIxKSkoKDB4M0NBMEQyN0FFNzJDN0FBNjdCMDVCMDBBQkJGRkJBQTg2ODgyRDU3MzY1QTUxQjJBQTZBQkY0RDFGODkyNjgwNSkoMHgyRjREODZGMkYwMTIzQTkzRjcyMDZCOTgwRDJERUVCRkFBQjcwQUU1MjExQTk1RjZDMTcwODU4REQ3Q0RFQzhDKSkpKShjb2VmZmljaWVudHMoKCgweDA4RkVGRDY1OTI2QzgyQkExMUUxNTAyQzYxMTU3MERDNURDQjQwRDQ4OUY1RDVEODQ0NkYzN0I2MTJFMjNCQzMpKDB4MzM0NjkxM0FDQTgyRjFEQ0NFRDVEMDBEMDJBQTMyMzk0RUY4NTNCQjBCQ0ExN0JENzhEMjIwQzFERkZERDEwMykpKCgweDNCRkM2RTlCQTMwRTZEMzY0MDQ0NDFCQUMxMzEzNDlBQzU0Njc4RTZDQ0FBN0M3MDAwMjlEMDAyRjQ0NjA1OTUpKDB4MjU2Q0U3NDhBMzUwQkY5OTJEQTU0OTM1QzBFNUVGQjc5RDFBMTM0OTVGMzZCMkMyRTc3OUZBOTQwOTRBNzI3MikpKCgweDM3OTlCREU2N0NFQTVFOUFFMDdDMUY0QkFBRTdGMEU5NEUxNUZBNzhDMUVDN0IxRTQ0MjJCRUJERUQ3MDlBQjUpKDB4MUYwMDA3QzRBOTI5NTYwMzExNDdEODExRDZEQjQzNUQ2QjRGM0UxRUJBRjRCNzZGQjdEMDNCM0JGMTNFMTI3MikpKCgweDM1RTI1QzE3RkYxNEUzNkEwMkNGRUEyMjE3RTdCODU3NjMxRUEzN0M0REVDMDI5QzMwMzE0NjA5RTU1MEU4QTQpKDB4MDE4NkNFOTFBQjRENjI2NjBENzQzOEE4Njg4NzBBRTA3RUI3OTU5QTMxOTREQjM3NEIzQjVFOTBBN0RCRTg1QykpKCgweDE1OTg0NjQxNzgyODBGOUM3ODRFMzEyMTBBNUYwMDI0ODEyQTVBMzFDRjQ2OENFNDYyOTBFM0YzQUMyRDI3NzgpKDB4MTY1MzY2ODc3ODZBMEE0QTk3RjFDN0QzNkUzOThCNUE4RDE2RThFRkI5QTBFRDc0MDgyNTcwREMwRjBEM0QzOCkpKCgweDAzRjU5MDIwQzBGRjRFMTI3RjM0REI3ODBFREE4NEJCRDkzRkU1MjhBREM2Q0JBOUQzM0MwQzk2QzU4MzQ5MjEpKDB4MUQ0REY3Q0E2QTExNTdEQTNDQUNFMDJCQjE5RjA1RjkyNjc3Qzc1MTk5MUNBNUIwRjA2ODM5QUQzQUZBNTVGNSkpKCgweDMyRDI4Qzk5MjhGNkFCQzAzNDgzMjk1Q0JFQkYyRUM4QjgwMjVBRDA1NjJENzZGRjhDNDI2OTEwQTEyNTQwRTcpKDB4MTREMzAxQzhDRUI5QzYzOUVCNEExNDUxNDRDOTQ2RDE2NDQ0OTA5NzVDQUE0MTFGQUUyODUwMDZGOTJGRkJDNikpKCgweDFBQTUxNTc5RjlCNzlFREU3QjMyNERBMkE0QzZEOTAzMTUwODA4NzE2N0E2QkEyQUQ3QzAwNUE1MTQyRjI4MzgpKDB4MUYwQTA2RUYxQzg3QjE5MjY1REU0RjdCMkFFMjRCRjBDMTc4NjE0OEU3NkE2MjA3QkMyMjA4NDY5Nzc0RkZGNSkpKCgweDM2NUUxQTI4RTE1NEVDNTA3MzhEQjEyNDdENzdFOTYyQzg3N0I4MDlGQURFQ0VGRDk5QTM0Q0Q4NjQ5MTMyRkUpKDB4MDZFRTc3RkY4QzVBQ0MyNUMyMjM5RkUwNkRDRTAwMzE5MjBGOUQ4QTAxM0NGOTY2MUJFRUNFNUMzREY3N0ZEOSkpKCgweDAyRjZCRjBGMDBGMTZDNTNFRDVGQTVBOUNENDMxNzM2MjQxMjI5NTU2MUM1NTUxOEYxNUMwNkQxQTk1Q0I1MkEpKDB4M0JBOTQ3OUE1NzQzOTIyM0VBMDJGQzc2MEU2RUMwNDBFQ0RDMzkyNTc2MTJCOTU5MzAyNDI3NzVEQjg2MjkzOCkpKCgweDE0MkI4MEJCOUMxOEFGNTg5OEM3NkFGODFEMTM4MzIxNjJDMTBGM0I0MkFBRDY0QzdDMTI1REVBODE0M0I5M0UpKDB4MTlBMkU3RjlGMjc3MkIzMjAxQ0Q2MjgyRjczRDI2RkYyNDgxMzlGQjlCRjJENTk3MzA3NTNBN0U5OEZDODkzMykpKCgweDI2MjQ2QUE5NEIyOERGNDkzODMyMkREQzVFRTgzNzc2RkI2MkRDNDM5Rjk0MkNERDQwNkZGMkY0M0QwNDBCQ0EpKDB4MEQ5RjlBNTNCOUIwMzU3MjlDNUNGQUNBQURCRkJBOURCNEVFQkVBOTJCNzA4QzAzQzlGNzA3MTQzNDMwN0VDOCkpKCgweDJGRUY5OEYzMzFCNkFDNjQ4MTQwM0E3NzUwQUM4QkU1ODQwODRFNjY1Q0I5QkIyQzExMDlGMUNGNzM3NEY0MjQpKDB4M0VFRUQ5QzFGMDk5MkJDQzFDQTk4MDk1NTg0M0U4ODI2RkI5NDY1ODZEMEEzRjVDMUNGMzA3OUY5RjY3QkNGQSkpKCgweDFEQjgzNUUzOEI0NTQ4NjZBOTFCOEQzQkMyMjM2NENERURCOEVEMTc3QjI4Q0Q3RjcyMUNCRjRGMTYwQTI2M0EpKDB4M0E0RDc2MDZFN0NENThCNTkxQkE2ODQ2NDBDOTk3RDE2NDg5NzNGNzIwQjVGNzk5OEJENTZBNDg4NDI1Nzg5MykpKCgweDBFM0Q4Nzc1MzdFREQ0Nzk4QTUxMjEyMzM1NDU2OTc5RTQ2Q0IyQzk4MjA4MDU5NDAyMDYwNkU4MTk4QTk1RTEpKDB4MkYwOUFFRDFGNDcyMzc0RUNCNDY0MDg1MEEyMTU3QzU2MTg2NDk3RDU4NENCREQzODdCQzhDMERENjQ5MzIzNCkpKSkoeigoMHgzQURCN0U5MkUzODE0REFBMUJCOEIxMTk2MUI4Njg2OEU5Mzc1MzM0MzI0NzNDNTAxQkQ2MDJCRUNDODEyNjY0KSgweDAzMkY5NDIwMTVFMTI0QTJDRjVCRDNFMEIyMzI2QjhBOUI1MEE1NkNFQTM0OTgzMjc3NkRERUVCRURFMkM0Q0YpKSkocygoKDB4MEUwNDJCRjkyM0VCQ0JBQTJFMzhBOTM5MEI5N0IxMkQyOUJDRjlCRjMxNkU2N0M1OTJCMzQyMzM5NjkzRkNFNikoMHgxNUNDMjgwMDg1RENEQjU5NUE0Rjg1OERDMEFBQzZBNzI3MUU3RERGNkEwMEE4OTQ2RjM5NTQ0MEZGNDQ3NUVBKSkoKDB4M0FGQUM4OEEzRTIwNzk2MkIyQkJDQjQ4NEQwQ0RCOUVCOEE1OENCMDZEQ0Q0OTE2QTBFRTlERDMzRkJBQTNCNCkoMHgyRDI2QzA1OTM5RkEyMjcyNTkzMTE4NDAxNzhFRTEwQkIxODQ4MkE5QzYzMUE4OTE0QkQyMEFDNjc0NzBEMzdGKSkoKDB4MDMyRkNDMjg5QTQ5NDg5M0E4NkIwNTM2OTRCN0E3QjYzMkYwRjY4N0JDREZGREVBRkI4N0NEREIyREQ3RTY2MikoMHgxRERGNEQ5MzYzQTM2RjY0M0ZGRjFDMDhCRkNFRkQ1MUM3Q0NBRTY3ODc4RUQ1RUIxNDIxMUFDRkYxNDZGNDc1KSkoKDB4MzNCMTcxMjY1NDlEQjM4N0MzRTIxNTkwRkM5NDAyNDUzRDVCN0U4RkU0MjNDNjg0RTQ1MzA2MjlCQ0U3RkQ0MikoMHgyRkQxMDM5QUJEMDJDRUU4QTU3NjM4NkY4QTQ3NERDQTE4NjMyN0VDODAyNTQ2QkI2QzdCREU0MzUzQzI0M0FEKSkoKDB4MDlENjg1MTU0QTU5RTk0MThERUZENTc2NTExQ0M3NUY1QjVDMEY1Q0E5NEJEMDM2Q0FGM0VCQ0JBQjM0Q0FFQikoMHgwQTdGNTgxQzk3OTRDRUZCRUVDOTg1NzgyNTYzRkY4QjE2Q0Q4NTY3NjVBQjkxRUVCMTRFRTYzQ0Y2NDY2MEQ0KSkoKDB4MjRERjJDNzAwOThBNjZCOTc1QzIwQkI4NDRFRDE0MUYwNUYxMTRCQzQzOUYxNEM1OTVCOEM5RTQzQ0YwNDlFNCkoMHgyMTlCMTNFQkQ3RkY0NzJDNjc2NzMzNjM0MENEN0IzN0JGMDY0MEM2QTlCNTIxNjVFNEQ1ODVCMUVGNTQ4N0JBKSkpKShnZW5lcmljX3NlbGVjdG9yKCgweDE2OUQ1REY3QkZBODQ3QTNDNkE4OUYwREQxN0FFNDNDRUQyMTRGQTExQUMwMTUzNUI0OUM4M0MwRkIzMEMxQ0QpKDB4MEQ2QUJCMDUzNTJBNzMzRTAzMzFGMEI4QzUxRUY2NUFERjdGMjkyRUM3MjMwN0ZGMzc4MzM2Rjk3M0IxNjA3MikpKShwb3NlaWRvbl9zZWxlY3RvcigoMHgzQjQ2NkM0NUJENENDMzY5MkI0RTcwQTdGMTNBM0EwNzRCNURCNEQwNDZEQUM5QUU0QTA3NTlCNDU5RjdCRDhDKSgweDNBRjFDNjZBNzFGNUVCNkM2RTdCQjAyMjFBRkIxOTFDNzRCNTA4Nzk0MzQ3MjRCREJDRUVBOTIyOENCQkVEMjApKSkoY29tcGxldGVfYWRkX3NlbGVjdG9yKCgweDM2ODVDRjM0OUYxNUVBNDM4MzREMTNERUUxMDNCRkVBRjVEQkMyM0VCNjI1MDVENEE5Q0E1OUE4REU4M0Q1ODQpKDB4MUVCMTEyMUEyQjRCMDNDOTE2ODcxNTgzOThEMzNEQUE1Qjg0NzY4REJBRUM4NDhCNkExMjg0MTEwQjE2MjBDNykpKShtdWxfc2VsZWN0b3IoKDB4MjA2MEFFNThBODFBQzJDRDgxNjlCRDRFMjE1M0VEQ0Y1QzUyQUM1NDdBMTRENTg5NjIxQUE1QTUzM0RCNzM5OSkoMHgxMTc5NkU2QjgxNDM5Njc1QTgwQ0MzOUM0QTA0NDY4MDZBMzMzOUVDMzVCQTJFRjA2MjNCMTc4RTA2QkM3NjkyKSkpKGVtdWxfc2VsZWN0b3IoKDB4MzREQUM3MUU3MzAwMjRCMkIyNjFCRDY0NDZBMzMyQjdGN0VCMDk1REMxNzRDQTlBNkE3MjQ0NzJBNDE2NENGNykoMHgwREI2MkM3NjhFMTI1QzBENUQ0RTlCMjQyOTZBRDk2QzA4QTI1ODg3QkQ0OUUzNkM2NkVEODNFQUUxMjQ0M0M1KSkpKGVuZG9tdWxfc2NhbGFyX3NlbGVjdG9yKCgweDIyNEUyMDVEN0YyOUM3Q0Y3MjlCNUZEOTYyRjJDNzlBNUM1NTgzOEIzQjYwMURDQjFERTk4QUQ0NzI0NDMwREQpKDB4MkQxNTg0MERERkRFNjVDQ0VDRUFGOUQ4MzhGNDA3RTA4NDg3MTZFMkFFQkFERUJDODhCQzZCQTQ3NjNDMTgzOCkpKShyYW5nZV9jaGVjazBfc2VsZWN0b3IoKSkocmFuZ2VfY2hlY2sxX3NlbGVjdG9yKCkpKGZvcmVpZ25fZmllbGRfYWRkX3NlbGVjdG9yKCkpKGZvcmVpZ25fZmllbGRfbXVsX3NlbGVjdG9yKCkpKHhvcl9zZWxlY3RvcigpKShyb3Rfc2VsZWN0b3IoKSkobG9va3VwX2FnZ3JlZ2F0aW9uKCkpKGxvb2t1cF90YWJsZSgpKShsb29rdXBfc29ydGVkKCgpKCkoKSgpKCkpKShydW50aW1lX2xvb2t1cF90YWJsZSgpKShydW50aW1lX2xvb2t1cF90YWJsZV9zZWxlY3RvcigpKSh4b3JfbG9va3VwX3NlbGVjdG9yKCkpKGxvb2t1cF9nYXRlX2xvb2t1cF9zZWxlY3RvcigpKShyYW5nZV9jaGVja19sb29rdXBfc2VsZWN0b3IoKSkoZm9yZWlnbl9maWVsZF9tdWxfbG9va3VwX3NlbGVjdG9yKCkpKSkpKShmdF9ldmFsMSAweDA3RDE1MTY2RTUyMDdGRjZBRjhBRjkyQjdFRTdBQUIyNDQyN0UxNUIzNzhCQzgxMzIyMTBFNTYyOUY1ODdENzIpKSkocHJvb2YoKGNvbW1pdG1lbnRzKCh3X2NvbW0oKDB4MEEwOTUzQkZCMDZDMkUxMjJEMzU0NUUzRTY1RkJEQjQ1MzAxNjE5ODRDRDJBRkNBMzQxNUUwOTZDMUIzNUNBOCAweDFEQzc3RDlCQjkxMkM4NDhGNUM5OTMxOUVFNTVCRjA2RkY1RTRDMzAwMUM2NzIxNjQ1Q0MxNTlGQkI0NEZFMUIpKDB4MDA2OEUyOEUzQjhCNDk4NjBBNjBFNkEzMDc1NDY3MEQ3MzM0MUNGNEI5M0VFMUNDMjM1MEVENzI3NTVBOTc4RiAweDJGNjE4RUEyRjZGQTA2QkVGMjZCQzFBNDk3QkZGRTMwQTcyMjJBRDg5Njg1NEUxRjQ5MTIzRjQ1NjUxODQ2REMpKDB4MjU1Qjc0MThCMkMyNjUyOTEyNzdEQzRCODY2OEQ2NjU2ODA2OEY5MDExNUU3MTY5QjY1RTZENEVGMkFDMzkzQyAweDIxMjhFRjc2MDMwODQ3MTRBN0E5REU5MkNGNkM4NUZFQkQ3RkNFNzU1Q0MyRTc2ODA0MjBENkE4NjcyRkU5RjMpKDB4MzZGNEU2NjA3RjhENUYwQjYyQ0ZGQTM5RjJDOEIyOUQ1ODA2OTJFRjFGRDZDOUFCNjlDRTMzOTVERDhCRkY3MiAweDBGRjczNjNDN0YxRUJFOUIwQ0JDNTA5MTcxQzg1MzhDQ0YzRjlFNkUyRDA5QzhFQTZEMUQ5ODIxNDlDMzBBQzgpKDB4MTY4ODU5RThCNEEyNkM4RDBGNjBEMzBBREQ5OTk2REVFRjEzMkVDMkY0MUMzMkNFMEM0RUQwMkZBNTYxQTBCRCAweDIyRTk2RUM4RTRFRjZGMEUxQjUwODFFRTcwOTdDQTZCRkJEQzI5NDJERTg4REM3RkU1NEZERkU4QjA1RTBERkEpKDB4MkE4MDcyMDQyODM4RjRENDExMDk5RUI3MTBFNUY0Mjg0QkRBNzI2OEEyNTAyRkIzMTdFMkJDNTA0NThBMzRFOCAweDAwN0M5N0VDOUU4NERBN0Q5OEEzQzlBQzJDMTBDODcxOUE0OEE1ODc0MDM1QjdDRTRFREREQTc1MjYxRjJGOEEpKDB4MjFGNDJGRjQyOUM0N0VDNURDRTc4QjJGQkM5NUFFQThFN0I5RkYzQUUzNDMzNzVEQjNBODVCOTlDN0E0QzYyMiAweDM2NkREMzU2NEI5QUExMTdFOUI1RkRGMDg4RThGNkUwMDQ3RTI3OTlEMzZCNEY2RDg2NDNCNjU4NjAzQjAyQUYpKDB4MTMyRkFGRDE3MkRGQ0JCNkM1QzI4QjU4OTk3QUVDQjU1QzQwREQ4QTJBNUFFQ0RFNDcwODhCMzU2ODAwQzI0RiAweDIxMkVERDEyMUNDQkZGRDE2OERERUVERDgzRDZDRjc3RUIwQ0Y4NUVGNjI0RUMzODhBMDM1REZDM0I4ODM3RjgpKDB4M0VDMkExQzQyNDdFQzg0MUI3Q0E1NkZDMjMwNzkxRTUwMjUyMkM3OTAwMTU2MDcwQTg1MzZBQTI3NkM3MTBFMiAweDNDNjZCNENBQzdBNUQ0Mzg1OERGMTNCNDFCMTZERTA2OUQ1MUVFMjMwRDIzNDg3NkZFMjUzRjUxQjRFMUQ0RjgpKDB4MzVEMkQxNzk1RTRGNEExQkU5NTk0OUEwMTIzMkJFQjc2QzYzOUFBREYwQjlFNjQ3NjQwQzM2NjcxNDhGMDE4OCAweDIyNEY3N0YwNzdCNjgzMEZENTQwRDBBQTYyMTY3NERGMUY5RDI1NEQ0MUFCQjYwMDVCOTJDMTdEMDU4QUE2RjEpKDB4MTdBRTRENDAwMjc5QjI2MUREQjY2RUJGRDAyMzM3QUM4MjlBRjZCRUExMUEwQTgxQjNGMTdDMDkyNDJBMTNGMiAweDIzQ0Y5RkJFQjI4OEQzM0VEMDA3ODZCMkMwQkMxMjcxMzMxRjA3OUYzODBDMkJCRERBRDk0RTg0QzM4MzM1MzUpKDB4MzE5NzdEQUJBNzI0QThEMUVCM0E2QzdEQUQ4NUU3MzVENTc0MEZGNzJDOUEyQzM4MzU1RUIwRTEwODRENDkyNyAweDJEOEMzOUQzNjFDNUUxRTJGQjE5QzM4RUE2MzVCMThBRDJERjc0RkRDODU2RDc0OUM2MTkwNDMwRjUwNkE2ODQpKDB4MjYyMjk4OTg2QjhFOUU1NzVDQzM2Nzc5MTk3OTU0RjZCNzdGOEYzNjMyREQyRkE4RjUxMzQ4NTIyOEIwOTIzRSAweDM5RDBFOTNCNDZBMjg4NzkwNjA3NUFBMTdEMTIwMEY5QkRCQUQ3NDk4OEZDRTA4OUZCRTU4RTg5RjJBOTY1MzMpKDB4MkQyQUY2REM5QzYyMEFDMDAyM0Q0MzNCOTI4RDE1MTlGRDU2NzVCMjk5QUQ2NDFCQkVFOEE0NjkwMDk0N0Q1QSAweDAxQjRCODJFMTM5ODAwMEEyNTg1QUM3OUYwNTE0NDM1MTk3Q0ZDMzJDQTc3QzEyQzFDQTYzREY2OEIzRTlFQTQpKDB4MzI2M0UxQ0MzOUE1Qjg2M0ZBMzY0RjMxNjFDMTc2RTExODM1NDE0QzIyOThBNTVBRkU5MUNDQjUxQjlEQUJDNCAweDI1MTEyNjEyMURGQUE1OTNFRTBCRjBCOEVERDFGNjUxMjJDNTExMzYxOTAwQUZENDY1OTM3NkM3MzZCRUQ5MjYpKSkoel9jb21tKDB4MDZGQ0MwM0YyQzg4Q0FBOUMyMDNFMkU5MjBGODJFRTUzM0ZFQzJDRTlFRjk2N0NCNzY3RDAxNkIwMDYxN0VCOSAweDAzNzgzNDczQUYwRDI3OEI2RDUwQ0I5QTgwMzdDOERCMTQ3M0UwNjk5QTJBMTAyQzc1MzdGMkRCMjc4RkQzMTkpKSh0X2NvbW0oKDB4MjQ4ODYxQjNFRDRBMzVEN0RBMzAzRTVDMkU1RkQ0NDUyRDRBMzBGRDJDREZERjQwMDgzQUE4NjUyRUUyRjI4NSAweDMwQjZEODg0RjAwMDE0RTNFODE1MUU2MzlGMkQ2MEFEMEY3Qzk4RjhGODJCNENEMTMzMjEwQUMwNDIyODFFRjUpKDB4MDZEOEZEOEE5QURCRDk2M0YxNzc3ODczMDUzRjNENDMzNzU0NkIwRjQ2QzBEOUJDMjgyNzlERDQ2RjJGMDZFNyAweDNDQkM0NTc5N0U1NDY2MEQ0QkJEQ0VCOTFDMDhBNTQ2M0UxMDU0NTA4ODdFOThDODVBMUJBOEZFQzE2QjZGNUYpKDB4MDI1NDdDNzBDRkQ0QTM4MThCQzFGMTc1NDc0QkIwODIyQUYzQUNGQjdDNzg4OUQ1OTYwRTdGRUVEREQxMDQ0QyAweDM3NEM5RjFCOUNCODAyRENGMzg5RjVENjhFQkNDRjgzOENENjdERkMzNjdBMjE2MUE3M0Y4RDFBODNCRDdCNTIpKDB4MkY0NjI2QkVGRTQ0MERCRUU5QUUzRjcwQjA4RjNENTQyNDg5RDI5NDk5QjJCNEJBNzVBNkY1RTY2NUZBM0RBMyAweDBCMzM1QTdERkU1MkVEODAzM0MzRDBCQkUyRDBGMDhFODI1MjM2N0EyNzNBRTM5N0Q2RDBGQjlGQkQwMjVDMTMpKDB4MUQ1NTdCNDRCNUZBNjg1MUI0NDk2MkU0QzlEQjhEMTJBMzREMDI5MENEQkFEMUM1Qzc1RkRCMjhGMEY5OUE1OSAweDFFNzBBMDBBQkE2RkZBRUEzMkZCNTRFREZFRjU5RjdBQTA1QjQ4QUMzNjc0REM1QzlBMjcyNkY2QzVCRDdCRDMpKDB4MDAwNkQ1NEExMDM4MEFGMkFFOUNERTk2M0QwQUVCRjMzMkYzOEMxMTk3NDdCNDBGMDY5QzE5MkUzQzYyNTc0QSAweDM0MDM1MUQ0NjdEQTFENkQ0NjhFQTZCMzVFRTQwQThBNzNGNkUyQjg5ODQ3MTEwRUNERjM3MEFDOUJCQUIyODgpKDB4MDIwMTYyRTY4Mzc1MzlBMTg2ODIwODZFNzcxODlBMTMxNEREQUU4RkFGQUZFRDg2MTJBOEIyNjUyRTcxNzk4QSAweDE4Q0ExMEQ0NTQ4MDY2MTIwM0Q3NERCNzk5RjFBMjRGOTQzRURCMEMzMTlFQzExRjA3N0JERDU4M0UzNjVDMTEpKSkpKShldmFsdWF0aW9ucygodygoMHgyMUU2Nzg2QTk4QjJDNTZGMEMwMzY3ODc2MTJGQkI5QkFGNDAxOTZFMUZCNTA5MTlEQ0FCQzhEREMyOEY2MTYxIDB4MEQ1ODA3REVCQ0I5NzM0RjQ3NkY2REQ2MkNERjhFMDFBRTcwRDY0MjYzQ0ZFMTdEQkU0RkQ2RkNGOUUwMkE2NikoMHgwNzFEMTNGMzRDODI5QTI2QUMxRTFFQjJGRTFDN0Q1NzRBMjczMjhCREJGRUQ3ODhEMjY3NTg3MkY1RDc5NjMwIDB4M0E1RDQxMkZENERGMDExNjg3RkJFRDg2NzQzQTI0NTVEMTk3NDA2QTU1RjIzQzI2Q0VDOTBDNjI0MDhDODkzQikoMHgwRTg5RUJGNUQ4QTUwNTg2OUZGREU3MEQwNTZGMjg1Qjk5NUFBNENBNDQzRkEyREU2OTdDMzFGNkFFQTI4NjY4IDB4MjA0MkU5ODAzQjhBOTY2QUYzM0EwMjc0ODZDRkI2MEJEOTVCOEZCMEVBMUVDNERBMjY1ODFFMzIwMTg0OUZGOSkoMHgzNTg4QzJGMERBNjM1ODg2OTIyQUI1RTQ4MjUyQjk5NDRFNUExNTMxMUM0QjI0QzI3QjdEMTI4MkI1MDhCRUVFIDB4MzI1OTJBMjlDMzYxMjdGMDIxRUUyQThFOTMyQjE2NjRDNTkwQzA3MDE0QjQ0MkU0QkQzNzQ2MTVCRjAwQ0VDOCkoMHgyMzdGMjBCRDRBNDcyRkQzRTg1ODQyQjQ0OTc2QTZGMUIyQTAyN0IyRDlGN0YzRDZDNTkwMjUxNzUxQTA1Q0IxIDB4MkIxMjUxREI5NUE4QUI3ODhCNEFFNTNCMTA2MDIzNjlDNjY0QUY0NDg5MDAwMEQxM0IyNURBRUQwNENDRjQxNykoMHgxQTVDNEU0NThFRTdEM0ZFQjFCOUI1RkI1OUQzQzEzMTE4REY1MUU3QjJGMTZBNjk0RDU1NTQwQzk2MjQyNDMwIDB4MjY2OEUzMTVFOTZFOTg2QTQ2RjI2OUU2RTFCQ0VBQjExMENBRDY3RDE1OEQxRTQ1MzhFMDNFMEZDRDJBMDIxNCkoMHgzOTgwQjlEMDlGRTJGMEU1MEQ4OTcxNTkwRjY5RkI4MDg4Q0FBQTBGQUNDNUZBQjIyOTkzQkY2N0ZBMUEwNDQ5IDB4MzlCMzhFQTYyQjM2QTkyNUFCRkI4QUU2Nzk1Q0RFMDQ5NzBCM0Q4MUIzRTE5MjUzREI3RkUyM0M2NDExNjZFNCkoMHgxMkY0OTU2RTgwMEM0NjhBQUE1MTMwNkQyQjZGMUMxMzdBODIwOTAyMDM2ODZDMTdDQTNFREY0QkJEQTNFNTdCIDB4MkU2N0RDOUY1REY4MDRGNDA1MkMwMjg3NDZBQUIxNDQ3NkI5ODg4RTA3NzhEMkIxNkIxNTAyQjg4ODg1NTcwRikoMHgyRjREQkREQ0UyQzJCREMxN0FGMDFBRDcyQzQxMUY1NjBCRDMyNDU1OTAyRjFDRjcwNzRGRkU0MjlCNjBCN0E4IDB4MTFGQjIxRDY3ODM1NzY3Qjc5N0YwOTRBOEU4MTk5QjBEMTJCQTI1NkE0QzBFNDMxM0QxNDZGMURFRDI0NjUyMCkoMHgxODA2RUJGQTg4ODFFNUY0NjRDMUQ4OTBFQ0E3MjRGREIzQTU3QzJBODRENjlBODVCMjM1RTE1QUExQzNGMDZEIDB4MEQ3MUZFQ0E2NEVFMjQwNTFBMDhGNDU0OUJBNzgzRjJFMTdCNUYwMTQ1RTg1NEQwQ0Y0MjE2NDhFN0NGNUZGNSkoMHgyNkFDRjg3NUFGREFDQ0Q1NEMzRTcwNTY2OTNFQTIxMkQ5M0M2RjYyQjFDQzMxNEUzOEQ5MjNBNEY0RUE4OTM4IDB4M0VEQTE3MTRFNjBGRkQ5NTUwMUJENTQyMzgzMjc5RkNENTg2OTI3OTkwQkFFRTQ1MEEyNDc1NzE1QkU1MzdDNSkoMHgyMDQ1NEI4NTA3RjNBODhEMzY1RjJBMzRBMzg0QTIyNzlEMUNDOUE5ODZGQTA5QzExOEUxNzlFMzUyOUVGMkIxIDB4MDRFNkU4NzlGMzg5MjEwQkRFNDVENkU0Mzc0NDhGMTlEMUY3QjlFMUUyQzA4OTUxQTlBN0MzOTU2NDdCNDkwMykoMHgzQzM2NjJCMTI4NUJCREQ4NzU0RTM4NDQ0NzE4MEQ2QzU5MjMyOTRFRjhBOEQ1ODEzNTM5ODkxOTkzMkEzMTVCIDB4MjE2QUQ5NTE3QzA3QkYwNUM5NDQzREFBNzkwMUUyNDIxOTlFQzZERkIyODAwQTc5RjNFNDI1NDA5QTlCOTNFRCkoMHgzNjk4RUEzMEY1N0U3MjU2RDg1QTdEQkQyNEVERjFFNkU0NkJDM0Y0MjE2ODMxNUU3MzQxQzQ3QzMzNEQzQ0Y0IDB4MjA3RTlBM0RFN0YzQ0U1MkZGODM2OTdCOTVCNTc0MEFBMTI1QzdFNTQ3QkYwNDNBRTExNDEwMDgzRTlCRjJDNSkoMHgxMjlFNEQ5Q0E1NjMyMUI2MkE2RkFGNDZFRDFERTRBMEFCOUE0RTFDNEJFNTc4RDgxN0FDRDA4MzVBOEYxNUU4IDB4MzJFREU2MjhBNzA1QUMwN0ZFOEExMUQwRThDQkYxMEI5RTU0RDM1NDFGQjc3NUQ0RTk3REQ4RjFBNTQ2MUYxRCkpKShjb2VmZmljaWVudHMoKDB4MjdCMzg5NDRGQTlDOTc2MUY4MzY0NTY3RjQ4QzA2NEI3QzI3RTc1NkVEM0I0QUYzM0QwREVEQjM0NjkyNUZCNCAweDNDQzM1MkYyRThCN0Q4OUJFRjcxQ0E5OTU4RDVDODAxMkYxMEE5ODY2QzY2MEM2QjcxNDRGQzk4RUFDNEVGMjkpKDB4MzhBRTgxMEM4QjYyRjkyMjI0NDE5NzAyRjU4MTEwNTJENDA0MzQ1NERFOTE0QjVDQzc1MDI4NDU1MkM1QURGNCAweDEzODY2QjIwMUEyNkNDRDU1NzhGOEFDOTM5MzBCMURCMDhBM0IzMEY3OUNCRDY1RjREQkVDMjYwOEI1MDUzRUIpKDB4Mjg1MUY5RDRBQTBERTM3QkQxMjExOTk4QkRDMzM3QkYyQUMyMzhGQjdDNjZGOEY0RDJGMjQyM0YyREM1NjVFOSAweDEyNUFBMUU0RkI4OTUyRTZBMUE3M0ZDNUY0OUY4NUIwQzAxNjBGNUQ4MERBRUQxMjJDMjFFQzBBQjdEMTlEMDgpKDB4MTdFMzA2NjUzNkVCQTMxQjg1QThDRUNFODVENkQxMjY5MjUyMDU0MTc5RTU4NkY0MjdENjJEQjczRUU3OTk2RiAweDM5RTQwNTdGNkE4OTk0NjJGNkFCODUzQUZENzdDOUIzMTY2RjRCOTg3NzZCNTQ4RkFCQjNFN0EzMzU3OUUwMTkpKDB4MEZGRDIxMkQ2Q0IzNUFEOTA1MUY0QkNBMDlEQjRGM0Y4NTNCOTVEQjQ1MEI4MjI2M0E2NDU3MkQ5NTA3QUQ4NSAweDJBM0M1QjNFRDE4NUFFOUZFQkY3NENGNEI2MTczRjc3N0M4RjY5QUYyNDAyNjYyMDQ4NDY0RkJDMzlDNzZFNzYpKDB4MjgwNEUxNDkwMDkzNURGMjgyREY4QjQzQkY0N0U1OEM2NkJCQzBFRkZFQjIxMzREMDJBMUE4NDI5QzVDNkNDQyAweDE0QjQ0OEJCOEMyMUNDOTg3MEFGNjUzM0ZBRkNFMkM1QjgzQjNFQkYxRjExODM4N0YxNDE3ODREMTJEQTc1OTcpKDB4MzAxNjc1QTIwRUFCNkMwQkUyQjUwRUNEQTYwQjMyQTI5OEIwMEU4MDYxM0U1Mzg5NkMzNEExRTM0NTQ1QjgzMyAweDJGOTRCRUQxN0JCMzIwNUU5NDhGQzdFQTU3REFGQkE0NUVBMTBGNDEwMkM5MEYzNkVGQUQ2QUJGOTJBMTU0NjkpKDB4MEIwOTc3QTcwMThFRUJGODg1MDRDMTc3OTU5NzI2MUREMDI0MzA5RUMyMDYxNUIyQkU1MDE3NUZDM0FENThENyAweDNERTVEMkQ1RDc3Njg3MzMwOTNBRURGMzE0RkM3OTU1MjMzMTRGNEMxNEY2QTc4MzA3MUNCM0Y3REJBMkIxMDEpKDB4Mjg2MzA2RUEyQzgwNEJCMzcxNTJENERCQzVCRjA2MTREQ0FCMUM0OTA5OTA1RjAwNTY4OUE2RjdFNkMwRTlCQSAweDAwOTMxRTdEN0RDQ0Q4NDc3NzEwM0JCMjI5RDY4NzY1NUVENUZCRDRFQzYxQTlBOEUxNkUxMkZBMkEzOTBCRTYpKDB4MjA0RDZGMTFENzg4Mzk4MzQ0NDQxRDlGQUYyRDg0REI1NDVDMkE0MENDQTY3OUYxMUZFMTAxMjFFNzNBMjJFMCAweDEyNjQwRjg0ODEwNUFDNDRFMUY3RDE0N0RCMkY1NDUyMjY4RjQzNTk0RTFGNjlBNTE4QTE1NjZFNEQzNUEyNDMpKDB4M0U2QjYwQTIzNTNGQTJDNEFCQ0QzNDBCMDJCMjU5QjA0NjdCREU1OTQ5NTRFQTc2NTYzQ0FGODczMDdDMDMwRCAweDJGRTJFMERDQ0Y3QTRBQTk3MDA5Q0FGRkJCQzhGMTk5Qjc3MzUxRkI3MDdGN0U2MDZFREJENThFMTZEMUQ0MDEpKDB4MUM1RTExMUQxOTE2NzQ1NDAyRThCNzczQTE1MDJFODFCOUE3RUJCQUI3QTg1NTMzRUI2NTE5MTg3NUFBOTc5RSAweDM1NUQ5MUM2MTY2QTk4OTBBMUNFMEFBRDYxMjREOUQ0QzZDMDQ5RjIxQjhDQkVCRjA0RDJBNzQ2NzkxODlBMzQpKDB4MDM3QTFFRDNBMzBENjUxOTU2QUUxMTQwMDg0MzY2QzI4RUEzMkUwQTM0RTFFQTZCQzMyMUFGRDhDRDQyNEY4OCAweDI4NjNERUQzNThGQkI2OUQ1QTlBNEY0OTI3RDVFRDkwNEI5OTAyODJFNjBEMjFEQzI2QzQzQjUxQkVDNENGMzkpKDB4Mzk4OUU5RUU0NzFBREYxM0Y5MTg0RDZGNkI2OUQ5NjA0MDQ2QUFFOEUzNDQ4OTEzQkRBNDU0QjhBNjE4NTA4QyAweDA3NTY2MEQ5OEYyOTRFNkE1NkI0MzQ1MjAxRjk4MUIyQkUyNDg0OURDMzk2RjE4NzJBMDkwODZEMjJFQTVFNzkpKDB4MDNBMzgwNjJEOTU0QjhBMTk2RDRFRUI5RkJFRDQwQ0IxQzgxMDFBMzNBNzA5QjI1RUYyQUNGREZBMDFDMzJCRSAweDFGNkNGRDg2QjJGMzAyOTA5ODU2ODc4MDMxN0Q5MTQ1MTI4REVGQjI0NDc5RTZBNzlCRjQ5N0QxMEJBQzA3QzYpKSkoeigweDM5QjA5MUM3NzM5NDA5NUFFRjFGM0I5NzM4RDNERTMyM0Q0OEFCMDYwNjIxQTI2MTk3QTU1RDlEOUZGNzEzRkMgMHgxQ0U4RjQ3QjM1NkM5NUEzN0Y2QzNEQzMzQjQxMkQ5Mjc1NjQ1NzA5NzE1RkY4N0I2NDRERDQ4NTAyQkE0OEFDKSkocygoMHgwMjFCRTFBRkJEMTBFMEJDM0NFNDMxMDQ1NUY1NDk0ODI2QzU5MzlEMDU4N0ZCOEUxMTE0NzhCOTNBREQyMDgwIDB4MzMxRTlDQzc0NkQxM0YyMzk4QjVEMERDMTUzNTg0RDQ0NjA3Mzc5MDVGMkYwQjkzNEJDQzkxRkI2ODdFQzY2RCkoMHgzRDFGODhBRkRBNTRDREE3NThGMzk3RUFGMTg2M0I1RDkxOURGQ0E2NjgzQTI5N0FFNUMxOUZFM0ExNTg0REVFIDB4MkU5NTEwRDRERUNFMkU0RjIzMDFEMUIxNjJEMDRBNkZGNzU0OUZBOTc3NkZGN0MxRUM5N0FEOEJEQTU4ODM3OCkoMHgxODQ3RDk4MkEyNkUzMzk5RTJCRDNCOTZBOTgwRjc5ODFFODI4QzhGQjEzMkY3NTY0MTgyQTI1ODcwM0U1NTBDIDB4MjExQ0ExRjNGMTA2RkREREVFRTY4QUFGMTU1M0M2QTY4MzVFQjY5MENDNDc2NDYxOTc5NTU4N0M2NkE1MzY0NSkoMHgxNzc2RjFFQzJBM0UzQjRCOTM3NDA3MEYzRDY4NjM2OUVCQUFBMjM2RTY2QTVDMzI2ODQwMzBFQUZFQUE5MDhFIDB4MzA3MUFCRDREQzY1ODFCQ0MyODlCOEE4Qjg5OURGOTcwNTVBREYzNDJFMUU3NUREQTlCODBCNTBGMjc1MDdDNikoMHgyNEM1NUU3ODgwRDlCN0JCMjkzNkY4MkU4Q0UxNkJFMTVDRjc3Mzk3RjRBMDQxRjBCRkRDQjRFMTVGODg2NjdGIDB4MTA4QzQ0QkRBMDQxN0M0RUJCMkY1NkE0NjFBNDU0QTVFNTg5N0VFQTRDOUZFNTFEMDlFQUM1NkM0MDBENUE0MSkoMHgwRENERDMwMTYxMUE5NTVDMDUwMDI3MzI4NTc4RTY1MEZGREQ1QzM0QTUxNTEwNjg5QjgzOENDOUQ1NTNCMzcyIDB4MTBBREQxQ0Q1Mzg1MUM3Qzk0QjcwOURBMTA0N0ZFQzIyNTA0NEIxNTVBRkJBRTJCN0MxQjdCNEI0MEQzMDgyNSkpKShnZW5lcmljX3NlbGVjdG9yKDB4MDdGMzI2ODU0RUMwNkE2QzBEN0JDOUI3MTg1OEM5MzQyQjRERkM4QUI3OTBBNDQ5OTA2QkMzMUMwRkExN0VDMCAweDJBRkM1QzY4NjcyNTYxM0I5NEY4QUNFNjExOTA3QTlFMzYxMTUzMkMxRDgwNTg0MjhBRjk2NjU5RDBFOTZFREEpKShwb3NlaWRvbl9zZWxlY3RvcigweDNGODFFOUREQUM5Mjc3OEY4RkY4RUI0NTM5NkY5MTQ0MEMzQzYxQUI3RDg3NTM2NDg4NTM4NUU3NzcxNUNGQ0EgMHgwRkZBOEUwMDFCNUU4NDM3OTQzOTk5QzdEQ0EwRkE4QjFFMDkyMTQ2RENDQUMzNDQxQzVENTQ0QzdDQjBDNTY4KSkoY29tcGxldGVfYWRkX3NlbGVjdG9yKDB4MDIwRjVDOThBM0I0NEU3Q0U1QjU0NTdCMUFBNEMyMUJCRUNBQzY3MDg0MDJCMDFFMDYzRjMyNkQ5NUREQkI1NyAweDAwQTg0QUMyRTc0RUNBQkNBNjRBODY3MjRFQTBEREUzQjFDOTVEMDA4MzM0MDczN0QzNzk3RDczRDE3QTIxNzQpKShtdWxfc2VsZWN0b3IoMHgzMUU0REQ2RUNFM0E5NDRFRjVFQ0VEOTAxNEUyNjc4NUJGNzQwOTc2MTA4RjNFQUU0QTc1OTY1RjU2MkVBRTIyIDB4MTE4MTg4M0NBNjdCMENERDA1MUIxRTVEMDVDOUU2QTc5MjY0MDZCMUU5NkUwN0MwODlCODU3RDQ1NUYyRDFFNikpKGVtdWxfc2VsZWN0b3IoMHgxRjZFMDY2ODA2NzlGNzZBQjA1MEZGRkJCNDc0RjEwMTJCQjhBQzczMjFERUQ0M0I5MTgxNTE4OEI3MjY5RDE3IDB4Mjc2NUJGNzNFMjlEM0U1QkJCNDAzOTE3NjU5QTQzMTA1NTg3QjIyRTk1NENENEE4Qjk0NUQ2M0UwNjE1ODNFRikpKGVuZG9tdWxfc2NhbGFyX3NlbGVjdG9yKDB4MThBMkY4OEVFNzcwNTA5MzZDRjczRjNDN0Q4M0UyREEyMjBGMTk4N0ZGQzU3OTEyQUZDRUEyRDY5RTY1NEEzMiAweDI0MENGRDAzMERBOENBM0EwMTE4RTQwNkFCQzUyNzhBNEFBNEM4MUQ2M0ZCMzFCQjg3Rjg4MkZGMkEyRDVCMjkpKSkpKGZ0X2V2YWwxIDB4MTQzODVDNEI4QzQ5RjBCNTNFQTk1NTAzRENDRDk0RTUwRUQyOTIwMkREQTcxRUQxNDUyMjk0QTUyQTUxM0VGNCkoYnVsbGV0cHJvb2YoKGxyKCgoMHgwMERCNzhCODAxRjVGN0M5RkI1QjEzOTA5MjZEQzUxREVDQzcwMzIzNDM1QTUxQTVBMEQ2NUY2NDQzNDJENkI1IDB4MTg1OEY2RjlGNUNFNkZCMjJENUM1RDhCMkMxMkMxMTM0NkVBNTlGQTRDNTFFNDRGQ0QzNDU3QzAzRTNCNTM0MCkoMHgyQzkyRkM1QkNCNUE1N0Y5MTE5NDFFOEM4MzNENTUzQTk1REIyNDdCMkJDRTk5MzE4RUU1MzM3MTE5RDk5NTM4IDB4MkEwM0RCOUUwNTQxREZCOEJENDA4MzM5NEJEMzNCM0NGRTFENjY1QzAxNUI3OTlEMjhDNTgxRjBCMDE0MDFDMSkpKCgweDM5NEY5QkI2M0E0NEY4MTgzN0I1RDU4OUQzRjJCRkVCMDk5QTMxNzZEMTQ5QzU1QTBGOTM5Q0M5OUREMDlDM0IgMHgxOTdEMTMxNkYxMTVFN0ZGQzQwMEFCRTc0QTY0MTY3NERFMjc2MzU1RjMwQ0JDMTRDMzIwNjZBQ0VFMkM3MzYyKSgweDFDNzJDNzE1MThDQUU0MjU0QkREQTg1MzU1NDgyRkE3NUUzMEE3NTg2NjY1OTg4Q0NCOUEzOTk2RDQ0Mzk0NjAgMHgxQUE5RTY1QjdBMTlFNENCRUVEOTVDMDlFRDgxQjkwNzEyQjIyMzgxQUQ0QTRCQkJCMzM1MTlERjAzODYwQTdEKSkoKDB4MTdFRjZDRUE2NzYwMDYzOUUxM0ZDMEI1RTVCMkQ1RjY5QzBDOTE2RDg0RjJFQTU2MUUzRDQ5MzYxNTczNjdBNCAweDIwREQ0M0RENkUwQjVGMUU5MDIzMTdEMDg3REQzM0VFNjdDMDFDM0JDMUYzRUVENUNDMjA2OTk3RjZDQ0M0ODIpKDB4MTExQzZFMThDMkFDOTEyMEQ0NjBDNEZBODEyNEYzNkE4QUVERUJFNkJFQjA3QzQzRTc0MEY3QkRBMjQ4MUE1NCAweDBGQjQ4OUZBRTEyMDEwREQ4NDVGNThEOTY4MTQ1RjEzM0QxMzE5QjhDOTY0NThCNDE1NkU3QjM5NTAxODFCMkIpKSgoMHgwMTkxM0VDRkNGM0ZGQTlGN0EzOEMzNjBFNDFCM0VBNDU2REY2MjQ4NEI3ODMxQ0RERDFCMEQxMUIxMUM2NzRFIDB4MjVDNDNDQzAxODE3MTAzQjQ0ODYzRkYxNDlDNDk5RDE0NzY4RjNGQzZBOEUzOTUyOUM0NDVDM0RFRUY5ODEwQikoMHgwODFBNDI3QjIyMTlDQzRBMzI5NjA2QjZERkNFODNDMzdFREMxMTY3MUU0ODQ1RkE2MDI5REJEOEI4QTE1QTU1IDB4MjVFQUQwMjVBMUQ3OEZFQjNGREU1RTNBMTRGREI1NzNFRkZDMDVCRjIwNjZERkM1QTU1RDA4MDU4QUQ3MDI2MykpKCgweDM5MDhFOTdEMjExQzYxQkRBRkI0OUQ0N0ZEQzY0NTVCNEM4RDU5MDg3NjY2MDhCNzExMzY3NjhBOUZEMzJGMjIgMHgxN0FCQzcwRDM4RTVCOEQzQjZENDMxMUQ3NEUyM0NBMDI3RDI1MEFDRDE3MjU3Qjc0NDY0QkIzQTNFMEQ3NDk2KSgweDNGODA1MEQ5MDc4NzEzNzdDNUU2QjkyNkU1MDhDMzNDNTk5RjQ0MTdGOTU1RTUzMzE2N0JFQ0VFNTU5RERCNzYgMHgyMjIwREU0Qzc0RTAyRTUzQkIyMkJGNjlEOTdEOTM1QjlDREQ1QzExNjAxQTkwQTEyMUI0RTU5MDRBRkU0Mzk2KSkoKDB4MjhFRDJFODJGNjhDQjYzMDE2QkE5Q0RCMjNDOUVFNzMzQjgyMzc0ODBFMTk5OTU0NDBCNkU5QzBERTIxNDNCNiAweDJFMEU4OUQwQ0JGMERGMEIxN0VGRTA3NzM0MkJDMzYwOUIyNDlDRUVFMTc5Nzg4NTM0RUQ4NDE1RkM0NTY4MjUpKDB4Mzc3MkYyQjgwMDYwNDI4ODI0MkZGRTBCNTZFRTA5NDJDQTUyQUJGQTU2REQxNUQ3QkUyNjU5NENGRUJBMjFFNSAweDE0NEVBNDc2OUI2RjM2RkRFRDc3NjlBRkIyRDlDMkJCNkE3NDIwMzU1MkIwOUNCN0E3NTdFNzhFMDU5Rjk1N0QpKSgoMHgwMTJGQTVCRjAwNjMyNkFCNThBMkE3MjEyMjRBQjFBMDQzNDhCRDYwMTFEMUMxOTM5NjUyNTVBQzZDRjVBODRDIDB4M0FGODkyNEIyOTU3M0U1NjQzQTc2Qjc2NDA3MTIxNEJDQUJCMTg0Njk3QjBCNjYzREY0QjBGN0E0NDBBMUU3OCkoMHgzOTBFQTFCNzY4ODc2QTBGMjg3RjEwOEUzRUQyN0E4MzcxNjZCNDAwQ0FDOTZDRjY4MTYxMThDRkE4NDRGNjhEIDB4MjhFQTNFQjAwQzRDNjA2QjEzOTFEMTgwMzIyQ0JCMzVGQzA0Q0QzNUU5Mjc1OTVCOUY2QkQ4M0MxQzFGNThDQykpKCgweDFERDgzNUNGMzk2MzM5NjhDQkY5NURFMzMwMzVGQUE0QzgwRkMwMjE1QzBEQjkzODBFMTFFMjUxMzgxN0NGQzUgMHgyRDJFQjFFMEMzMDJDNzhERjZDQzNCRjMxQzdGNUI5MTEzQ0MwNjM4OTNFNjcyMTcyQ0QyODE5NkZDODFBOTk2KSgweDE3OTY2NDU3ODA0NTY3QzRERjdFMzMzMUNGQjhCNDFGMjg2NUE4OURCQzEzRTM2RUMzNDk2M0QxMzFCNDI5ODIgMHgzQzg5MjMwQjQ2RTVFMTg0RUE0REZGOTRDRUU4MkUxQkMyRjU5N0YxRjc5MTI1MkZCMTdFOUU1MkIwMTE5NTQzKSkoKDB4MTMzOUVFMzMwQjkxOEU5QzYwRjE0RjE1OTFDRUJDRUYwNzVCNzE5MjA1RTlFNURCQTlDMTM0QzIzMzFDM0NCOCAweDM3NUYwRjJFNkZDQUUzMzIzM0M5MjdDM0Q5RTc4OEIxMUREMTFFODk4RjNGNEFFMTcwRjcwNENDQzVFOTNFNDEpKDB4MkVDN0VGNEFEQTVBQkYwOUNFMEQ3OUY3Mzc2NTE1MDgwMUIzOEIyQUY2M0FDNTg1MzQyRkEzNzcxOUFCRUE2RiAweDNCRDBCNkYxRUIzQzVEOTRGQ0I3REQzRTMwQUIzRTk0RjkwODMyRDcxMTMzNEJFQjY1NDJFOTgwRThDNjU0NjgpKSgoMHgzRkIzNzEyNEMwRDEwN0QzODgwNEM1MTM2NTM3OTU4NTlGOEVENDM5ODk4RjUxN0VDQzIzMkY4MjQ2Mjk4NUMwIDB4MEYyMEZEREM5OTE0NUE3Q0RFREUyNTNEMjE0RTIyOEM0QUI4NUY5NDdERUFGNkM2MDEzRTlDQ0Y3MDgyNTc1NSkoMHgwQjI1QTc1NjNCMkQ2RkFCRUU3RkY1QUZGMDJDRkUwNzgwREU1QzA4NDNFMkE0MkREMUJEM0ZBRTUzMzlCNDA0IDB4MkIyQ0NERjRGRTJBNjdFNkJCNTMzMDk2Qzg5Q0YyQjBBNjBDMkQyQ0FGNjQwM0I1MkI0OTlGQ0RENzREOTIxQSkpKCgweDBDQkREQ0ZCNzE5NzIyNDM1RUUxMzA0MEM1RkNEMzVEREFBMDM4RTVDRjVCQjg4QjVFMkVBNjk2MDIxODk4NUEgMHgwRERFNDgyQ0RBMTU5OTgyODMxRDY0RDdENjIyQkI1MjRDQTE2NUJCQzg2OUFFRERBRkIyOEI4NkIzNTlBNDczKSgweDJCMThGNkVDRUM0NjEwQzE5OUYzRTIyOTkyRjI3QzExRDZBNjU4NEQ5MTM2QjQ5MkUxNEREQjI2MTVBOEJGNDggMHgwRjk1RDI3QzFERUNGQUQzNThBQzUwNUREOENBMjU0RUMzM0QwRjYxQzlDMDM4MjFBREMxMjU5QUNBRUYzRThEKSkoKDB4MjRBRjQzQzRBNTkxOTc2QTMxNjdGN0YwQTIzRTlDRDZCQzNCRDM2OTUxMUZDMDI3MTQyMDFGNEVFNjU0RTQwNyAweDJENDhFQkI4RTc5QkJFRDhGNzI1OEUzMjU3NDA5NEQ1QzlGRkU4NDU4MUFDNkU3OTlFQjk1MTVFMzI3MEFFOEQpKDB4MTA2RkFDNkJFM0UzMDdDNUFEMjdGNTE1NTVDQTI0NjQwNzU4M0RDQkEyMDBFRTA4NkRFOEJERkJCN0IzOEJDQiAweDE1NjlCMzZFQUFCNDhFMzY2OTJDRjk4MUY5MjJGNzNENkVERDlBQzUwQkIzNDIwQzdDREFDQ0U5QTIyMTU5Q0EpKSgoMHgzNDA5QURGQzcwNkYyMEQ3RDVBNTQ1RDY0NkExRjE4RjMwQjA5NjFGQzZGRDJBQ0QyMDZEMkQzODI4QkI4RTg3IDB4MUYyRDhFMjkwMDM1RTU5MDMxMjlEQTUwODMyQzAzRkVCMUVGMTRDQjhFNTQ5REYzNDY4QjQzRTBEQzk2MkQ1MikoMHgwQjYzNUFBRTA0QUQ2RkM5NTM0MTUxMTJDRkIzNDIwNzZBMkYzMTVEQjlGNTM4MjZFNUFBOTVBRUI3ODcyRjFEIDB4MTFEMjIyNzJFMzlCRkJFRTIxRTI2RTRCMDdERkRFOEI2NDVCRTRCNTZFNzI2MTk2RUUzQTI4N0EzREYzMzJGRSkpKCgweDA1RDlENDhBOTQ3RkU1QkI4RkZEMDY2NDlEODg4NUU0QzRGMDU4NUU0QzM3OThCQkZFQ0ZGRjM4ODdCMUE1RTMgMHgwOUI4ODU2NjFEQkFGMjNFQTE3QTk5MDUxMUM0N0Q2MDg2NkEyMzE0QTMwNUVERjc3RkMxQzAzNTU0MzQ2N0ZCKSgweDNCMDIxQjcxNjU0RkQ5OEExQzJDNzUxQ0I2QzEzQkM4REEyMDU0NTIxNzlERDFCRjM0Q0E5MTYyMkJERDdCMEQgMHgyN0M0MTU5Q0U0ODcxNTk3OUVCMDZGQTEyRTZBOEVDQ0RGNUQzRjQwRTE0N0E1OEUxOTAwMzZCQTc3Q0FDNUFCKSkoKDB4Mjk4RTg1RDQ0RDUzRDc4QTNDRTc4ODQyQUM1QTdFRUQwQzEyN0NGNjkzNkRFOTlCQjNCOTZBRjkzNTI4RTRDRCAweDIzMEZBOTFDNEFBRTExNkQzQkVFNkQ3N0MxOTk2QzdFNDhGQTRGNDdEODQ3Q0VGQTVCNUFDNTA3MUQwMjdGOTQpKDB4MEMwMDM1M0U2QzBEQTBCRUQxREExRDgxMTU0MTVDMkU5QTA5OTM4Q0ZCMjI2OTNDODE0ODAwNkMxNUJBRjVDNSAweDBDNDQ4NzFDODhDRUU3NjdBQjMxRjRFMTY1NTkxNDgxQzkyN0QzQTJFRUY1RTkwNTM5NDBBRTc2NzM4NjJEOTgpKSkpKHpfMSAweDAyODg4MEQyNzUyMzIyOEZFQzZDRjRBNzE1QjQ1QjZEREQ0NTgxOTY1N0RFRTVGNzk4MUFCMDlFMzU5Q0YyOTcpKHpfMiAweDNFQzc4RDcxN0ZDQjZDMkZDOTEwMEI3MTQyQUFCREE4RkNEN0U1NTc4QTdCODRDQzM1MzRFNDdENEU5MEQwRkQpKGRlbHRhKDB4MDc1NkIzRjEyNDcwMjNGOTBGOEI0QkU2QTAzRkU1QjE5QTM3MjEyQkFDOUFGQUZDN0I2QzJFMkM5NTE4MUY0RCAweDJERjIyQ0EyOTAzRjk2ODk0MkY5NURENjUyNTU0MDhEODIyMTU3OEVDQTJGMkU2RUNEMEM2RDFBMEZCNUI5RDkpKShjaGFsbGVuZ2VfcG9seW5vbWlhbF9jb21taXRtZW50KDB4MjEzNDcxMERGRkE1MUJFOEVFMkFBOTg5NUE5RDRCQ0U0RjkzQzNCMkJFMzc5OTIzQzk0OTE0N0RDRTUyNzdCMyAweDM3RkUyMUZGNjFGMjFGQkM4ODI4MjA1MzdFNTVBNkZCMTBFNTcxMDVBQzJGMEQwNTJGQzM2ODE5Q0ExMjFCNEYpKSkpKSkp", + }, + }, + }, + credential: { + _type: "Struct", + properties: { + owner: { _type: "PublicKey" }, + data: { age: { _type: "Field" }, name: { _type: "Bytes", size: 32 } }, + }, + value: { + owner: "B62qrVPwPbeogxQKzPcV5dTSTmNo39g1T2hAM19cJ5Dtwk1p4STmKAE", + data: { + age: "18", + name: { + bytes: [ + { value: "65" }, + { value: "108" }, + { value: "105" }, + { value: "99" }, + { value: "101" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + ], + }, + }, + }, + }, +}; + +export const samplePresentationRequestZkApp = { + presentationRequest: { + type: "zk-app", + spec: { + inputs: { + data: { + type: "credential", + credentialType: "simple", + witness: { + type: { type: "Constant", value: "simple" }, + issuer: { _type: "PublicKey" }, + issuerSignature: { _type: "Signature" }, + }, + data: { + person: { + age: { _type: "Field" }, + name: { _type: "Bytes", size: 32 }, + }, + points: { _type: "Field" }, + }, + }, + targetAge: { type: "claim", data: { _type: "Field" } }, + targetPoints: { type: "claim", data: { _type: "Field" } }, + }, + logic: { + assert: { + type: "and", + inputs: [ + { + type: "equals", + left: { + type: "property", + key: "age", + inner: { + type: "property", + key: "person", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "data", + inner: { type: "root" }, + }, + }, + }, + }, + right: { + type: "property", + key: "targetAge", + inner: { type: "root" }, + }, + }, + { + type: "equals", + left: { + type: "property", + key: "points", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "data", + inner: { type: "root" }, + }, + }, + }, + right: { + type: "property", + key: "targetPoints", + inner: { type: "root" }, + }, + }, + ], + }, + outputClaim: { + type: "property", + key: "name", + inner: { + type: "property", + key: "person", + inner: { + type: "property", + key: "data", + inner: { type: "property", key: "data", inner: { type: "root" } }, + }, + }, + }, + }, + }, + claims: { + targetAge: { _type: "Field", value: "25" }, + targetPoints: { _type: "Field", value: "100" }, + }, + inputContext: { + type: "zk-app", + serverNonce: { + _type: "Field", + value: + "13282950667393837968514931367603124110006503770513488711847457500412027340795", + }, + action: { _type: "Field", value: "123" }, + }, + }, + zkAppAccount: { + address: "B62qiV4KJMMfAuUCs1b8T3RMRJrLk3paXcEPkLz9jbga1zKP782NmBA", + tokenId: "1", + network: "mainnet", + }, +}; + +export const samplePresentationRequestHttps = { + type: "https", + spec: { + inputs: { + signedData: { + type: "credential", + credentialType: "simple", + witness: { + type: { type: "Constant", value: "simple" }, + issuer: { _type: "PublicKey" }, + issuerSignature: { _type: "Signature" }, + }, + data: { age: { _type: "Field" }, name: { _type: "Bytes", size: 32 } }, + }, + targetAge: { type: "claim", data: { _type: "Field" } }, + targetName: { + type: "constant", + data: { _type: "Bytes", size: 32 }, + value: + "416c696365000000000000000000000000000000000000000000000000000000", + }, + }, + logic: { + assert: { + type: "and", + inputs: [ + { + type: "equals", + left: { + type: "property", + key: "age", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "signedData", + inner: { type: "root" }, + }, + }, + }, + right: { + type: "property", + key: "targetAge", + inner: { type: "root" }, + }, + }, + { + type: "equals", + left: { + type: "property", + key: "name", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "signedData", + inner: { type: "root" }, + }, + }, + }, + right: { + type: "property", + key: "targetName", + inner: { type: "root" }, + }, + }, + ], + }, + outputClaim: { + type: "property", + key: "age", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "signedData", + inner: { type: "root" }, + }, + }, + }, + }, + }, + claims: { targetAge: { _type: "Field", value: "18" } }, + inputContext: { + type: "https", + serverNonce: { + _type: "Field", + value: + "4343919140832211358170758874350867217600871707216240107166052913905177631127", + }, + action: "POST /api/verify", + }, +}; + +export const samplePresentationRequestHttpsRecrusiveNoContext = { + type: "no-context", + spec: { + inputs: { + provedData: { + type: "credential", + credentialType: "recursive", + witness: { + type: { type: "Constant", value: "recursive" }, + vk: { _type: "VerificationKey" }, + proof: { + _type: "Proof", + proof: { + name: "InputProof", + publicInput: { + _type: "Struct", + properties: { + context: { _type: "Field" }, + claims: { + inputOwner: { _type: "PublicKey" }, + data: { + age: { _type: "Field" }, + name: { _type: "Bytes", size: 32 }, + }, + }, + }, + }, + publicOutput: { + _type: "Struct", + properties: { + owner: { _type: "PublicKey" }, + data: { + age: { _type: "Field" }, + name: { _type: "Bytes", size: 32 }, + }, + }, + }, + maxProofsVerified: 0, + featureFlags: { + rangeCheck0: false, + rangeCheck1: false, + foreignFieldAdd: false, + foreignFieldMul: false, + xor: false, + rot: false, + lookup: false, + runtimeTables: false, + }, + }, + }, + }, + data: { + _type: "Struct", + properties: { + age: { _type: "Field" }, + name: { _type: "Bytes", size: 32 }, + }, + }, + }, + targetAge: { type: "claim", data: { _type: "Field" } }, + targetName: { + type: "constant", + data: { _type: "Bytes", size: 32 }, + value: + "416c696365000000000000000000000000000000000000000000000000000000", + }, + }, + logic: { + assert: { + type: "and", + inputs: [ + { + type: "equals", + left: { + type: "property", + key: "age", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "provedData", + inner: { type: "root" }, + }, + }, + }, + right: { + type: "property", + key: "targetAge", + inner: { type: "root" }, + }, + }, + { + type: "equals", + left: { + type: "property", + key: "name", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "provedData", + inner: { type: "root" }, + }, + }, + }, + right: { + type: "property", + key: "targetName", + inner: { type: "root" }, + }, + }, + ], + }, + outputClaim: { + type: "property", + key: "age", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "provedData", + inner: { type: "root" }, + }, + }, + }, + }, + }, + claims: { targetAge: { _type: "Field", value: "18" } }, + inputContext: null, +}; + +/* ***************************** */ + +export const sampleCredentialSimpleUpdated = { + version: "v0", + witness: { + type: "simple", + issuer: { + _type: "PublicKey", + value: "B62qqBRH3tNvmZUwY6it6SAaiS2Mx1Zi2NqExvsRqNNJZFbZ2SZo34j", + }, + issuerSignature: { + _type: "Signature", + value: { + r: "12237368200570544388756696197527812988602072545762708510637606617881815414166", + s: "18498477091887383992694619839012590875352429373220077631585994996512199561895", + }, + }, + }, + credential: { + owner: { + _type: "PublicKey", + value: "B62qrVPwPbeogxQKzPcV5dTSTmNo39g1T2hAM19cJ5Dtwk1p4STmKAE", + }, + data: { + nationality: "United States of America", + name: "John Doe", + birthDate: { _type: "UInt64", value: "633830400000" }, + id: { + _type: "Bytes", + size: 16, + value: "f6c75189e8326f524171107814a952bb", + }, + expiresAt: { _type: "UInt64", value: "1848700800000" }, + }, + }, +}; + +export const samplePresentationRequestHttpsFromExampleUpdated = { + presentationRequest: { + type: "https", + spec: { + inputs: { + credential: { + type: "credential", + credentialType: "simple", + witness: { + type: { _type: "Constant", value: "simple" }, + issuer: { _type: "PublicKey" }, + issuerSignature: { _type: "Signature" }, + }, + data: { + _type: "DynamicRecord", + _isFactory: true, + maxEntries: 20, + knownShape: { + nationality: { + _type: "DynamicString", + _isFactory: true, + maxLength: 50, + }, + expiresAt: { _type: "UInt64" }, + id: { _type: "Bytes", size: 16 }, + }, + }, + }, + acceptedNations: { + type: "claim", + data: { + _type: "DynamicArray", + _isFactory: true, + maxLength: 100, + innerType: { _type: "Field" }, + }, + }, + acceptedIssuers: { + type: "claim", + data: { + _type: "DynamicArray", + _isFactory: true, + maxLength: 100, + innerType: { _type: "Field" }, + }, + }, + currentDate: { type: "claim", data: { _type: "UInt64" } }, + appId: { + type: "claim", + data: { _type: "DynamicString", _isFactory: true, maxLength: 50 }, + }, + }, + logic: { + assert: { + type: "and", + inputs: [ + { + type: "equalsOneOf", + input: { + type: "hash", + inputs: [ + { + type: "property", + key: "nationality", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "credential", + inner: { type: "root" }, + }, + }, + }, + ], + prefix: null, + }, + options: { + type: "property", + key: "acceptedNations", + inner: { type: "root" }, + }, + }, + { + type: "equalsOneOf", + input: { type: "issuer", credentialKey: "credential" }, + options: { + type: "property", + key: "acceptedIssuers", + inner: { type: "root" }, + }, + }, + { + type: "lessThanEq", + left: { + type: "property", + key: "currentDate", + inner: { type: "root" }, + }, + right: { + type: "property", + key: "expiresAt", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "credential", + inner: { type: "root" }, + }, + }, + }, + }, + ], + }, + outputClaim: { + type: "record", + data: { + nullifier: { + type: "hash", + inputs: [ + { + type: "property", + key: "data", + inner: { + type: "property", + key: "credential", + inner: { type: "root" }, + }, + }, + { type: "property", key: "appId", inner: { type: "root" } }, + ], + prefix: null, + }, + }, + }, + }, + }, + claims: { + acceptedNations: { + _type: "DynamicArray", + _isFactory: true, + maxLength: 100, + innerType: { _type: "Field" }, + value: [ + { + _type: "Field", + value: + "1535750191209038276491867256345743424918048468505871420482779334664484555622", + }, + { + _type: "Field", + value: + "22047996538609280301110666364818369992447508174403408199422649676981322383447", + }, + { + _type: "Field", + value: + "24056497251096418057564183210090983888753346776669738257197194846336719337693", + }, + ], + }, + acceptedIssuers: { + _type: "DynamicArray", + _isFactory: true, + maxLength: 100, + innerType: { _type: "Field" }, + value: [ + { + _type: "Field", + value: + "5829798620528221164923475031411230726737474930308766915907721384085934614251", + }, + { + _type: "Field", + value: + "22272326066070346302181355471642228895021114735537987149163045306117362247163", + }, + { + _type: "Field", + value: + "28847437109329576273273699361208638635072195817455078955021492954147148718403", + }, + ], + }, + currentDate: { _type: "UInt64", value: "1733918837371" }, + appId: { + _type: "DynamicString", + _isFactory: true, + maxLength: 50, + value: "my-app-id:123", + }, + }, + inputContext: { + type: "https", + action: "my-app-id:123:authenticate", + serverNonce: { + _type: "Field", + value: + "17107116096673349503346389785413950052660281203260762106134117160043867421914", + }, + }, + }, +}; + +export const sampleCredentialFromPresentationTest = { + version: "v0", + witness: { + type: "simple", + issuer: { + _type: "PublicKey", + value: "B62qoVptCUV76BrLZ3wf81LAwWcpX6gbHM7RfMBfCJ4o1ss2hSWXoWn", + }, + issuerSignature: { + _type: "Signature", + value: { + r: "19910580226962503847405936075240397112736734558480295040043264333028086265769", + s: "24693551695089287833725718042123295628750170153678287513640795644857253570737", + }, + }, + }, + credential: { + owner: { + _type: "PublicKey", + value: "B62qrVPwPbeogxQKzPcV5dTSTmNo39g1T2hAM19cJ5Dtwk1p4STmKAE", + }, + data: { + age: { _type: "Field", value: "18" }, + name: { + _type: "Bytes", + size: 32, + value: + "416c696365000000000000000000000000000000000000000000000000000000", + }, + }, + }, +}; + +export const samplePresentationRequestFromPresentationTest = { + presentationRequest: { + type: "no-context", + spec: { + inputs: { + signedData: { + type: "credential", + credentialType: "simple", + witness: { + type: { _type: "Constant", value: "simple" }, + issuer: { _type: "PublicKey" }, + issuerSignature: { _type: "Signature" }, + }, + data: { age: { _type: "Field" }, name: { _type: "Bytes", size: 32 } }, + }, + targetAge: { type: "claim", data: { _type: "Field" } }, + targetName: { + type: "constant", + data: { _type: "Bytes", size: 32 }, + value: + "416c696365000000000000000000000000000000000000000000000000000000", + }, + }, + logic: { + assert: { + type: "and", + inputs: [ + { + type: "equals", + left: { + type: "property", + key: "age", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "signedData", + inner: { type: "root" }, + }, + }, + }, + right: { + type: "property", + key: "targetAge", + inner: { type: "root" }, + }, + }, + { + type: "equals", + left: { + type: "property", + key: "name", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "signedData", + inner: { type: "root" }, + }, + }, + }, + right: { + type: "property", + key: "targetName", + inner: { type: "root" }, + }, + }, + ], + }, + outputClaim: { + type: "property", + key: "age", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "signedData", + inner: { type: "root" }, + }, + }, + }, + }, + }, + claims: { targetAge: { _type: "Field", value: "18" } }, + inputContext: null, + }, +}; + +export const sampleCredentialRecursiveUpdated = { + version: "v0", + witness: { + type: "recursive", + vk: { + data: "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", + hash: { + _type: "Field", + value: + "10004415226961678011613781895787507059143191442658557645176003500242334644061", + }, + }, + proof: { + _type: "Proof", + proof: { + name: "InputProof", + publicInput: { + _type: "Struct", + properties: { + context: { _type: "Field" }, + claims: { + inputOwner: { _type: "PublicKey" }, + data: { + age: { _type: "Field" }, + name: { _type: "Bytes", size: 32 }, + }, + }, + }, + }, + publicOutput: { + _type: "Struct", + properties: { + owner: { _type: "PublicKey" }, + data: { + age: { _type: "Field" }, + name: { _type: "Bytes", size: 32 }, + }, + }, + }, + maxProofsVerified: 0, + featureFlags: { + rangeCheck0: false, + rangeCheck1: false, + foreignFieldAdd: false, + foreignFieldMul: false, + xor: false, + rot: false, + lookup: false, + runtimeTables: false, + }, + }, + value: { + publicInput: [ + "0", + "26227234720204021054517909417970907532340033574635469836085766982785994507247", + "0", + "18", + "65", + "108", + "105", + "99", + "101", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + ], + publicOutput: [ + "26227234720204021054517909417970907532340033574635469836085766982785994507247", + "0", + "18", + "65", + "108", + "105", + "99", + "101", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + ], + maxProofsVerified: 0, + proof: + "KChzdGF0ZW1lbnQoKHByb29mX3N0YXRlKChkZWZlcnJlZF92YWx1ZXMoKHBsb25rKChhbHBoYSgoaW5uZXIoNjU3MmJiMmU4YzNlOGIxOSBiMGExNzE2YjA1MjhlMjBhKSkpKShiZXRhKDkyMDdlMzdjNzZmNWZiOGUgNmYwYmNlZDM1Y2NhMmQzNCkpKGdhbW1hKDQ2YzJkMjg5NTdmOWI2MjcgNTU4MjhjZTBhNmM4YjViNCkpKHpldGEoKGlubmVyKDAzODIzNmY4ZTM3ODY0MzQgOWIyYmU1ZDM2NjA0NzdhOSkpKSkoam9pbnRfY29tYmluZXIoKSkoZmVhdHVyZV9mbGFncygocmFuZ2VfY2hlY2swIGZhbHNlKShyYW5nZV9jaGVjazEgZmFsc2UpKGZvcmVpZ25fZmllbGRfYWRkIGZhbHNlKShmb3JlaWduX2ZpZWxkX211bCBmYWxzZSkoeG9yIGZhbHNlKShyb3QgZmFsc2UpKGxvb2t1cCBmYWxzZSkocnVudGltZV90YWJsZXMgZmFsc2UpKSkpKShidWxsZXRwcm9vZl9jaGFsbGVuZ2VzKCgocHJlY2hhbGxlbmdlKChpbm5lcihhMDI0N2Y0ZjIyMjM3OWQ2IDQzZDk4OTYyZTMxOWM5MmIpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigyOTBlYjViMDM0ODZiMTc5IGNiM2NlNmFlOGEzZTI5NzMpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig3M2ZlNzQ4NmY0NTI2YzhhIDFlMTQ3MDFlODcxZDczZWYpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigzMTBiMGFkNDczNGI4YTY0IDUwZmI2NWYwZGEwOWRiM2IpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig1M2U4ZTM1NjZiMTk0YzM1IDRiYTY0YTIxYTkzZTg4NjIpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig5MWJlMTJmYTg4OGY0NjE3IGM0YjY3Mjg1MGQ2M2JlZjApKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig5Zjc1OWE3MTk0MzBhYTM1IDZmYWEyMWI4MmUyZjY5YzgpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigwNjc4YjM5MjQxYTkzYmZmIDdkNTg0NDE0MmUxNjllY2UpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig5YjA5OGZiYjY2OWRkZjdmIDNhMGI5OTg5NDI5YzU2YTYpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig2ZTI0YzQ1ZGZhMmY4NmVjIGRmNzg3ZWRlYjRlYzIzYTYpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigxOWNkM2RjY2JiNGI4NjUzIGZhNmM2ZDI5NjlmZDkzZTcpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcig4YWZkM2VkNDFlZDQ1NDU4IDk2OTVmM2UxZDYwMWExNWUpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigwNWQ2M2NiNjE0MDJjMTYwIDc2MTI4MzZmYTkyMWNkYzApKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcihlNDYyMDAzZDMyNGRkZjg5IDhiNjYyOTQ3ZWY4ZjM2MTgpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcihjODc3NGMyOWI0M2QyNDY0IGM5YzJiNGU3YWRhOWM4YWIpKSkpKSgocHJlY2hhbGxlbmdlKChpbm5lcigxZmZiY2VlNjlkODE4ZGZkIDc5NmJhODk2ZTk4N2I2OTIpKSkpKSkpKGJyYW5jaF9kYXRhKChwcm9vZnNfdmVyaWZpZWQgTjApKGRvbWFpbl9sb2cyIlxuIikpKSkpKHNwb25nZV9kaWdlc3RfYmVmb3JlX2V2YWx1YXRpb25zKGU1ZWIzMjM4NDg0YWY2NzEgMDAwNTM1M2Y0NzNkMmQ0NSA5MWMzNTA4ZmU5YjNkZWI3IDBjZjE4YWI0Mjc1MTI2NTgpKShtZXNzYWdlc19mb3JfbmV4dF93cmFwX3Byb29mKChjaGFsbGVuZ2VfcG9seW5vbWlhbF9jb21taXRtZW50KDB4MTA4RDlBODZFQkRFRUQ0ODk3QjIxM0VFRDMxQzI0QzFFRkZBOURDRTJCNEJFQTNDNzlEM0UyMzA0MDZFQzIwNiAweDE5RjJDNzVDREYxNEEyNjkxODZBMzM5OENEMzk5ODQyM0U3MjRGNENDNkE0NzcxMTgxOTk3QzQ1RThCN0RCOTcpKShvbGRfYnVsbGV0cHJvb2ZfY2hhbGxlbmdlcygpKSkpKSkobWVzc2FnZXNfZm9yX25leHRfc3RlcF9wcm9vZigoYXBwX3N0YXRlKCkpKGNoYWxsZW5nZV9wb2x5bm9taWFsX2NvbW1pdG1lbnRzKCkpKG9sZF9idWxsZXRwcm9vZl9jaGFsbGVuZ2VzKCkpKSkpKShwcmV2X2V2YWxzKChldmFscygocHVibGljX2lucHV0KDB4M0E4M0M3Qzg0MDNGMDNBRkQ1OURDMUVENEVFRUZFRTg1MDkyM0VBNjQ2MUUyMTg1NUNBMjQ3MTlDNTcwREZGOCAweDA0ODdFRTJGQzNGREFDMEE1OTdDMDVDOUM3Njc3N0ZBNDI5MzlCOTg2RTcwRTY3M0MzOUY2RUM5QUYzMzg0M0UpKShldmFscygodygoKDB4MDJDNTFGQ0QxQ0E5NjA1MTI3NTYzODU1QTlCNTFBNjgwOUI2RTVEMkUwQkU3OERFMjdBREFBQzk2Q0E3MTk3QikoMHgzMUE2RjY4MTlGMzNGNjc1RkE2NTI4MUZBODVBMzI4ODlFQTY3QUI4MTQxRjE4NTIxNTg1NENBODEwNzAxQzk2KSkoKDB4M0RFOUYxOTcyMzJENURFQzU5MDQ3RUMwNkM5QTg4OUU4QzI5Q0JDNUVGNEIzODdCNjA4RTg2RjlBMDM4NDU4QSkoMHgxNzhGOTAwODlCMkQzOEM0MkRGQjhBRjkyNjAzMzBBRUM5RTE5NENBRUVEMDRCNjNDNEQ0NzBGRjZEQzNBN0Q5KSkoKDB4MUM3OTI0NTIwNzczMzNEODRCNDQ0MUZBQzQ1NDUxMEM4RjFEQUE3QzdFODVFRjU5MUU3MjlFNEJDQkI4M0NFNikoMHgwQTY4ODAzQzE1NzFEREVCMDIyOTczMThENDNBOTA2NzBGRTM2NDlDQzAwMjdCMEExMDFGOTcwRTU1NkE4MjZDKSkoKDB4MTc5QjE3NjQ0RTQ2N0IzRkE0RDNDOTU0NTE1RDcxRTdDOEJENzhFRTE3OUE0NEFDNEREQTYzMjUzMjIyMjAxQSkoMHgzNjk5RTBFNjA4NUVEMEI0N0RFNTU4NTg4MjQ1QzAyNEQ2RUVGQkY4ODRDQjcwMEJDRDRGMjY3MjNGQzE1MTc1KSkoKDB4MkE0QjBBQzhFREIyMTc3OTg0NTA3MzM2MjRDRUQ2RjNDQkQ3OEM2M0E3QUZCMEQ2NENBOUI5RDYzOTExRUZCMCkoMHgyOTIxNzg5MzU5ODk0MjJBRTEzM0Y1QTBBN0ExNjU5QjRCN0FDMDJBMUY4QTFEQjVDOUY5NDYwMkIzMzk3MjQ3KSkoKDB4MjRBMERFNjI0RjY1NUQwQkY5QjFDQjBBQURCRDY4QTUwQzlCOUMyQ0UxRTk5QzJCRUEyM0FCQjNEMTgzOEJBMykoMHgwNkJGNENFMTYwQjZBQjNGREZDMDREQjRFODNDNEU2MTk2NEQ3MUJCQkNDOTRDREQ0NTIzOEE2OTNBRDkwMDg1KSkoKDB4MjNDRDVERDExMTM4MkRCRjVGNzQ4NjIwQjBCNjE0RTUyOEU3N0NCQkNBM0IxMzAxMjc0RUY1MjUyMDZCNzFCRCkoMHgzMTcxOThCQkVGQUUxNEY3NDhEQzQ2QUJFMjcyNjcyMzc2M0IxOUQ0OTg1MkEwQUIzN0JCM0YxNUM2NjM2NDMxKSkoKDB4MzI5QjhBOTNFNTUxOTgyOTU3ODYwMTUyRUM3QjM2RkYwM0NEQkJBRkZGQTZGQTFCQkEyNjE1NTBCREVCM0M3QikoMHgyQTY1NkYzRTM0M0ZGMUU3QjNCN0MzQzlEQTkxRDEwMjdDODZFREY2NUVGQjYzQjA1MEQ1Qzk5ODc3ODRBMUUyKSkoKDB4MkZGRjYyNEZDOTVGOTFCMERENjJFNzdGODY2NzYwRTZGQkNBMTVEM0U5NkJGQzgxQzEzREE2Njk1RUUwRTFENCkoMHgyRkI1MjcxMUNBRDc3NDI1RUJGQ0FBNTNEQjkwMUU4QTdDNUY4MjkwM0Y2QjgyQzI0MEExMTY1MTdEOEQ3QTVCKSkoKDB4MkRDQTk5Nzg4MEZGM0E3OEJEMjlDMUI0RDZDNjlCQkQ0MDJCMzMxNkYxNjA2MTREN0MzNEQ2MTA4NUY5Rjg0QykoMHgyNzM2MUU0RjlEOTRGNDU4NzY2QkYwNkIyRjJEQUUzNURBRUI0NEQzRjdFOTQ1MjdCOTFDMjc1OEIwOTZCNjczKSkoKDB4MUE0Njc1ODZGOTlDQjdFRjNCNDNFNjk1OTkxQjBFNEREQ0YyMkQxMUQxNDVFNTJDODY3MTBFNEM2MDRDQzU2MSkoMHgwMzIwN0I0QzU1QjA2NDA3MzgyMjFCOTgxMjQzMUE2OTYyMDI4ODhGMEJCOUZDMzM3NTcwNkVGNkQzMkUyMjA3KSkoKDB4MjE1Q0E3NDVBMkIzNUQ0Qzk4MDM0M0UyRDU1RkEzRUI3REFDQTc5MkU1NzM3NzE4REVCMzhDRDlFRUY4MTQ5MikoMHgyQzEwQjk2OUU4Q0M5QzZDNzRCMUE4NTQ2MEFCOUM0RDI2RkQ3NTE3QThDQzBERjM1RTI4Q0I4OEE3RTQ5OTA0KSkoKDB4MTU0NjRFMEMzMTNGRDM1Q0Y0MEM5MTA5NEU4M0I0NTBCMkFFNTE0MDczRjhEOEY4NDU2NDdCMjI2RkMwODQ3QSkoMHgzOENCOTAyMzg2ODMzQkM1M0M1QUM0MjdFQjFGMzBERjU0NkUxRDBCQTA3MkNEOTcyRDRGRkFDQzc5ODlENDlBKSkoKDB4MjhGNUY3NTk1NjQ4MDExOERBMTkyNERGOTRFMkFBQkJDM0IzQ0RGRTYyNkZFRjVDRkRCQ0ZGM0FBMUUzRTNEMCkoMHgyNzhBQjA4QTBENTc2OEJGRkZBNzhDNUY2MTlGMDEwNzAzNjE3MjgzMkREODg1RjMwOTQxMkI5RkVFQUZBOEFGKSkoKDB4M0E4NThCNTkwNjk1RkRDNjkyMTE3NTYzRUQ5RjRBMjdDMjRGNEFFMDg0NEI0MDlCQUE3MkVDOEExN0Q1N0MwMikoMHgyQTBDQUFBMzRCNkJDMEI2NzYyNkEwOUUxMkM3ODZBQTIyNkE4ODBENUE1QThGMURENTlFOTJBRjg2MjIyMzc4KSkpKShjb2VmZmljaWVudHMoKCgweDEwRjM1NTMyRUFBQ0ZFRUIyRENCQTdCMEQ2RkU1MkRDM0MxQkI0QTAxMEZEQTNGQzRCNEVGNTVDMzg0Q0M2OEIpKDB4MUJFMkM2MjFGQ0EzMUM5RTNDQTQ2RUFCNjg1QTcwQjA4ODZDQUZEREQzRkM1MUZEQjRDN0M2NzdGMzRBNTRBNykpKCgweDFGQkZDODZCOUQ3M0Y1QTExMjA4RTczMTczNzRFNDg2MTc2MEJDNEQ0QjUxNjY1QjYyRTNFMDQ4OTA1RTQyMzcpKDB4MkMyQjcxQTVGOTkyMkExNzREQkNFNDVFNjYxREEyQjZDQTgzMzJDNEVBOTk3MTI4ODEzRkVGMjE2MTY1QTlCMikpKCgweDA4RkY1NUNBMUVGMURBODU3NzgzOEEyMTdDNDBEREI4MjIzMTBERUQ2QjNDNjNDRDI5RDVFNkMxMERGQkYwNDEpKDB4MzcwMDg2Q0JFRDJGODIxMTM5RkYzMTVCRTg0MEM3QkM5OTdCOTM3NEYyOThDNDhCQTk2MEU3MTg2NzExQjJGOSkpKCgweDNDOTIxMDEzRDhGNzNBMjhCNjg2N0QzQUVGQTY1NURFMzFEOUFDMjRFNEE0MjlEMTkxODBFMzMxRkQ0Q0FGMzUpKDB4MkM1OUUzQjNGMjI3OEE5Qzg4RjQ1QkUxMzY2RURGRTU2QjEwMjNCNTI1NUM1MUM4RkY4MUZEQTI5MDRCMjlBMCkpKCgweDMwNDQ2MjcwRTlFQzI5NTNGNTE5QTk1OTc3NDM3RTI5Mjc0MTZFQkE3MjdGODY1NTA4QUM4RTlFNjNEODZEMzIpKDB4MjcyRkJBM0NCODBCRTIwOTk2MjNGODZFMkNFRjdDMEU0NzBCNjBERTE1NTM0NkM0Mzg0NzZGQjZFRTFDNjBFNykpKCgweDI5OENFQjlGQ0E0OTkyN0QwM0NCMkE1NzQwMkUxMTc1RkY3REE5OENDNTVBMjU3N0M0NDJCMzQwMkY1NzQ1MTEpKDB4MUJGNjU5NTM3OTQxODQyNEZERUQ1Q0U2RDAyRjRGNUU1MzI0OTc1NzU0RTgwQjM0MjM3Q0FBQzc1QTJCMTI0QykpKCgweDBGOEE5OTc0RDRCQjM0NEQ1NTZBQ0ZCOUQyMjg1NTQ3OTJBRDMyNUY2RjBGNDlFREUxRTUzMDgzNjRFRTA4MzkpKDB4MzYzRDFFMURDM0FGQjkzM0JGOTgyODZGRDVFQjExQjQ5NDBENjAxNjAxRURBRTU4RTczMjhEQzMxNzdEQTZGMykpKCgweDI3Qjg5QUZDMTA0NDBERUZGQTA0Qjc3NDVCMEM0Q0RBMDQwM0REN0RBNkU1NDg1NzczRDVBQjhFQjYyQzg1NkQpKDB4MjBFRTBCRjAzNkMwMDc1MjgzMEQwQjBCNUE2QTg3QUQzODlEMDcxODAwRTQ3NEVBNzRFNTY1RUEyODdFNzA2MSkpKCgweDJCMTIxRTczQkM1ODkwOUUwQUY4Q0MwRDdEMjkxRjgwQkE5QkI2QzJGOTgzRDNDQjhEMUI0RjY5NzBDOTIyNzQpKDB4MTgwRUNDRUY0Q0ZDRTM5RTRBOThGRjBBMUQ1MDcxN0I2QjY4NEUxMzYzNzEwNzAwRDZGNDkxQjEzQTA0NkQ0NykpKCgweDE2MkE2RUM0ODAxNjUwNDE1MEJERjE4M0FEODQwNTBERUVFNzJFQ0Y2RjBDNjhGRjFFQTAwREJBNTkxQjM4Q0IpKDB4MEVFQzI3NjY4OEFDM0I2RDIwNDA3ODcxRUQ0NDIxMjZCOUFERjczOERGQzI5NDdBQjU3QzlCQ0QzQUZCMUNGRikpKCgweDExNzdGMjczRTM0QTlFNTlFNDAxNDBFQTc1MTI0QzczRDJCMDk0Q0RDRDU3MDg2QjM5NUNENkQ2NDE1REEwNUEpKDB4MERDNUM2RDUzQUJBNzIxRDM0OTQyRUEyMUFBMzlERUQ1OEVBQTBBRTE1QzNGRTQ1Mjc3OTdDRTU3NTVBQjIzRikpKCgweDExQjBCQjk5MjU1ODEyQzNGNDQ1QzM4ODRBNTkzQkI3QzVEMzc3MDI4QUZCRkRGMTlBOTRBMDU0RDExRDg5NTEpKDB4MDA1MjZEODIyNDQxNkZCMzM0QUUwNkE0MEFBNDc1ODc4RUVFQUM4QkNBMUNCMEEwOERCNzQ4REFFMDQ2RTU3NykpKCgweDI5MjhCQUQ4QjA5MzExODEzQjYyRUE1MEZBREE0ODc5MTE3REZCNTI3MzI1QUZDMjJDM0Q3MDZCODA0MjIzQTApKDB4Mzc2QTdEMjMwODE1M0JGMEVENEIyODVFM0EwQjk1NURERUI0QkU0Mjk2NkE4NkRFQjRDQzU2MzY1MjkzMDk4NCkpKCgweDBEMkVDMkRBOENDQjYzMTI0QjAxQjUyRDdEQTAwNDgwOURCNUNDMkRDREE0MzI5MjlCMDNFRTI5QTdEQjkyM0YpKDB4MjFDMDkwQkYwRkIxREVCQzVBQkFCMzcxMDhEN0Q1QzMxNjI3QUE1MzA5NDA3MEM4MzdBOTFEM0Q5QjlGMTRFQykpKCgweDI5NDUyM0ZBMzRDNjk5OTMyNDYxRjJGRkRBOTFEQzAyODU4QTBBOUI5N0E5RDlGOEYxNzkwODRFNTNCQkY3QTApKDB4MTBBMjA2OUI1REJDQjQwOTFBODg1QTA1MTYxNTU4NDcyNUY3MTI5N0QyNjhEOEYzMTNFQkE1QUQ1M0REM0FBNSkpKSkoeigoMHgyOERBNzkzRTY2RDdCMzc2RUVDQzQ3REM1QUNEODk1RjZDNTg5RTQ4OTBCQ0I4NDBFRjQ3MDM4NzE3RDQwRkE5KSgweDAxQUFFOTQxQzQxOEFGRDc1QURCNzBGMjg2MjFFMjI3NkZFNzAyMTVERDJDRTBBQkE0OUZDRUMzRjM5Q0NFNjIpKSkocygoKDB4MDE5NzExNjdCNDY2NjdDQUJFRUM1RDE1OENCOEI2ODlCNTA3MkI4QjlFMTRDQzJEQzQ3NTI0NDQyOEJFNjcyNikoMHgwMjMzQjU3NTNGMUQ3NjYwMDVGNThFQTJENDRCQTUxMkQ4Nzg1RUU2NDFCNThFQTUyMThGQjRBRjNDRjgwOEQyKSkoKDB4MEMxODlGRTc1OUQ5NDFDRTJCMDc3MkRDNzUzNkE4Mjg1MDI3NUMwQUJDN0ZBRUUwQkEzNUUyMEEzMEI1RDUyOSkoMHgwOTEyNzRCQTIxREI4QUUxREVDMjlFODBDNDlBM0Y0OERCMjI5NjJFOTdDMjg2NjBFNzNFOUJFQTQwMUU5MUVGKSkoKDB4M0M3QkIxMEVCNjE5MEM1NzQ3MUNCQTE1MTk4MThBN0I0MEY5QzFENkZCNjRBNDgyRDRDREIzQTgyQ0ZEQTQ5NSkoMHgzOUE5OTE0QkQ5ODlEQkRGNzg4NDAxNERCRjQzRkNFNTBGM0M5QUIyOUY5MUM3NTFEQTkzODAwMjU5MDAyQzNCKSkoKDB4MTU3MzlGMjkxQTY3MDc0ODU4RjY5MzUyQUMzQTY2NTdFMDVDMzZBMDRCNjhEREQyOUI3RkNBNjZGQTE0QTgzNCkoMHgwNUY1RjU0QTdDNDFDMjY3Qzg0MTFDOTI3MzhENEVDMzgyNDMyMjY0NEE4OTQ0RTRBM0YxQ0Y1OTQzMzUzQjU2KSkoKDB4MjVGNzEyOTQyMDIxRjcwOURGN0YwNDI1OEYzQkMzODA0N0U5MDM1QjFCMkEyMDYxOTVCRDkzNzdCMUZDMjEzQykoMHgyNjNCMDAxNzEyMEYwREQ3RURBREREMTU2MDgyQkRCRjg0RkJCOTkzOTA3RjBCQzY0QTgzNkU0QUVFQTIyNzg5KSkoKDB4MjE4NjQ3RTFFMDlENUVFOTIwOUVGNTA3MEYzOEUyMjhCRDNENzczNzdCOTlBQTI2RUY5MDM2NDM3REEzOEZBNSkoMHgzQTcxRjJEQzBFOEJEOTExMzJDMDk2RDRBRkE0NDRBMzcxREQxRkREQzE5REU5NDU4QTQ2NEU1RkMyODE2Q0JCKSkpKShnZW5lcmljX3NlbGVjdG9yKCgweDE5Qzk1MUEwMDBEOUUyNjVBRkNFNzVGNjM4NTdENTcxQkNENkUyQ0FDQzQwN0IyODk1NDVGQkRFMEMyOUEyMjQpKDB4MEQ5MkFCQTgxMTc1NzUyRDQ5QTEwNDJDQkQyMDczNUQ2MzUxNDY5RUFDMzYwODRCNzIwMTEwQzFENzUxOUQ4RCkpKShwb3NlaWRvbl9zZWxlY3RvcigoMHgzRjJCNDBEQ0QxODgyMjlBOTg5NEJGQTcxNDMzRDY2QjJFMDE3RDZGOEVGQTY4QTIwN0M0NkQ5Njc5MTIyOEFGKSgweDI5M0FFNTVCMDRGQzFDOUM5NjQ0REIyMjBGQ0JFQ0UyOTg0MzE0NDBDRDE2QTg0MEUwMjU0ODQ4NzFGOEU4MEQpKSkoY29tcGxldGVfYWRkX3NlbGVjdG9yKCgweDI3MTc4ODc5Nzg0REVDMjVGNDJBMDMwQTA4NzZDNjA1QzkwOTMzQzIxRUYyMjk0MzY2MzYwRDUzNUEyRTgwOTkpKDB4MENERUU5NjNFRTU1OTQwNjQwNEZGREJFRjY1NTE1Mzc4NUIzMTMzNzg1Q0I2OEFBRTBFMjZGNzNCNDMxMkVERikpKShtdWxfc2VsZWN0b3IoKDB4MDFEMUM5QzRCQjU5MjE2MEVFOEY0Njg0Rjk1QjFBMUZBNzE0RTBGMDVEREUwQjdFRkNBQUIxRDcyQjcxRTNFNykoMHgzNTlCMzczNUU5MTVERDJFNzFBMTkzQ0RCRUMyMUI0NjkwODMzQkRBMDQ5RkYwRkY3NzhFOTFDQzkzMTREM0YyKSkpKGVtdWxfc2VsZWN0b3IoKDB4MDkwNzQ4MEFGNEExMUVCRjZBOTZBRkU5NTY4QzVCMDU3MjNCMTk0MkZCRjIwMUQ2QzlFMzY3RDE2QzE5MDdFMykoMHgwNzVFRDFDODNCMTM2NkJBODVDRUYxMzZGQjA3MDNFQzQxNTdFOTc0QzhCRjk4NTdDODU5NjY3QkU4QUM3Q0NCKSkpKGVuZG9tdWxfc2NhbGFyX3NlbGVjdG9yKCgweDFGMkYyQkVDNjgyMTg5M0E2MzQwODczNUYzNjYyMjQ5RDhCNTQ2QjI2Q0FFNDk5OTIyREY3NDgwOEE3QTgzNkUpKDB4MDBBOUREMUREQ0E4REQ4RDVFNzgxNTE4QTVBOTdFQjBENUEyRTI3QkRGMzczNTg0NEQ5ODRBQzQyNzM5RDc0RikpKShyYW5nZV9jaGVjazBfc2VsZWN0b3IoKSkocmFuZ2VfY2hlY2sxX3NlbGVjdG9yKCkpKGZvcmVpZ25fZmllbGRfYWRkX3NlbGVjdG9yKCkpKGZvcmVpZ25fZmllbGRfbXVsX3NlbGVjdG9yKCkpKHhvcl9zZWxlY3RvcigpKShyb3Rfc2VsZWN0b3IoKSkobG9va3VwX2FnZ3JlZ2F0aW9uKCkpKGxvb2t1cF90YWJsZSgpKShsb29rdXBfc29ydGVkKCgpKCkoKSgpKCkpKShydW50aW1lX2xvb2t1cF90YWJsZSgpKShydW50aW1lX2xvb2t1cF90YWJsZV9zZWxlY3RvcigpKSh4b3JfbG9va3VwX3NlbGVjdG9yKCkpKGxvb2t1cF9nYXRlX2xvb2t1cF9zZWxlY3RvcigpKShyYW5nZV9jaGVja19sb29rdXBfc2VsZWN0b3IoKSkoZm9yZWlnbl9maWVsZF9tdWxfbG9va3VwX3NlbGVjdG9yKCkpKSkpKShmdF9ldmFsMSAweDE1MTEyOTM2OTI5QjQzNkIwMTc1Nzk0MjE1QTU3MDAzMjMwNDE5OTU0RUYzQjQ4RTc4ODE4NDdEMzZFNzJCM0YpKSkocHJvb2YoKGNvbW1pdG1lbnRzKCh3X2NvbW0oKDB4MEY2OTZGQzhFM0M2OThENUUxMzc3RjhCMUUzRDc0QkFDNDU5ODY2M0NFRDlEMDBCRjAyNzk1N0FGMjUzNEREQiAweDM1RkY3NjZDNzM3NEQ3QzM2MjZBRkNDQTZDODBBMzNCNEREMTYyQzI2N0VFRjFBNTU4OTNEQjlDRDBERDk1MjYpKDB4MzRFRkNGRkI2QjlCRjFGNTM3QTM3RDkxOThGREYyOEZFRDFFRDRCMjkyMzFGMDU5Q0U3RjgxRkFEQjdERUM4NCAweDA1QUNEMUMxNDM1QTFFNkIwNjNGNzZDMzFDMkY5N0M1MzlGQzRFRUJFMjEyRkJCOUUwRTkwMjU3RTA3NUU4NUMpKDB4MEEyQkI0OUU2NTI3QjI4QTNCRDQ3QkI4OEIwMUFFNDM1MTM4RjY4NEU1RjA0RkE3NTEwQjlDQTZGQjc1Njg5NyAweDM3QUE1QjUxRjhFQUFBNzQ3RTBDQjZDQzE5MEI2NEFCN0ZGNEM1NjgxRDREMDdBNDg3RUIxMERERjlEODQwNzQpKDB4MjE2OTdDM0M0RDk2QjkwRDY4QTIxNEVCNjc1NjQzQzQ2MDMzMDgzQTkwRDkxNjhCOEI0Mzk5OEI5Q0YyMjkxMCAweDBENzc0QTJGQjI5Nzk5MjYxQjg2QjE3MjQwMDNFNjMyREUwQzhERkFGQ0EwREQ1NzY1NjVENUFERTU0NzMxNEUpKDB4MjE0QTZBNUNEQzYyMzNDN0NFNjE1MjQ4NDEyNjc4MTc4NTQ3RUNEQkJCODAzREJBNDQzOUMzQjRCQTZFQjBFNCAweDI0MTgxQkJEMjZGREM4NjQ1NzYzOERBQTM5RUVFQzlDRDc1RDIyNTc1NTU1QjM3OUM3OUE2MzBDNDVCMUNDMjUpKDB4MEI4QzZDMEM4M0VDOERGQkFBMkQyN0FEQkRBQ0ZEN0NBMzJBMkU2QjhCQkQ1Qjc5Nzg0QTg5NDI5NzhEODU3RCAweDAxMkFEQTg4MEQ3MkE4MzY2MkNGQURGMzI3MERFOEYyRjhBRDlGNDZGRjY2RTg3QkIwNDdCN0UwNzRFNUVENDApKDB4MzAwQTc3RjVEMjcwMjY5MEExRTc0NkM3NzlGQzRDNkFGNUIwMUQ3QUMzMTJCQTA0MzZBREJEQTc4NkRENzc3MSAweDI5QzUzQ0Q0NDQ1MzI3OUM1RkExOTVENDZDOTY1QjBDQTVCNDczMjAyRUE4N0M4Mzg4NEE4MUFFOUI3M0NEMzMpKDB4MzdDRjFFRjVDRUVERDZFQTkxNzlFQTI2NTJGNEM2RkI3M0MxRjQxRjcwRTBFRUU4ODExQUYyQUI5MTI0OUU2NiAweDI2QkNENEQ3MzY0RjdCRTQyN0M4ODgyREUwM0ZGMTlEOUFEM0ZFQzgxNDUxQTJFNjJBQjdFOTUwMjI0ODM3N0UpKDB4MzBBNEIzNTNFRUJBNERGOTk1RUMxMUU3MjdCOTFDMjlBMkQ5QzZEMjY1RTNFRjlBQzRCQzYxMjhCNTE1MDIyOCAweDBEQUIxRkZFODA4NTA2NTU1MkY3OTAyNjE1RDA3MEQyMUM3MUU5NDNGQjc2Qjg3NzRBRDMzN0MzRUY5MEQ4NjkpKDB4MDNBMjg0MjQwRTRBRjNCNDlEMTYwNDk1NUE4QTM4MzdCMEU4NjMyQzI2MDMzQjhFMjZDOTkxMTk3QjgzRDMxRCAweDA5MzVCNkI2NUEyRTVBRTIyMDNFOTkxODA1OEFEMjRGMTA3MzI3RUU4MzlCRkFBQThBQkUzM0JCQjA5Njg1MzIpKDB4MEZFODM0M0ZERTFGNUZFMEVDRTNEMTc5MTE5MTAzN0YyNEFCMUFBMUEyNkJERkRGQ0E2MDU5Q0NGNzJERUFEQSAweDBFMjBDNzUwQTREMDAzMzEyOTc0ODg5ODhENEYxOUMzRjJCNUM3RTg0OEVFMkZCMkQzODE2Mjk4NjVCNDMzQjYpKDB4MDEzM0MzMDg3RjhFQTgzRjk3QkFDMEZFQkIzOEVGQjhGMkFFRTk0QkU5MjA3QjEyRUFBRDc1NDBCQjk3RTc5NyAweDFERkE5REZGNUVGMUMzRDAxOUEzRjk0M0I5MzJCMEE5Q0Y4NzhCOUJCMkRGNDI1REFFREIzNjI5Qjg5QTQxRDMpKDB4M0JEOEEyOERDMzQyOEE3MTdFQzRGMDNGQURBMkZDMzcyRTk2MEVEQThBNkY3NzU3OEUwMEU3MUM4M0I1RjU1MyAweDA3OTUxREQzNDdGMEVCQTBFNkRDMzIxNzQzMzAwQTBBRjIzOTJCMjY3ODAxNTg0NjMzMjIwODUyMTIyN0UwRjQpKDB4MjdEMDNFQThFQzU0MjgzQUQ5Q0EyRUM4RDQ5MDgyMTk3NzQ2RTk4RjJBMzY2MkVDQkNDOTdEODM0MDRFNzlFNCAweDIwREYzNDNFNERBRkExNzQyNDZBOEMxQTRBQjA5MkFBNEZCNkREQkI2OUNGODAwNDM3RjVEQkI3NEJDNEIxNUYpKDB4M0EzMjE5RTgzNDkzRThBM0E5QzRBNkY1NjBGQjg0M0NBOENCMEYzNDhFNDBBMTk1QzY4MEUxRjk2MjMwRjIyNSAweDIxOEYwN0E4Mjg1OUE1NjNFNUUzNUE1MkY0QjVFREQ5MDQyQUY3RjIwOTE4NUQ2OUI2OUYwN0E0N0E0MzY2OTcpKSkoel9jb21tKDB4MzlFRkMxMkQ1NDVBRDgwOTdBNTkwNTM4M0U5NzEyODhBRDdGQTdCNzM2MzMxNzY1NDY2REYyMEE5N0IzN0I0QiAweDNFRDY1NzE0OEJDMURBQTVCMTRENzk3M0FCNjdEQUU3QTVCMEEyODE3MUUxMEYzRTA0QTBBMEU3MzNGOTZFNEEpKSh0X2NvbW0oKDB4MTdCNDhDRUI2ODg5QTA3ODRGODA3M0YxNDREMEMxRUZBQzNCNjQ0MTc5NjZFOUU1MkU1QUJFRTM0MkU1NzMxMCAweDM1MzY1NTlFNkM5RkQ2OUNDQkRGQzlBMUEyRkE2NDI3NzUyNDNBMjJBQjNFRDFEMDlEMzgyMkQ2QzdCMTQyRkMpKDB4MUFFMTQwNTgyRDI2NkIwMUZFMzQ4RDdGM0NCMzJCQTZEMzgxQjREQzM1NEJFMjU1Rjc0OEEzNEVEMzhDRDdDMSAweDI5MjNGOTREQjkwOENEQTM2MUZEM0JFMkFEMjdEMzMyMEJCQjQ0Qjc5MkU1ODJGQjE2QzRBNjhBODBGRUY1MEIpKDB4MjBFMUNBNThDODk5OEE1NjE0RDhEQUMyMzNEQjE1Mzk3OTE1RjFEM0FDOENGOTY2MkU1OUJBNzdDNDcxODc3QiAweDEyQTgwOTY2MUZCMzg1RjUzRjQwQkVDRUEyQzM1RDZEOUY5Q0MyQzI4MzNEMzZCNUUzNkM2MkQ3NEE5MTBEMTgpKDB4MDE1RTA2QTU1RDMxMTU5Q0NCNzUxNjc4MDE1OUU0RkE0RDE1RDBFOEE3N0NENDNGOTA1N0EyRTJFMzNFQzRBQyAweDIyM0M1M0Q1RkY0MkM1Mjg2RERCQTExNEE4RDdGNUYyNEU2NzQ3OTNBNDc0Q0UxQ0YzQzQ4ODdFMUNENzEyNzQpKDB4MzYxMDVDNUIyN0EwNzE1QTk4MjY2ODE5NTY0QjdCNTM5OTY4QjEzNjhCQkQ3NEIxRkI3QkZCNkEzQUM0MDg4RCAweDFEODczMTdERTg0QzRGNDY1MzQ5NzNCQzk2RTkwNjZBQ0VEQzY3RkMwMzY4QThGOTQxMkI1Qzc1QzYzQjg5MTEpKDB4MjI5NEQ5M0Q3REU2RDE2NTAxNkU2MDQ1MzQ5NEExNTA4N0M2NzVERDVDREE5Nzc2MTVEQTZFMkI4RTY0QTQxMiAweDNBNzYwRjVFMzFFOTlFOUJEN0E3MzQyMUIyNTM5ODM4QTlGMkIwRkE2QjUyMUU3QkQ0MjhGMkE3OTZBMkEwMzYpKDB4MkM5ODUzRDNFQzZFRUYyMzdBOTNFMjFBM0Y3NDM2OUQyOTlENDk1NkFFNUIyM0NCQjk3N0MyMEFBRTE0MjVBRiAweDJFMTVGQjg5MTRDMjNEODg3OUFBQUZBNTNBMEUzODZENUJENEQ4QzEyQjAyNzM1MjkzRjQyQkE4QkNDRkVCQjApKSkpKShldmFsdWF0aW9ucygodygoMHgyMDM1MThFOTk4NTQwREYyOThFRjUxMDNGMTUyNzY0N0E4RERERDNEQTMxRTlENUYwRDkxMUQ4OTZDOEVCMDBEIDB4MENBMkMzQkE1OTZDNjdCRjQwQjEzOUIzMUMzQjlGMDAxNDA2NUYwNjE5NTVGNTEyQkU0NTUxODU0QTU3NkJCMykoMHgxRjJBNjdDMjNCMUQzMEQ0QzcyMDdCOUJFRDQ5RkJFN0ZFMkU0NTAwODVEMTc1N0QxREE1QTRBRDUxMEIxMURDIDB4MzI5QUYyNThBRkExNjJERjFGNjU5RjU3Q0Q1NjFEMzQzRDcxNEU1RDUzOEQ4RDFCMzMwRkVEOEU2NDU0RDg0OCkoMHgxQjg0N0UzQ0JCOUM3NTFDOEMwNzAxNEI1QjI0NDJDNTlBMjg4MDQ3NzlFNjQyMzk1MDhCMUIzMDA2Q0JEMjhFIDB4MjQwRkRENkE5NDU3RDY1QkYxMTI4QzNBOTI5NkI4RjExNDZENzIxMDY0ODQzMkEwQjNCMzdDRjVCRjE0Mjk1RSkoMHgyQkI5REE5RDFBMEFCMzc5QURFRjA1QjA3QjcyQkZDMkI4QkNFQzE2QzVBMUZFNDYzNUQ2MzAzNUU1MDJGQjE2IDB4MkQ3NTFBQzg4NEY5MzJCNkI2QjEyNzUxNUIzNTMwOUJDM0I1RTg4MDQ0MkE5RTczMjdBQ0JEODExNTFCMjc4QikoMHgzRkRGNTI1ODM2NUE2QzlGOEI1NURBNUMwOTgzQkI2NUE2NjhGQkJGM0RFMDE4RTJDMkVGNzI0OTQ5NDZBREZCIDB4M0YxMEMyNkJDOEJCQUE2M0RGRTBGODlCOTFDQjA0MDcwRDcwOTQwQUU2QjRFOUNENzNEMDZENjc2RUYzNTNEQykoMHgxQzI1MDAyQTYwNEU0MTkxQUJBNEU4NjBGRTkzRkM1Njc1ODdENDg0OUFGOUIyQkJFMjFFRjMyQTQ5NTM1MkFDIDB4MjY1RTEwMkI1QzM0NjM2NDI2NDM4MThCMDhBM0VDQkUxM0VBRUM0Q0RCREMzMjA5MUNCRUI5QUY5N0YxRDFGNikoMHgzM0I5NzQ4RkMxOTdERkE2NzYzQzU5NkMzQjRERUE3QURDNkQzOEJGOEUxOTExNDkwQzcyNzBFMEUyQkJCMjM0IDB4MDY0OTRGNkVFNjFCOTRFNDJEODE4NzIzMjYxQTdCMURCRUQ5OEY5QkNGMkM5MTNEMzZEMTdFOTg5NURGMkNBQykoMHgwMjJFRTI2NzQ5NzdBRjgzRUFBNzI3OThBMDQ4NjAzRTlFMDYwNUM2MjAwMjY1Q0I2NTVFQTYyRUQ3QzA2OTdCIDB4MEVGQzAyRjlBQjE2QjU1MDMxQkIwNDhGRDJEMkExNzIwODhGQTVGNUQwNUYxQ0I4M0EyMjM2NzI1Q0ZGQzM3NSkoMHgyNDY2OTc2NUFBOEQ4N0I2QkQ0QzQ0QzgwMTFCNDhFMTVCMDNGNjcwQ0VFMDc2M0YzRjQ2QUJFN0U1RTcyOEREIDB4M0NDM0IwODdEQzA3ODE3NkQ3NjM2OTA2NTU2MTJCOTRENkNDM0ZENDA2QkI1MENCQkVFRDE1MDI0MEM2RDEwQSkoMHgxMTJGMTgzRkI4Q0Q1RkU4OEY2NkExMEYyNkU3NjJGNkY1RUUxRjBGM0ZDNDg4RjlFMThDQTJBRTlFM0I2QzZCIDB4MDg4NjlFQjc0NjAzRjREQ0E1QzRCODdBQzU0RjRCOTM5MkQxRkQwOUVDMDRFQzA2QTM1MkY1QUU1QzBDNzhCRikoMHgxMTM2MTcyM0I3MzM5QzdCMTQ3NjAxMTk3MjMyNTM0QzBGNUZGMDM4NEQ3N0IyNTBCNEJBNjUyMkE3OUMxMDcwIDB4MzY0MzYxODM3NDY1ODc3N0U1RTUzMjJFOEZEQTM3MjVGNjNFQUQyNTRCMTcwNjk5MTFEQTIwMEE4RTExRUFBQSkoMHgxNUUzQUNFRTJDRkU1QTBDQURFOUJEOTY2NzNDNzcxQzMyRDE5Q0UyRDYxNUQwRDNEMUI1M0U1QzQwMEM5QTFEIDB4MTJDQkVDREI1M0U1MjZERTVBQjg3NUFDQUU2RkRCMjNBN0NFODM5M0U3ODg4RDYzNjE1M0ZGNzMwREE4QkQ0QykoMHgxOTYyNjAyNTg0MzE3NDAzNTMwQzNENDNDMkE2QTA5NkU2NDA1OUNEMUE4NjFDMzEwQjI5MDJEODE4QjA1N0ZDIDB4MjAzRDFGNDg4OTQwM0Y4RDNBQUYzOEExNDI3RUYzQjA3QUNBNEY1RTEzRjNGMDc1N0MxODRGQzYyODk5RDFGQikoMHgzODIzMjI3NDMwNEVDN0M1QUI3QzBFQTVGNjdDMjRBMjk5Nzc5OTYxNUU5QUI5MjU2QzU1RDRBOTg2MjE1MjI5IDB4MDA2NzE1REY1RDcxQTIyRTg3RjYxREE2NEREOEFBRjRGNDE3NTZGNjYxQTA3QzgxMTM3MEQyMjg4RkMyQ0VBRCkoMHgwRUUxRkU4NzMzMTA2ODg2NzAwRjQ4MEQ1M0UwNUVGMzI1NUU4RDAyNDlFMTdCQkY5QTRBRDVGNDJEMjNEMTk5IDB4MTQ1NUYyNTgxRDYzQTc1MTlGQzFGODE4NzcxMkM5OEJDNDM2OUQyOUUwRkU3QUFDMEM2MDA2OEJGM0ZCNjYxRSkpKShjb2VmZmljaWVudHMoKDB4MTQ0NkJERTcyRDlERDJBNjc5ODBGOTNGQTZERTFCODdCRDYwMzdFNjQ3QUYxNTVGNEIxRTVCNEI0NTk5ODU4MiAweDIyRjhBMTdDQ0Y2MUZFQTk5NERDRTRDRUE0OTAzODZCMEJEMzEyRjE4OTZDMUI3OUZDMzBBMzQ5MzhEODk5NUIpKDB4MDEwNTM0NzcwMkU0RENFM0E3MTVDQkQ2ODg0RTRGMjg4NjU1RTFBRkJBOTlGNkI3QUU4QzZENzZGOTQ5RTUwRCAweDBGMTczMjQ4MzNBQjdDNjRFRjgzQjg5MzBDMjFGNzM4NDg1NjQyRDc4MjEwRkY0OUEwRjcyQjZGRTU5NUJFMkIpKDB4MEIzMkFCNjAzRTQ0NTdFNzYzNUY5MzNFOTcyQkM4MTQ1M0M2QTNGMTNCOTA4QjZDMTMyNTA0NDQ3QzdDQjY1NSAweDIwMjU1OEUxNDNCQTZDNDI2QkI0NUVEQkZENTQzMjA5QTFGNEU4RkE1N0I5NzI0QjY3OEE2RkRGMDY0OUFCRjIpKDB4MTU0RTAxODAyMDAzMzY5NTJFMThFREU3NjgxQjc3NjFBMjU2QzJCMTk3RjlFMjE1OTExNjY2RUE3Q0ZENEM5RSAweDJFNjdGN0E5NTMwQzE1ODBGOTI4M0VFRDc4QkNCNThFRTczMDQ3NTBDQjVEMUE5RDY5OUY5Q0QzNzhFMzFBQTUpKDB4MUI2OUYyQTg2REU3NDNDOUZDQjM1MzhDNDFFQjY5Q0Q5RjAxQkUwQUM0RjFBRjQxRjQ3REJDRkI1RTUzQTQyRSAweDJGQjAyMERFRTRCQzgzNTUxRjI2OENDNzRDNjZBQTk5NUZBODlFMzM4QkEwNkE3Mzg0QTczNDQwM0NERjQ0MDYpKDB4M0E3Q0JGMkNFQkM3OTY3OEI5QzFEQTEzMzVFODA2NURBQ0E3QTlFNjNFMEUyMEE5OUYxRTcwOUMyNTk2OTE5MCAweDFBRDlCRkZBNTRDMTY3Q0REOUI0QTgxQ0MxNEZEQTQ3REJFQzBBMzk1OTRCNDNFRDE4RTczMkYwNzU4M0MzREIpKDB4MzhDOTA1NjYxQzVCOEI0QTExMTY4MzU5NTI4QTBCNEREMTBBREM0MURBNDc0NzkyRjM0QTA4NjQ4RTJDMzY2NSAweDA2NkE0OUYwODlGNEYwN0YxMzQ1NEU2NTU3N0Q0NEZBNEJBMkJDN0YwOTdBMzlGOUY1QzZGQzU4NDRBQUVCMjUpKDB4MTJFMjg1RTRBNjFGN0I5RUJDRTBGQzE4QzQzOTRGNzlENEY4NUZCQUM4NDMxQTkyNURGQkI4RUY4QUQ0MTBGRCAweDAyRjNCNDgxNDdDNjI2MEE2NDA0MTAyN0I4NTk3Q0I1RTA0RkQ2NzJGMUFDOTVCNEEwRkIzM0U2NDdCNkJGRTQpKDB4MjE3NzY2MjI4MEZCNEUxRkQwODk5QzFFNTdCMTlGMkIxM0RDQzIxNTI0NEQ0QjYyRjMyOEZDQ0UyNUVGOTM4NiAweDFGN0RFMjQ0REMwMEUzMTdDMjAxRUM0Mjg4RUFGRjBFNDM0MEIyQUM0Mjk4NkRDNUFGN0Q5M0FFRUI0QTQ0NzIpKDB4MEZENjRGMkIwRERGMEQ3RDQ4RjhGM0FGMTgxREYyRERDMDVDMDA1MDYxMTk2NzA2RTJFQ0M4NThCRjE0NUEwRiAweDAxQ0U1QjkzQjc2MUQ4NEY5MjBERjc0RTA2NjhGQTYwNTVDOTRDOUFEQzU5MkZBQjlCRjI3QzhGMEI3ODc5NUEpKDB4MzBCN0NGQzlDNzQ4NDQ1Q0NFQzZBQjdCN0QyOTk4MUE2Q0IzOUIwODA2RTUwQjEzNDA4NDJGNzJBM0VFN0JEQyAweDM5NTVCODg2Q0IwMUI1MTIwM0Q1QTI2MzM3QjkyNUM0MkQ0RkE0RTc2MzdCRTRGMkI5MEE3NDk0NUM5RDRDNTEpKDB4MENDRjhGNjk0RUI5QTVCNkUyOTQyNjJBMDY0ODQ1NjRBMkQ0RkZEQTdGOTIwMUJERTY1Q0RGOTI5RjlERkMwRCAweDMxMENDNTc0NDFGMDFDNTlCRkNEOEUxQzlCMkJFNjNFMzQ5QTdCRjg2NUE4MTUxNjlCQzQyMDM2QzU0NTE5NkUpKDB4MjExM0Q1OUU5OUI2OUI5QkQ4MThEMjgxOTg4ODM1MkZCMTg5MTJCNkUyMDhFQjk3MjA0OEFCRDFEODEyMENGOCAweDM4QThERjgzOUVDN0ZERjE1QzNBRTRCRUM5M0U1QzIyQjAxQjQxRDg5QUVEMUREQjQ3RDI5QTA1RUM5RTEyM0EpKDB4MjVCQkVFQTc5MkM0MzRDMUE4MzhBQ0M2RUY2QjMxQkM3RDJGNUJGQ0M4NDNDOEZGRTBFOTE3NzUzMTc5NTE5MyAweDI3ODMzNEFGREIxRTM5NjJENTYyQ0MyMEU1RDE4OUI3MDBEQzdCMzQ2MDQyODhFMDZCOTA3REU5MjkxRDU0ODkpKDB4MTEyMDBBOEJENkMyMDkwNjRDMjU2ODJGOUVBRDgwMjZGMUZBNzE1MjlGMDg4NTVGRjNDQkVGMkM3NzZBRjYyNSAweDNBNERENjRBRTYxRjAwMTUxMDg3NTE3RTM5Q0EzRkZEQzgxNEI3RDlCMjQ1MEIxMTdFQjlFNzZBM0Y0Q0E3RkUpKSkoeigweDJENDUyQTQwNzM0QzQxRDY3MzdDQ0UzM0VGRkUxREU2NjE2NUUwMjgyREQ0QjIxMUM4QkRDRTdFNjU0NDBGNzcgMHgwREU1RjkwNEUzNTg0QjE3NzlFRjhCQUNBNjg4MkZGMDE2MEVENkQ3NDhGNUMyQ0U1QTgwNjI4QTlFRkJFOUEwKSkocygoMHgwMkNCQTVERkU0RUY3NTg3QUYwQ0IwOEI4OEU3Q0NCOEQxQ0NDRkZFRENBNjc3OERGNDhBQkU4QTNDNzYwQzZBIDB4M0ZDMzhCODJEODJBM0NGRjM3MzhCNTI4QkVFMDZGNzg3RTEzRUQxRDUxMDIyOEY2QzdFMUE3QTE5Rjk4Q0ZERSkoMHgzRDAxNTdBQUI1MTRBMUVDNzE4N0VCQTE2OEJDNzVGQTZENUYwQjA4QkU4OEQ2NkMzRDBDMEVFNjdFRDU5REU2IDB4MjU3ODA1QThENDdDQTUwNDU0NkI5OTBDRTgyNUYzRTlBOTZBNzIyNkI1RUM0OTAwMTJBNDZDNUI3NzdEMUY3OCkoMHgwRDk4RTcwODE0MkM4MUYzRjA5RDAxQjhDMjVGQTZGMTI5MzY0ODczMEQ4MUVBMUI4MUVGQkY0QzE2N0FCQ0M2IDB4MTgzQzREQTZFMDc1ODg4RDVEMEIzNDM0MzE5QUVFMzA2MUE1NUJDOUJDQTlGOTNDNTNGRTQ1NzhDQkRDMEVFQykoMHgxMTM4RkUwNzEwQjE4Q0RFQTVDMjUxOTg4QkI1Rjg4REVFQzM5RTdDOUM4MzcwRTEyQTg0NjBCRDg3ODYyOTVGIDB4MDEzRjMzQzIxMUMxMUI1NkMxMTM4MENEQTY5QTNCRjUwNzM5MENFNjFBNTFFNTI5Nzc0Qzg3RTRDQTg2QzVBQSkoMHgyMjRENDM3MDc4ODdGMUM0ODhFMTU3QUI5Q0ZFMzdERENFQkJGRDYzMkQ1RDAwMkY0NkM4MjREMDcyM0MxRDE4IDB4MTA5NTE5NjcyRkNGNzZFRTc5MDQ0MTMxOTNERDNBM0RFMUU0MTFFNDg4RUFGMjc3MjYyQzgyNjhCQzExOEU2OCkoMHgyMTk4NkY4RUI5REYxMzI3QzdDN0M1RDQyMjBBNkJFQjAzQzgwQzY3REVCRUU1OTFEQjA4RDJDMEFDOTQ5MzEwIDB4Mzk1MDM3MjQ4MzI4NThEOUE2Q0M5OTRENTFERkM4MEVGNzJDMkZDM0FDRTA5QzVGNEJEQTZEQUVFRDlBNTZGRikpKShnZW5lcmljX3NlbGVjdG9yKDB4MDQzRjZBQjIxMTYyRDU0ODUzOUIwMzEzREY4NUY3MkE1RUM5MUNFQzdCODZFRjU5ODVGMDQ5RDI1QTAxOUJBMyAweDI0MjcxQjQ0M0RCMUJDODg5QUM3RUMxMTM3MUQwMERGMjM0NDFCRTI5MzJFQjVENDE5ODMyOEZGN0M3RDFEQTApKShwb3NlaWRvbl9zZWxlY3RvcigweDMwRkJCMUFDMjE3REQ2REVEMTNBN0U4RTdEMEJFNEM0QTQ3RENDNDE5QjhENjE3REU4MTdDRUExOTE3QjkyQkUgMHgxRkUyNzBGQUREQkQ2ODA4REYzODkzM0M1MUUxMDE0QjQ1QzA4NENENzI5MzgzMjA5RUE0RDEyMzFFQTNCRDYxKSkoY29tcGxldGVfYWRkX3NlbGVjdG9yKDB4M0VCRDU5NURFMTFDOTZCRUE5QTY0MTc0QTRERUJCQTREMDYwNEMyRjZEQUUzOTgwOTdEQzk2QkU2RDhBN0ZGMSAweDI4MTE3RDk0REM4NzA4QUZDMEJENEJCMjJBNDI1OTU2NTgxM0U2NkJCQTlENzFERDUwOTEzRDE3RERFRjUwM0MpKShtdWxfc2VsZWN0b3IoMHgzRjkzREE0MEM0RUE1NDg1ODI4MkFBREMxNDlFM0E2RjVEQzE5NDM0NjlFNjk0QzRERDQ5NDNFN0YyQ0IxNkU3IDB4MjM4MDMxREI2NzI0NDRCQkE5REQwMjcxNENCRTFCMjFBREQwNjhGQ0I5MzQ4NEFCRkQ1REY1RTdBRjlBRkFBMikpKGVtdWxfc2VsZWN0b3IoMHgwQzE0QkQ2RUZBOUMzQjZCRjFBOUIzRjk3Q0M1RkI0MDlCOTg0RDJCNzlFNTQ4NjM5OUIyNTk5NURGMjFEOTQ0IDB4MkRGMjk4NkNFNjU2M0NGRTY3MTk5NkY5ODA1NUJEMjZGRDJBNDU5NDIxRDM5OTNGNzg4NTczMTdCRUYyODQ2MCkpKGVuZG9tdWxfc2NhbGFyX3NlbGVjdG9yKDB4MUUzQTg5OEQxREVEQkJBNzJFNENDODZCRjA2QzI0MDdDQ0UyMkM5NDg0QUJGRTFCRTcxRURCMTQ2NUM5MUUyRiAweDIxM0RFMTQ2NThBOUYxNjg0NUQ2OTcyNTlCNDJEN0EzOUUxN0Q4MDE4QTkwQzdGRjc2NDE0N0U3NTc1QUMwOTMpKSkpKGZ0X2V2YWwxIDB4M0JGMjdDMEJGRTU0MTI5NEM1NjNCQjQ1QUY4M0FDRjYyOTZEQkQ2RDFCMjBGMjkzRjk5NTY0Rjk3RkFGNDU4OCkoYnVsbGV0cHJvb2YoKGxyKCgoMHgzQzA0NzY3NjdBQjJBRTBFMDczQUQ4Q0I2RkY3NUY3MEFBMTVDODU1MDNDMkMwRjEyOTlCQzg0QTIxNkY3MUVEIDB4MTVFMjM5NzhBRjIyQzg1OEQwMjdBQkI2N0ZBMDJEQTFFMTM2N0I5MzgzQTg3MjU3NzQ0ODBDNTk5NTVDNzA2RCkoMHgxNTI1OEJBQTczREUzQ0FDODU4NzkxRDNBMkRCODM1OTU1NTMwRUEzOEFGMTdFNjVGMzJGOEIyM0IwQ0QyNjlFIDB4MTA0RDY4REZDMzhEMTQxRUYzMzYwRTA5QTJGNDAxNDFENDI3RTlFNDkxQzNBMTdCNDRFMTFFNTYxNEQyMkNCOSkpKCgweDBFNzIwRUE1MkI3NTY0RkZCMTU5QzQ3NkFEODM3MTc5ODU4MkEzNzM2ODIzMzFENzMzQzA4QjhDNTc2QjRGQTQgMHgzRDBDMUYyRTJFQUY5REQ4NTg3NkE0REM5ODZFMjVBMkI0NzZEQUNCOThCNTkyQzdBMDQ1N0ZGNzkyN0ZBRUVGKSgweDI3QjAxQjdCQjlCRUU5RTdBMEUxMTE3OTI3QzI4OUEzMjdGNkM1MDQwQkI5RkI4MUU2NEQzQ0Y4OTlBODk3QjIgMHgwMEIzNTZDRDY4MjFGQzU1OUQ0MTNDMzA1MjkyODE1RUMyNjE0NTk1M0MxRUUzMzgxQzNERDE5NDAyNkJGRjExKSkoKDB4MkQzOUQwNjU4NTk4REQxMTc4NjE3OEEzQzhGNThDREJFRUY0RDZFMjMzQzYxNjk5MDJEQTRGOEUxM0UzM0ZFNSAweDJCMzc1NTRBMjVCRDIyMEE0M0MwM0M2NEJFQTUzMzkxMkQyNTNFRDc0OUIxOEY1NTAyQzZEQ0Y3QkRDOEUzQjQpKDB4MUNDRTM3NTlFOEJCNThBMEFCMTExRjdBQzgwNkNCODQ3OUNFRUY4MjgzOTc3NUJCQTEyQjc5NURGMUMxQURDMSAweDA4QjRERjcyRjk1RjI3QUFDN0Q3MjRFRTI4MEE0QTM5NDA5MzRFMjc1RjdFOEI1NTI3Q0ZDQUJBMDcyNUVBNzQpKSgoMHgyMDE3MURBMkE1OTgxOUJBOUNFRjQzNkIwQTI5OTFEMjhGOUZGRjQyQkJCNDVGMUMxMDk1OEM2RTRDMkJEQkY1IDB4MDAwNDRDNzNDMTI4QTI2QzNFMTJDNjNDMTFGQzI5QUExRUM5MzgwQURBNDEzQ0RENDAyQjZCQzY0RkQ4RTUwRSkoMHgyRDNEOEQ1MEJGRjU2Qzg0MjkxNkU3OEQ3Q0I1RkY2NTY0NUJGN0VGRkUyQUVGQ0E4NEIzNDYyQjQwOTgwQUM0IDB4MDMwN0RGMEY1RDczMzM0OTk3OTdCQTJENkQ2MkI1NjI2NTA2M0RCMDBBOEIzMjAxMDRBNjE3NDRENjM2QUE1MSkpKCgweDI1REM3QjQxQ0ExM0JCNjlDNzZBNTEwNzFBRkE5REI0RTc2Njc1MUJGMUVGMDA2QTZDN0FCQzNCMzU2ODI2REEgMHgxMzEwMDc1QjI3N0M4MkQwMUM0QzdGQkJCNjg3REM4NkVFRUQ3NTA5MzU0QjFDQjdFNEREMTI1RTZBOTcyM0MxKSgweDM4NkNBNzk5REIyRTYyRTg4MjVENDFDQzA3OTREQ0I1MTBENjYwMDU0M0IzMEQxRjJDQ0IxN0ZCQUQwNzVDNEYgMHgxMzZCNTgzODg0ODJENUQ0QUMxRDU3NTJEODUwRjNEOEM0RTg3REI0QkVCQ0M2RDc1OEI3MERBNjkwRjBBNUNDKSkoKDB4MTRDOTg2NTlBM0Q2MjVDN0U3RkI1RDVENzAwQ0MyQzE4MzFCRERCMTA3RDMyQ0M4MjJGMDExMjU2NkZDRjAxOCAweDM0NEI0QTRCMTZBNkRCQzA3MTE1MjM2Q0E0MjVDNjlCMzk3RDRERDVGRjQ5MUYyMjVCMTU5RTVFQzYwODgzM0IpKDB4MzAwQTJCNUIwOTlCM0QxMjA2QkNENEM0MkE4RDg1MjIyQTc1MDc2QzczM0Q4RDI5NTlCMkY1MUI0REJGOTVEOSAweDI2NDQyOTAzMTE2QzlERjI5RjRDM0YxNkE0OUJFM0UyODMyNkY2MEREODQzMDAyQkQ0RTExMzAwOTA5QjBCMEYpKSgoMHgyQkNGRDFEQzg3MDhCRTU3QzIwNTQ1NjVBRUZCRDc2QzMwRjdGRDdDNkQxRjJBN0JCRDY2Mjc4ODJDN0Q2RUQ5IDB4MTlEMzgyNzM5OTA4MUQ2RjQ4QTQ1N0M1MzVGQTQ1RTdGNjA3RjE4RTdDMTA0NEFFNDYwQThBQjRFNDM3MUMyMikoMHgxMDA1NDYwODQ2OEY4MkIxREQ3REM4MDBFNkNBNUI1MUZGMjZFM0U2RkU2OEI4Q0I5OUM1NTA0RTUzQUE2OTVBIDB4MUQ4NzE3MjczNzdEODE4MzM2Qjc1RkM3OTM5MDczMDc2QzI1REFGRjI0QTA4MzdDOEExMUY3NTY5RENBRjNEOSkpKCgweDJEOTg1N0QyMEQ5QTQ0NDUyRTRFNUNGQjkyRDZBMjJFRDMxQzU5MkM3RjkxNTNERDU4REI5MjI0NzYwOUI2QzIgMHgzQkZCNEVDRjVCNDY4RkFBNTAxREI2MzlDNkJGMTU3QzdGMEY4MERFMzcyMzI0QzI0NzBDMTdGNUZBMDc4OThCKSgweDJDRjgzNzUzQTlGQzJDNzZCMjAyMTgwRDM3MzE0OTRDMEE4RTk1MTI0MjdGMzlFMkU5OEJDN0VENzFGRkFCNjggMHgyRDQyODM4QzgzQzU4RDU0NDU2QzM5NjU1QzI0QzQxMzA3RTk4NDBCM0M3NjBGMTc5NTU2MjBCQjc3MEIxNkNBKSkoKDB4MEIzQzRGRjVEODYzMTYxQkI1MTgxRkU3QkI1QjEyMjJCOTZCNTkwODAxRjk2NTE4OUJDQjBBNEI3OUNFQjc5MiAweDM3MUQyNzdENzhBNUZGNjY1NTk2OEMzNUREMDExNDcxQjMzODNCODVFNzkwMjY4NEM3ODYzMUE3ODM4RTQ1QjIpKDB4MUIyQTVERTg2OTlCNkFBMkY5QTYyRURCMjNGMUMyMDcyRDNCQ0MwNDJENTY0QzA1QjM3NjM3RUNCNzJGNTlEMyAweDI2RDhEMTA5QTc2RUVDQ0EwQTFGMDQ3QkQ1N0I0NUE4NDMyNzg5RTU5RkU1RDM3RDVFMUM1OTIxNDU1NTdCREMpKSgoMHgyNDQ1M0Y0ODJGRURDRkYyRkNGNDY5OEQyRDM3RjkyNUQ0NEFFNzAzOUMwN0ZFNzFBNTMxQzg2QUU0REFERTNGIDB4MUY2OERDQUI3QTQ5RDVGOERBNTQwQUExQ0I1ODlEQTFDRTVBMjc0RDE4RDU1QjJFMjcxREEzQjYzODBGRDJERCkoMHgwMThDMEM0MEVCMkZDNTFFNjM2QTM4NDMwQUExN0U3NTk0OEQwQjU3ODY5OEY1NkIyOUExRTBEMkIzMTIyRkU2IDB4MTVFMEQzOUZCMUMxMEUwQ0E2NUQ4Qzg1QTEyMTQ1ODZFRDY2MTgxNzA4QkJEODJENzMxQzJGQzMwREIzOTgzRCkpKCgweDAxM0VBMzQ5NDAzMkJDNjY3MUQ2RDZDQUNBOTk4MzM2ODIxODlCQjA1QTc0MkZERUU1MTNDRTc2MkE4QzhDRjAgMHgwMTkyODA1NzlFOUVDOTYzRTIwRDM1NjA4MTQyMEQzNjlBQUNCRUEyNzlCQzkwRDcxOEMyM0EyNTQwMDhCNEM1KSgweDA2NTRGOTI3NDRCNzQwQjg2MUJDMTZGMTMzODc4OEI5N0Q3QkEwNUNEQ0QwREU5MzQxOTdCODJCQjk3NDI1NjQgMHgyMjczOTM2ODZDOEQxNjUwQTE4M0MwNDgzNDg5MTQ3QjU1MThFQTQ3NzMwQjAxQTMwNDFBOEY4RDZERjQ2QzIyKSkoKDB4M0RCMUY1ODExQjgxMzA3QTE3MTlEQjI1QTczNEI1MTdDMUM5QjNBRUUwMjcxQ0I2NDBFQjA0M0I0NkM3QkY3MCAweDI5MjA3NTYzMUQ4NThCMzZGRTQ5NDY3NzkxMDg2NkJFMDhGMTI5RDVFMkM0MTI3RjQ1MkJBNjcyMTBGNzE1NDIpKDB4MkVDQ0NDNzQzMTY0QjA4QTQ3NzA3NUI5NTU1Nzg0N0U2M0MwRUE2RTdDRENDNDU5QUE4MDk3RTgzQ0ZGQzlENyAweDMwNjg5M0U2MEE4NkM4NEZBMTkwRkZGQ0IyNTc2OUEyOEJEMjBBMTU0MjQyN0Y4RDJGOTkzNzI2NjVFQUUxNUYpKSgoMHgzRUM0ODJBMEFGMzJFQTgwOUJFQzc2QTY5NEE4QUM3MzYyNjlFNTRCNzNCRTZCNTE2ODkzRDhGQzg5MkQ3REU3IDB4MTNGQjgxRDRCRUY5OUMwOTM1RDI3RDE0QTE2RkU2QjhGRTUwNUI2NDA2QTZFN0ZFOEZDNzhDQjVBQkMzMDc0MikoMHgyQUVFMzYwNzRGQjM0RjM3NEIyQ0JEMTk0NTA0REUwOUM3RUE1RkU0NTJGNkZDRjU1Q0YzNkExM0FEOTVBQ0E2IDB4M0U5RDU2QkEyNTNGRjBEQjQwMzdGMzA0NjYyNTQ5NEY5OTQwQzI3NUI3NzMyREI1Q0Q3OEM3REU2OUQ3RTMzRikpKCgweDAyODA2ODNBOUYxODFDODRBRDRBNUE3MDU5RUEzODVEQ0VCNDM0OTFEMTM0RTM2OEEzRTQ5ODVGRkUyODg2OTQgMHgzNjAyMzg4OTk3MzcxNDAwMzU3QzA2M0Q4QTYzNURFQ0MxNDEyMTc2ODdCREJDQUQxMDZEMkJBN0M2ODEyNDFFKSgweDNEOTIxODZGMTAzQTczMjdDQTYwOEM4REQxQ0IyOThBNkRFNTg3NUZCMUE2NEExNEU1RDg3NjcyMDRCQzdBN0IgMHgxNDUwNjIxQkFGOEJDNTBGQjdCQjM5QkU2NzRBRTcwREMwMjhDMEFDOTQ3NzcwRUI1Rjc2REVFMkVFQzdBNzlCKSkoKDB4MDdEM0UwRTJBMDEwRjBFMDcxRkZBOUEzQTk2RTdENjc0ODc4RTU0RTkxNTQzQ0E2NTg4MThGQ0U2NTU4RjMxMyAweDE0QjYwREY4NTNCQUIwQ0FBQTU5NEQyNEY0N0UyNjAyRUZBMjA3REUxMTVDRjczQzYwN0E5RkZDMDFEODM0QjQpKDB4MUI1RUJCNUFEMjQ3ODM1OTYxQkNDNTM0MzA1QjAyNTZFMjkwM0E3MDA2NkVGQ0E5NTY3MkMzM0JERURCMkJEOSAweDJGRjMyQ0M0MzAxMjQyQzIwMDBBMkJDMjNERTFCMEVGMTM2RTUwM0M5QTdCMTk5MEVFMjMzOUU0RENERTc1M0QpKSkpKHpfMSAweDFCMUQwOThDQzQxODA1NDZDQzk3ODkwRkE1RjBFMDhEQTMyQjJBODgyMkY5QTVFOTk5RDQzRkM5NERDNjE0ODcpKHpfMiAweDBCODQ5REVCQjJERDVFMzY2RDdEODc4OTA0MDE4QTQwMjgzMjczNUU1Nzg0OUI3NDBGOUM2ODIxRUI0RDlEMkYpKGRlbHRhKDB4MTJGRUY2RkI4Q0E3RUVBQTI3QjJEMEIyMjc2Q0M3QjgwRkUwMkYyMjdGMjUzMkE1N0E5RDVFNjRBOTU1NDlBQiAweDFGQzk4RDNBRkYxMzRDMTQxNjQ4M0QwNkM0MUM0NkQzRjk5OTMwQzhBMTRBRjQyMThBRTc1OUZEMkQ1MDZDRDkpKShjaGFsbGVuZ2VfcG9seW5vbWlhbF9jb21taXRtZW50KDB4MUUwRENDMzkxOUVCRDREMkVCMjFENjlCMzU0MjgwMUU1MDZDQ0Q1MjRFNEYxM0RDNTNCRUEwRjhGODAyQjY1QyAweDIzMTNBQkZCOTdCNUIwODdDRjk2MzEyRjBEMTRBQzQ1NUZDOUI0NzVBNTQzRkZFODQ3RTYwRTE1RTg4NzRFNTMpKSkpKSkp", + }, + }, + }, + credential: { + _type: "Struct", + properties: { + owner: { _type: "PublicKey" }, + data: { age: { _type: "Field" }, name: { _type: "Bytes", size: 32 } }, + }, + value: { + owner: "B62qrVPwPbeogxQKzPcV5dTSTmNo39g1T2hAM19cJ5Dtwk1p4STmKAE", + data: { + age: "18", + name: { + bytes: [ + { value: "65" }, + { value: "108" }, + { value: "105" }, + { value: "99" }, + { value: "101" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + { value: "0" }, + ], + }, + }, + }, + }, +}; + +export const samplePresentationRequestHttpsRecrusiveNoContextUpdated = { + presentationRequest: { + type: "no-context", + spec: { + inputs: { + provedData: { + type: "credential", + credentialType: "recursive", + witness: { + type: { _type: "Constant", value: "recursive" }, + vk: { _type: "VerificationKey" }, + proof: { + _type: "Proof", + proof: { + name: "InputProof", + publicInput: { + _type: "Struct", + properties: { + context: { _type: "Field" }, + claims: { + inputOwner: { _type: "PublicKey" }, + data: { + age: { _type: "Field" }, + name: { _type: "Bytes", size: 32 }, + }, + }, + }, + }, + publicOutput: { + _type: "Struct", + properties: { + owner: { _type: "PublicKey" }, + data: { + age: { _type: "Field" }, + name: { _type: "Bytes", size: 32 }, + }, + }, + }, + maxProofsVerified: 0, + featureFlags: { + rangeCheck0: false, + rangeCheck1: false, + foreignFieldAdd: false, + foreignFieldMul: false, + xor: false, + rot: false, + lookup: false, + runtimeTables: false, + }, + }, + }, + }, + data: { + _type: "Struct", + properties: { + age: { _type: "Field" }, + name: { _type: "Bytes", size: 32 }, + }, + }, + }, + targetAge: { type: "claim", data: { _type: "Field" } }, + targetName: { + type: "constant", + data: { _type: "Bytes", size: 32 }, + value: + "416c696365000000000000000000000000000000000000000000000000000000", + }, + }, + logic: { + assert: { + type: "and", + inputs: [ + { + type: "equals", + left: { + type: "property", + key: "age", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "provedData", + inner: { type: "root" }, + }, + }, + }, + right: { + type: "property", + key: "targetAge", + inner: { type: "root" }, + }, + }, + { + type: "equals", + left: { + type: "property", + key: "name", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "provedData", + inner: { type: "root" }, + }, + }, + }, + right: { + type: "property", + key: "targetName", + inner: { type: "root" }, + }, + }, + ], + }, + outputClaim: { + type: "property", + key: "age", + inner: { + type: "property", + key: "data", + inner: { + type: "property", + key: "provedData", + inner: { type: "root" }, + }, + }, + }, + }, + }, + claims: { targetAge: { _type: "Field", value: "18" } }, + inputContext: null, + }, +}; diff --git a/apps/docs/src/components/test-zkapp.tsx b/apps/docs/src/components/test-zkapp.tsx index d8bedaf..bc63055 100644 --- a/apps/docs/src/components/test-zkapp.tsx +++ b/apps/docs/src/components/test-zkapp.tsx @@ -2,37 +2,16 @@ import { createStore } from "@mina-js/connect"; import { useLocalStorage, useObjectState } from "@uidotdev/usehooks"; import { clsx } from "clsx"; import { useState, useSyncExternalStore } from "react"; +import { + sampleCredentialRecursiveUpdated, + samplePresentationRequestHttpsFromExampleUpdated, +} from "./sample-data"; const store = createStore(); -const sampleCredential = { - version: "v0", - witness: { - type: "simple", - issuer: { - _type: "PublicKey", - value: "B62qqMxueXzenrchT5CKC5eCSmfcbHic9wJd9GEdHVcd9uCWrjPJjHS", - }, - issuerSignature: { - _type: "Signature", - value: { - r: "27355434072539307953235904941558417174103383443074165997458891331674091021280", - s: "22156398191479529717864137276005168653180340733374387165875910835098679659803", - }, - }, - }, - credential: { - owner: { - _type: "PublicKey", - value: "B62qqCMx9YvvjhMFVcRXBqHtAbjWWUhyA9HmgpYCehLHTGKgXsxiZpz", - }, - data: { - age: { - _type: "Field", - value: "25", - }, - }, - }, +const sampleSignFieldsWithPassphrase = { + fields: ["1", "2", "3"], + passphrase: "1234", }; export const TestZkApp = () => { @@ -42,8 +21,17 @@ export const TestZkApp = () => { ); const [message, setMessage] = useState("A message to sign"); const [fields, setFields] = useState('["1", "2", "3"]'); + const [signFieldsWithPassphraseInput, setSignFieldsWithPassphraseInput] = + useState(JSON.stringify(sampleSignFieldsWithPassphrase, null, 2)); const [credentialInput, setCredentialInput] = useState( - JSON.stringify(sampleCredential, null, 2), + JSON.stringify(sampleCredentialRecursiveUpdated, null, 2), + ); + const [presentationRequest, setPresentationRequest] = useState( + JSON.stringify( + samplePresentationRequestHttpsFromExampleUpdated, + null, + 2, + ), ); const [transactionBody, setTransactionBody] = useObjectState({ to: "B62qnVUL6A53E4ZaGd3qbTr6RCtEZYTu3kTijVrrquNpPo4d3MuJ3nb", @@ -58,9 +46,11 @@ export const TestZkApp = () => { mina_getBalance: "", mina_sign: "", mina_signFields: "", + mina_signFieldsWithPassphrase: "", mina_signTransaction: "", mina_switchChain: "", mina_storePrivateCredential: "", + mina_requestPresentation: "", }); const providers = useSyncExternalStore(store.subscribe, store.getProviders); const provider = providers.find( @@ -85,6 +75,24 @@ export const TestZkApp = () => { } }; + const requestPresentation = async () => { + if (!provider) return; + try { + const parsedRequest = JSON.parse(presentationRequest); + const { result } = await provider.request({ + method: "mina_requestPresentation", + params: [parsedRequest], + }); + setResults(() => ({ + mina_requestPresentation: result, + })); + } catch (error) { + setResults(() => ({ + mina_requestPresentation: `Error: ${error.message}`, + })); + } + }; + const fetchAccounts = async () => { if (!provider) return; const { result } = await provider.request({ @@ -132,6 +140,23 @@ export const TestZkApp = () => { mina_signFields: JSON.stringify(result, undefined, "\t"), })); }; + const signFieldsWithPassphrase = async () => { + if (!provider) return; + try { + const parsedInput = JSON.parse(signFieldsWithPassphraseInput); + const { result } = await provider.request({ + method: "mina_signFieldsWithPassphrase", + params: [parsedInput], + }); + setResults(() => ({ + mina_signFieldsWithPassphrase: JSON.stringify(result, null, 2), + })); + } catch (error) { + setResults(() => ({ + mina_signFieldsWithPassphrase: `Error: ${error.message}`, + })); + } + }; const createNullifier = async () => { if (!provider) return; const parsedFields = JSON.parse(fields); @@ -479,6 +504,66 @@ export const TestZkApp = () => { + + + Request Presentation + mina_requestPresentation + + + setPresentationRequest(event.target.value)} + className="textarea textarea-bordered h-48 font-mono text-sm" + placeholder="Enter presentation request JSON..." + /> + + Request Presentation + + + Result + + + + + + + Sign Fields With Passphrase + mina_signFieldsWithPassphrase + + + + setSignFieldsWithPassphraseInput(event.target.value) + } + className="textarea textarea-bordered h-48 font-mono text-sm" + placeholder="Enter fields and passphrase JSON..." + /> + + Sign Fields With Passphrase + + + Result + + + + ); }; diff --git a/bun.lockb b/bun.lockb index 9971bc8..f13a023 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 914dc8c..3852a60 100644 --- a/package.json +++ b/package.json @@ -20,5 +20,8 @@ "typescript": "5.5.4" }, "workspaces": ["packages/*", "apps/*"], - "packageManager": "bun@1.1.21" + "packageManager": "bun@1.1.21", + "resolutions": { + "zod": "3.23.8" + } } diff --git a/packages/providers/package.json b/packages/providers/package.json index e5c9f36..583b38d 100644 --- a/packages/providers/package.json +++ b/packages/providers/package.json @@ -16,6 +16,9 @@ "test": "bun test", "cleanup": "rimraf dist .turbo" }, + "dependencies": { + "mina-credentials": "0.2.6" + }, "devDependencies": { "@mina-js/utils": "workspace:*" }, diff --git a/packages/providers/src/validation.ts b/packages/providers/src/validation.ts index f7ce318..ca34e9b 100644 --- a/packages/providers/src/validation.ts +++ b/packages/providers/src/validation.ts @@ -1,5 +1,6 @@ import { FieldSchema, + FieldsAndPassphraseSchema, JsonSchema, NetworkId, NullifierSchema, @@ -7,14 +8,19 @@ import { SignedFieldsSchema, SignedMessageSchema, SignedTransactionSchema, - StoredCredentialSchema, TransactionPayloadSchema, TransactionReceiptSchema, TypedSendableSchema, ZkAppCommandPayload, + zkAppAccountSchema, } from "@mina-js/utils"; import { z } from "zod"; +import { + PresentationRequestSchema, + StoredCredentialSchema, +} from "mina-credentials/validation"; + export const SwitchChainRequestParams = z .object({ networkId: z.string(), @@ -58,6 +64,11 @@ export const SignFieldsRequestParamsSchema = RequestWithContext.extend({ method: z.literal("mina_signFields"), params: z.array(z.array(FieldSchema)), }).strict(); +export const signFieldsWithPassphraseRequestParamsSchema = + RequestWithContext.extend({ + method: z.literal("mina_signFieldsWithPassphrase"), + params: z.array(FieldsAndPassphraseSchema), + }); export const SignTransactionRequestParamsSchema = RequestWithContext.extend({ method: z.literal("mina_signTransaction"), params: z.array(z.union([TransactionPayloadSchema, ZkAppCommandPayload])), @@ -89,8 +100,21 @@ export const GetStateRequestParamsSchema = RequestWithContext.extend({ export const StorePrivateCredentialRequestParamsSchema = RequestWithContext.extend({ method: z.literal("mina_storePrivateCredential"), - params: z.array(StoredCredentialSchema), + // biome-ignore lint/suspicious/noExplicitAny: nested types from mina-credentials + params: z.array(StoredCredentialSchema as z.ZodType), }).strict(); +export const PresentationRequestParamsSchema = RequestWithContext.extend({ + method: z.literal("mina_requestPresentation"), + params: z.array( + z + .object({ + // biome-ignore lint/suspicious/noExplicitAny: nested types from mina-credentials + presentationRequest: PresentationRequestSchema as z.ZodType, + zkAppAccount: zkAppAccountSchema.optional(), + }) + .strict(), + ), +}).strict(); // Returns export const AccountsRequestReturnSchema = z @@ -135,6 +159,10 @@ export const SignFieldsRequestReturnSchema = z result: SignedFieldsSchema, }) .strict(); +export const signFieldsWithPassphraseRequestReturnSchema = z.object({ + method: z.literal("mina_signFieldsWithPassphrase"), + result: SignedFieldsSchema, +}); export const SignTransactionRequestReturnSchema = z .object({ method: z.literal("mina_signTransaction"), @@ -183,6 +211,12 @@ export const StorePrivateCredentialReturnSchema = z result: z.object({ success: z.boolean() }).strict(), }) .strict(); +export const PresentationRequestReturnSchema = z + .object({ + method: z.literal("mina_requestPresentation"), + result: z.object({ presentation: z.string() }).strict(), + }) + .strict(); export const RpcReturnTypesUnion = z.discriminatedUnion("method", [ AccountsRequestReturnSchema, @@ -200,6 +234,8 @@ export const RpcReturnTypesUnion = z.discriminatedUnion("method", [ SetStateRequestReturnSchema, GetStateRequestReturnSchema, StorePrivateCredentialReturnSchema, + PresentationRequestReturnSchema, + signFieldsWithPassphraseRequestReturnSchema, ]); export const ProviderRequestParamsUnion = z.discriminatedUnion("method", [ @@ -218,6 +254,8 @@ export const ProviderRequestParamsUnion = z.discriminatedUnion("method", [ SetStateRequestParamsSchema, GetStateRequestParamsSchema, StorePrivateCredentialRequestParamsSchema, + PresentationRequestParamsSchema, + signFieldsWithPassphraseRequestParamsSchema, ]); export type RpcReturnTypesUnionType = z.infer; export type ResultType = { diff --git a/packages/utils/src/types.ts b/packages/utils/src/types.ts index fc71c49..a6d537a 100644 --- a/packages/utils/src/types.ts +++ b/packages/utils/src/types.ts @@ -12,7 +12,6 @@ import type { SignedFieldsSchema, SignedMessageSchema, SignedTransactionSchema, - StoredCredentialSchema, TransactionBodySchema, TransactionOrZkAppCommandSchema, TransactionPayloadSchema, @@ -57,4 +56,3 @@ export type KlesiaRpcResponseType = z.infer; /** * Private Credential types */ -export type StoredPrivateCredential = z.infer; diff --git a/packages/utils/src/validation.ts b/packages/utils/src/validation.ts index 44d2188..b4ebf88 100644 --- a/packages/utils/src/validation.ts +++ b/packages/utils/src/validation.ts @@ -33,6 +33,8 @@ export const NetworkId = z.string().regex(networkPattern); export const KlesiaNetwork = z.enum(["devnet", "mainnet", "zeko_devnet"]); +export const MinaScanNetwork = z.enum(["devnet", "mainnet"]); + export const FeePayerSchema = z .object({ feePayer: PublicKeySchema, @@ -79,6 +81,12 @@ export const ZkAppCommandPayload = z }) .strict(); +export const FieldsAndPassphraseSchema = z + .object({ + fields: z.array(FieldSchema), + passphrase: z.string(), + }) + .strict(); export const TransactionOrZkAppCommandSchema = z.union([ TransactionPayloadSchema, ZkAppCommandPayload, @@ -246,202 +254,8 @@ export const KlesiaRpcResponseSchema = z.union([ ErrorSchema, ]); -// TODO: Should probably move these validations to a separate file - -interface ProofType { - name: string; - publicInput: SerializedType; - publicOutput: SerializedType; - maxProofsVerified: number; - featureFlags: Record; -} - -interface SerializedType { - _type?: string; - // TODO: update based on mina-credentials - type?: "Constant"; - value?: string; - size?: number; - proof?: ProofType; - innerType?: SerializedType; - [key: string]: SerializedType | string | number | ProofType | undefined; -} - -// Private Credentials: Serialized Type and Value Schemas - -const SerializedValueSchema = z - .object({ - _type: z.string(), - value: JsonSchema, - properties: z.record(z.any()).optional(), - }) - .strict(); - -const ProofTypeSchema: z.ZodType = z.lazy(() => - z - .object({ - name: z.string(), - publicInput: SerializedTypeSchema, - publicOutput: SerializedTypeSchema, - maxProofsVerified: z.number(), - featureFlags: z.record(z.any()), - }) - .strict(), -); - -const SerializedTypeSchema: z.ZodType = z.lazy(() => - z.union([ - // Basic type - z - .object({ - _type: z.string(), - }) - .strict(), - // Constant type - z - .object({ - type: z.literal("Constant"), - value: z.string(), - }) - .strict(), - // Bytes type - z - .object({ - _type: z.literal("Bytes"), - size: z.number(), - }) - .strict(), - // Proof type - z - .object({ - _type: z.literal("Proof"), - proof: ProofTypeSchema, - }) - .strict(), - // Array type - z - .object({ - _type: z.literal("Array"), - innerType: SerializedTypeSchema, - size: z.number(), - }) - .strict(), - // Allow records of nested types for Struct - z.record(SerializedTypeSchema), - ]), -); - -const SerializedFieldSchema = z - .object({ - _type: z.literal("Field"), - value: z.string(), - }) - .strict(); - -const SerializedPublicKeySchema = z - .object({ - _type: z.literal("PublicKey"), - value: z.string(), - }) - .strict(); - -const SerializedPublicKeyTypeSchema = z - .object({ - _type: z.literal("PublicKey"), - }) - .strict(); - -const SerializedSignatureSchema = z - .object({ - _type: z.literal("Signature"), - value: z.object({ - r: z.string(), - s: z.string(), - }), - }) - .strict(); - -// Private Credentials: Witness Schemas - -const SimpleWitnessSchema = z - .object({ - type: z.literal("simple"), - issuer: SerializedPublicKeySchema, - issuerSignature: SerializedSignatureSchema, - }) - .strict(); - -const RecursiveWitnessSchema = z - .object({ - type: z.literal("recursive"), - vk: z - .object({ - data: z.string(), - hash: SerializedFieldSchema, - }) - .strict(), - proof: z - .object({ - _type: z.literal("Proof"), - value: z - .object({ - publicInput: JsonSchema, - publicOutput: JsonSchema, - maxProofsVerified: z.number().min(0).max(2), - proof: z.string(), - }) - .strict(), - }) - .strict(), - }) - .strict(); - -const UnsignedWitnessSchema = z - .object({ - type: z.literal("unsigned"), - }) - .strict(); - -const WitnessSchema = z.discriminatedUnion("type", [ - SimpleWitnessSchema, - RecursiveWitnessSchema, - UnsignedWitnessSchema, -]); - -// Private Credentials: Credential Schemas - -const SimpleCredentialSchema = z - .object({ - owner: SerializedPublicKeySchema, - data: z.record(SerializedValueSchema), - }) - .strict(); - -const StructCredentialSchema = z - .object({ - _type: z.literal("Struct"), - properties: z - .object({ - owner: SerializedPublicKeyTypeSchema, - data: JsonSchema, - }) - .strict(), - value: z - .object({ - owner: PublicKeySchema, - data: JsonSchema, - }) - .strict(), - }) - .strict(); - -// Private Credentials: Stored Credential Schema - -export const StoredCredentialSchema = z - .object({ - version: z.literal("v0"), - witness: WitnessSchema, - metadata: JsonSchema.optional(), - credential: z.union([SimpleCredentialSchema, StructCredentialSchema]), - }) - .strict(); +export const zkAppAccountSchema = z.object({ + address: PublicKeySchema, + tokenId: z.string(), + network: MinaScanNetwork, +});
mina_requestPresentation
mina_signFieldsWithPassphrase