tx · AYr6etej1Uhd5noGisBoxk2Hyr98YQV1dykEVFcQRrZw

3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy:  -0.01000000 Waves

2021.12.09 11:33 [1826467] smart account 3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy > SELF 0.00000000 Waves

{ "type": 13, "id": "AYr6etej1Uhd5noGisBoxk2Hyr98YQV1dykEVFcQRrZw", "fee": 1000000, "feeAssetId": null, "timestamp": 1639038862356, "version": 1, "sender": "3Myn55vLkduxbX3ZXfiDCZhaQsLxYp1kmCy", "senderPublicKey": "9W33iCCNfmFxUbiC6XZcH5x7f6xfwC7Jb3BoExT5q2PV", "proofs": [ "4cTKkHdAzhySJSPH3P4zu9K5qGUmUsH7gmrSDfvZaWXDWZFaBdcQ49u49TaH9ZsTRweSthrL7xwJ1Hnx4yJZNyhs" ], "script": "base64:AAIFAAAAAAAAACwIAhIICgYICAEBAQgSAwoBARIDCgEBEgQKAggIEgQKAggIEgMKAQgSAwoBCAAAAFUAAAAAA1NFUAIAAAACX18AAAAABlNDQUxFOAAAAAAAAAAACAAAAAAFTVVMVDgAAAAAAAX14QAAAAAADlBPT0xXRUlHSFRNVUxUBQAAAAVNVUxUOAEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAICAAAAD21hbmRhdG9yeSB0aGlzLgUAAAADa2V5AgAAAA8gaXMgbm90IGRlZmluZWQBAAAADGdldEludE9yWmVybwAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AAAAAAAAAAAAAQAAAA9nZXRJbnRPckRlZmF1bHQAAAADAAAAB2FkZHJlc3MAAAADa2V5AAAACmRlZmF1bHRWYWwJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5BQAAAApkZWZhdWx0VmFsAQAAAAxnZXRJbnRPckZhaWwAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgIAAAAPbWFuZGF0b3J5IHRoaXMuBQAAAANrZXkCAAAADyBpcyBub3QgZGVmaW5lZAEAAAAJYXNBbnlMaXN0AAAAAQAAAAN2YWwEAAAAByRtYXRjaDAFAAAAA3ZhbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAJTGlzdFtBbnldBAAAAAp2YWxBbnlMeXN0BQAAAAckbWF0Y2gwBQAAAAp2YWxBbnlMeXN0CQAAAgAAAAECAAAAG2ZhaWwgdG8gY2FzdCBpbnRvIExpc3RbQW55XQEAAAAFYXNJbnQAAAABAAAAA3ZhbAQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAABnZhbEludAUAAAAHJG1hdGNoMAUAAAAGdmFsSW50CQAAAgAAAAECAAAAFWZhaWwgdG8gY2FzdCBpbnRvIEludAEAAAARa2V5RmFjdG9yeUFkZHJlc3MAAAAAAgAAABwlcyVzX19jb25maWdfX2ZhY3RvcnlBZGRyZXNzAAAAABhJZHhGYWN0b3J5Q2ZnU3Rha2luZ0RhcHAAAAAAAAAAAAEAAAAAGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHAAAAAAAAAAAAIAAAAAFElkeEZhY3RvcnlDZmdJZG9EYXBwAAAAAAAAAAADAAAAABVJZHhGYWN0b3J5Q2ZnVGVhbURhcHAAAAAAAAAAAAQAAAAAGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHAAAAAAAAAAAAUAAAAAFUlkeEZhY3RvcnlDZmdSZXN0RGFwcAAAAAAAAAAABgAAAAAZSWR4RmFjdG9yeUNmZ1NsaXBwYWdlRGFwcAAAAAAAAAAABwEAAAANa2V5RmFjdG9yeUNmZwAAAAACAAAAESVzX19mYWN0b3J5Q29uZmlnAQAAABprZXlGYWN0b3J5THAyQXNzZXRzTWFwcGluZwAAAAEAAAAKbHBBc3NldFN0cgkABLkAAAACCQAETAAAAAICAAAABiVzJXMlcwkABEwAAAACBQAAAApscEFzc2V0U3RyCQAETAAAAAICAAAAHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUAAAADbmlsBQAAAANTRVABAAAAEGtleUZhY3RvcnlMcExpc3QAAAAAAgAAABAlc19fbHBUb2tlbnNMaXN0AQAAACZrZXlGYWN0b3J5THBBc3NldFRvUG9vbENvbnRyYWN0QWRkcmVzcwAAAAEAAAAKbHBBc3NldFN0cgkABLkAAAACCQAETAAAAAICAAAABiVzJXMlcwkABEwAAAACBQAAAApscEFzc2V0U3RyCQAETAAAAAICAAAAHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUAAAADbmlsBQAAAANTRVABAAAAFGtleUZhY3RvcnlQb29sV2VpZ2h0AAAAAQAAAA9jb250cmFjdEFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAAAQlcyVzCQAETAAAAAICAAAACnBvb2xXZWlnaHQJAARMAAAAAgUAAAAPY29udHJhY3RBZGRyZXNzBQAAAANuaWwFAAAAA1NFUAEAAAAYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsAAAAAAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAABHRoaXMJAQAAABFrZXlGYWN0b3J5QWRkcmVzcwAAAAABAAAACnJlYWRMcExpc3QAAAAACQAEtQAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgkBAAAAGHJlYWRGYWN0b3J5QWRkcmVzc09yRmFpbAAAAAAJAQAAABBrZXlGYWN0b3J5THBMaXN0AAAAAAIAAAAABQAAAANTRVABAAAAFHJlYWRGYWN0b3J5Q2ZnT3JGYWlsAAAAAQAAAAdmYWN0b3J5CQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAdmYWN0b3J5CQEAAAANa2V5RmFjdG9yeUNmZwAAAAAFAAAAA1NFUAEAAAAYZ2V0Qm9vc3RpbmdBZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHABAAAAGGdldEVtaXNzaW9uQWRkcmVzc09yRmFpbAAAAAEAAAAKZmFjdG9yeUNmZwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAApmYWN0b3J5Q2ZnBQAAABlJZHhGYWN0b3J5Q2ZnRW1pc3Npb25EYXBwAQAAABdnZXRTdGFraW5nQWRkcmVzc09yRmFpbAAAAAEAAAAKZmFjdG9yeUNmZwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAApmYWN0b3J5Q2ZnBQAAABhJZHhGYWN0b3J5Q2ZnU3Rha2luZ0RhcHABAAAAHmtleUVtaXNzaW9uUmF0ZVBlckJsb2NrQ3VycmVudAAAAAACAAAAGyVzJXNfX3JhdGVQZXJCbG9ja19fY3VycmVudAEAAAAha2V5RW1pc3Npb25SYXRlUGVyQmxvY2tNYXhDdXJyZW50AAAAAAIAAAAeJXMlc19fcmF0ZVBlckJsb2NrTWF4X19jdXJyZW50AQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAAAgAAABolcyVzX19lbWlzc2lvbl9fc3RhcnRCbG9jawEAAAAba2V5RW1pc3Npb25EdXJhdGlvbkluQmxvY2tzAAAAAAIAAAAYJXMlc19fZW1pc3Npb25fX2R1cmF0aW9uAQAAABNrZXlFbWlzc2lvbkVuZEJsb2NrAAAAAAIAAAAYJXMlc19fZW1pc3Npb25fX2VuZEJsb2NrAAAAAA1JZHhDZmdBc3NldElkAAAAAAAAAAABAAAAABNJZHhDZmdNaW5Mb2NrQW1vdW50AAAAAAAAAAACAAAAABVJZHhDZmdNaW5Mb2NrRHVyYXRpb24AAAAAAAAAAAMAAAAAFUlkeENmZ01heExvY2tEdXJhdGlvbgAAAAAAAAAABAAAAAASSWR4Q2ZnTWF0aENvbnRyYWN0AAAAAAAAAAAFAQAAAAlrZXlDb25maWcAAAAAAgAAAAolc19fY29uZmlnAQAAABVyZWFkQ29uZmlnQXJyYXlPckZhaWwAAAAACQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAR0aGlzCQEAAAAJa2V5Q29uZmlnAAAAAAUAAAADU0VQAQAAAA1mb3JtYXRDb25maWdTAAAABQAAAAdhc3NldElkAAAADW1pbkxvY2tBbW91bnQAAAAPbWluTG9ja0R1cmF0aW9uAAAAD21heExvY2tEdXJhdGlvbgAAAAxtYXRoQ29udHJhY3QJAAS5AAAAAgkABEwAAAACAgAAAAglcyVkJWQlZAkABEwAAAACBQAAAAdhc3NldElkCQAETAAAAAIFAAAADW1pbkxvY2tBbW91bnQJAARMAAAAAgUAAAAPbWluTG9ja0R1cmF0aW9uCQAETAAAAAIFAAAAD21heExvY2tEdXJhdGlvbgkABEwAAAACBQAAAAxtYXRoQ29udHJhY3QFAAAAA25pbAUAAAADU0VQAQAAAAxmb3JtYXRDb25maWcAAAAFAAAAB2Fzc2V0SWQAAAANbWluTG9ja0Ftb3VudAAAAA9taW5Mb2NrRHVyYXRpb24AAAAPbWF4TG9ja0R1cmF0aW9uAAAADG1hdGhDb250cmFjdAkBAAAADWZvcm1hdENvbmZpZ1MAAAAFBQAAAAdhc3NldElkCQABpAAAAAEFAAAADW1pbkxvY2tBbW91bnQJAAGkAAAAAQUAAAAPbWluTG9ja0R1cmF0aW9uCQABpAAAAAEFAAAAD21heExvY2tEdXJhdGlvbgUAAAAMbWF0aENvbnRyYWN0AAAAAA5JZHhMb2NrVXNlck51bQAAAAAAAAAAAQAAAAANSWR4TG9ja0Ftb3VudAAAAAAAAAAAAgAAAAAMSWR4TG9ja1N0YXJ0AAAAAAAAAAADAAAAAA9JZHhMb2NrRHVyYXRpb24AAAAAAAAAAAQAAAAADUlkeExvY2tQYXJhbUsAAAAAAAAAAAUAAAAADUlkeExvY2tQYXJhbUIAAAAAAAAAAAYBAAAAE2tleUxvY2tQYXJhbXNSZWNvcmQAAAABAAAAC3VzZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAKJXMlc19fbG9jawkABEwAAAACBQAAAAt1c2VyQWRkcmVzcwUAAAADbmlsBQAAAANTRVABAAAAGnJlYWRMb2NrUGFyYW1zUmVjb3JkT3JGYWlsAAAAAQAAAAt1c2VyQWRkcmVzcwkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAE2tleUxvY2tQYXJhbXNSZWNvcmQAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAADU0VQAQAAABdmb3JtYXRMb2NrUGFyYW1zUmVjb3JkUwAAAAgAAAAHdXNlck51bQAAAAZhbW91bnQAAAAFc3RhcnQAAAAIZHVyYXRpb24AAAAGcGFyYW1LAAAABnBhcmFtQgAAABBsYXN0VXBkVGltZXN0YW1wAAAACWd3eEFtb3VudAkABLkAAAACCQAETAAAAAICAAAAECVkJWQlZCVkJWQlZCVkJWQJAARMAAAAAgUAAAAHdXNlck51bQkABEwAAAACBQAAAAZhbW91bnQJAARMAAAAAgUAAAAFc3RhcnQJAARMAAAAAgUAAAAIZHVyYXRpb24JAARMAAAAAgUAAAAGcGFyYW1LCQAETAAAAAIFAAAABnBhcmFtQgkABEwAAAACBQAAABBsYXN0VXBkVGltZXN0YW1wCQAETAAAAAIFAAAACWd3eEFtb3VudAUAAAADbmlsBQAAAANTRVABAAAAFmZvcm1hdExvY2tQYXJhbXNSZWNvcmQAAAAHAAAAB3VzZXJOdW0AAAAGYW1vdW50AAAABXN0YXJ0AAAACGR1cmF0aW9uAAAABnBhcmFtSwAAAAZwYXJhbUIAAAAJZ3d4QW1vdW50CQEAAAAXZm9ybWF0TG9ja1BhcmFtc1JlY29yZFMAAAAIBQAAAAd1c2VyTnVtCQABpAAAAAEFAAAABmFtb3VudAkAAaQAAAABBQAAAAVzdGFydAkAAaQAAAABBQAAAAhkdXJhdGlvbgkAAaQAAAABBQAAAAZwYXJhbUsJAAGkAAAAAQUAAAAGcGFyYW1CCQABpAAAAAEIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQABpAAAAAEFAAAACWd3eEFtb3VudAEAAAAOa2V5TmV4dFVzZXJOdW0AAAAAAgAAAA8lc19fbmV4dFVzZXJOdW0BAAAAEmtleVVzZXIyTnVtTWFwcGluZwAAAAEAAAALdXNlckFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAABklcyVzJXNfX21hcHBpbmdfX3VzZXIybnVtCQAETAAAAAIFAAAAC3VzZXJBZGRyZXNzBQAAAANuaWwFAAAAA1NFUAEAAAASa2V5TnVtMlVzZXJNYXBwaW5nAAAAAQAAAANudW0JAAS5AAAAAgkABEwAAAACAgAAABklcyVzJXNfX21hcHBpbmdfX251bTJ1c2VyCQAETAAAAAIFAAAAA251bQUAAAADbmlsBQAAAANTRVABAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAABYlcyVkJXNfX3BhcmFtQnlVc2VyTnVtCQAETAAAAAIFAAAAB3VzZXJOdW0JAARMAAAAAgIAAAAGYW1vdW50BQAAAANuaWwFAAAAA1NFUAEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEAAAAHdXNlck51bQkABLkAAAACCQAETAAAAAICAAAAFiVzJWQlc19fcGFyYW1CeVVzZXJOdW0JAARMAAAAAgUAAAAHdXNlck51bQkABEwAAAACAgAAAAVzdGFydAUAAAADbmlsBQAAAANTRVABAAAAFGtleUxvY2tQYXJhbUR1cmF0aW9uAAAAAQAAAAd1c2VyTnVtCQAEuQAAAAIJAARMAAAAAgIAAAAWJXMlZCVzX19wYXJhbUJ5VXNlck51bQkABEwAAAACBQAAAAd1c2VyTnVtCQAETAAAAAICAAAACGR1cmF0aW9uBQAAAANuaWwFAAAAA1NFUAEAAAANa2V5TG9ja1BhcmFtSwAAAAEAAAAHdXNlck51bQkABLkAAAACCQAETAAAAAICAAAAFiVzJWQlc19fcGFyYW1CeVVzZXJOdW0JAARMAAAAAgUAAAAHdXNlck51bQkABEwAAAACAgAAAAFrBQAAAANuaWwFAAAAA1NFUAEAAAANa2V5TG9ja1BhcmFtQgAAAAEAAAAHdXNlck51bQkABLkAAAACCQAETAAAAAICAAAAFiVzJWQlc19fcGFyYW1CeVVzZXJOdW0JAARMAAAAAgUAAAAHdXNlck51bQkABEwAAAACAgAAAAFiBQAAAANuaWwFAAAAA1NFUAEAAAAVa2V5TG9ja1BhcmFtQnlQZXJpb2RLAAAAAgAAAAd1c2VyTnVtAAAABnBlcmlvZAkABLkAAAACCQAETAAAAAICAAAAFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQAETAAAAAIFAAAAB3VzZXJOdW0JAARMAAAAAgIAAAABawkABEwAAAACBQAAAAZwZXJpb2QFAAAAA25pbAUAAAADU0VQAQAAABVrZXlMb2NrUGFyYW1CeVBlcmlvZEIAAAACAAAAB3VzZXJOdW0AAAAGcGVyaW9kCQAEuQAAAAIJAARMAAAAAgIAAAAXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAARMAAAAAgUAAAAHdXNlck51bQkABEwAAAACAgAAAAFiCQAETAAAAAIFAAAABnBlcmlvZAUAAAADbmlsBQAAAANTRVABAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAIAAAAeJXMlc19fc3RhdHNfX2FjdGl2ZVRvdGFsTG9ja2VkAQAAACBrZXlTdGF0c0xvY2tzRHVyYXRpb25TdW1JbkJsb2NrcwAAAAACAAAAJSVzJXNfX3N0YXRzX19sb2Nrc0R1cmF0aW9uU3VtSW5CbG9ja3MBAAAAEmtleVN0YXRzTG9ja3NDb3VudAAAAAACAAAAFyVzJXNfX3N0YXRzX19sb2Nrc0NvdW50AQAAABJrZXlTdGF0c1VzZXJzQ291bnQAAAAAAgAAAB0lcyVzX19zdGF0c19fYWN0aXZlVXNlcnNDb3VudAEAAAAga2V5VXNlckJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAAB4lcyVkX191c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnQJAARMAAAAAgUAAAAHdXNlck51bQUAAAADbmlsBQAAAANTRVABAAAAImtleVVzZXJMcEJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwAAAACAAAAB3VzZXJOdW0AAAAJbHBBc3NldElkCQAEuQAAAAIJAARMAAAAAgIAAAAeJXMlZF9fdXNlckJvb3N0RW1pc3Npb25MYXN0SW50CQAETAAAAAIFAAAAB3VzZXJOdW0JAARMAAAAAgUAAAAJbHBBc3NldElkBQAAAANuaWwFAAAAA1NFUAEAAAAXa2V5VXNlck1heEJvb3N0SU5URUdSQUwAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAABElcyVkX19tYXhCb29zdEludAkABEwAAAACBQAAAAd1c2VyTnVtBQAAAANuaWwFAAAAA1NFUAEAAAAYa2V5VG90YWxNYXhCb29zdElOVEVHUkFMAAAAAAIAAAAYJXMlc19fbWF4Qm9vc3RJbnRfX3RvdGFsAQAAACFrZXlVc2VyQm9vc3RBdmFsYWlibGVUb0NsYWltVG90YWwAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAACQlcyVkX191c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWwJAARMAAAAAgUAAAAHdXNlck51bQUAAAADbmlsBQAAAANTRVABAAAAE2tleVVzZXJCb29zdENsYWltZWQAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAABYlcyVkX191c2VyQm9vc3RDbGFpbWVkCQAETAAAAAIFAAAAB3VzZXJOdW0FAAAAA25pbAUAAAADU0VQAQAAABFrZXlUb3RhbENhY2hlZEd3eAAAAAACAAAAFiVzJXNfX2d3eENhY2hlZF9fdG90YWwAAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAGHJlYWRGYWN0b3J5QWRkcmVzc09yRmFpbAAAAAAAAAAACmZhY3RvcnlDZmcJAQAAABRyZWFkRmFjdG9yeUNmZ09yRmFpbAAAAAEFAAAAD2ZhY3RvcnlDb250cmFjdAAAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAGGdldEVtaXNzaW9uQWRkcmVzc09yRmFpbAAAAAEFAAAACmZhY3RvcnlDZmcAAAAAD3N0YWtpbmdDb250cmFjdAkBAAAAF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsAAAAAQUAAAAKZmFjdG9yeUNmZwEAAAAMSGlzdG9yeUVudHJ5AAAACAAAAAR0eXBlAAAABHVzZXIAAAAGYW1vdW50AAAACWxvY2tTdGFydAAAAAhkdXJhdGlvbgAAAAFrAAAAAWIAAAABaQQAAAAKaGlzdG9yeUtFWQkABLkAAAACCQAETAAAAAICAAAAESVzJXMlcyVzX19oaXN0b3J5CQAETAAAAAIFAAAABHR5cGUJAARMAAAAAgUAAAAEdXNlcgkABEwAAAACCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQFAAAAA25pbAUAAAADU0VQBAAAAAtoaXN0b3J5REFUQQkABLkAAAACCQAETAAAAAICAAAADiVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAZoZWlnaHQJAARMAAAAAgkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQABpAAAAAEFAAAABmFtb3VudAkABEwAAAACCQABpAAAAAEFAAAACWxvY2tTdGFydAkABEwAAAACCQABpAAAAAEFAAAACGR1cmF0aW9uCQAETAAAAAIJAAGkAAAAAQUAAAABawkABEwAAAACCQABpAAAAAEFAAAAAWIFAAAAA25pbAUAAAADU0VQCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAApoaXN0b3J5S0VZBQAAAAtoaXN0b3J5REFUQQEAAAAKU3RhdHNFbnRyeQAAAAQAAAAOdG90YWxMb2NrZWRJbmMAAAALZHVyYXRpb25JbmMAAAAMbG9ja0NvdW50SW5jAAAADXVzZXJzQ291bnRJbmMEAAAAG2xvY2tzRHVyYXRpb25TdW1JbkJsb2Nrc0tFWQkBAAAAIGtleVN0YXRzTG9ja3NEdXJhdGlvblN1bUluQmxvY2tzAAAAAAQAAAANbG9ja3NDb3VudEtFWQkBAAAAEmtleVN0YXRzTG9ja3NDb3VudAAAAAAEAAAADXVzZXJzQ291bnRLRVkJAQAAABJrZXlTdGF0c1VzZXJzQ291bnQAAAAABAAAAA50b3RhbEFtb3VudEtFWQkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAQAAAAYbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAbbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzS0VZBAAAAApsb2Nrc0NvdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAANbG9ja3NDb3VudEtFWQQAAAAKdXNlcnNDb3VudAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAADXVzZXJzQ291bnRLRVkEAAAAC3RvdGFsQW1vdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAOdG90YWxBbW91bnRLRVkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG2xvY2tzRHVyYXRpb25TdW1JbkJsb2Nrc0tFWQkAAGQAAAACBQAAABhsb2Nrc0R1cmF0aW9uU3VtSW5CbG9ja3MFAAAAC2R1cmF0aW9uSW5jCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA1sb2Nrc0NvdW50S0VZCQAAZAAAAAIFAAAACmxvY2tzQ291bnQFAAAADGxvY2tDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANdXNlcnNDb3VudEtFWQkAAGQAAAACBQAAAAp1c2Vyc0NvdW50BQAAAA11c2Vyc0NvdW50SW5jCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA50b3RhbEFtb3VudEtFWQkAAGQAAAACBQAAAAt0b3RhbEFtb3VudAUAAAAOdG90YWxMb2NrZWRJbmMFAAAAA25pbAEAAAANY2FsY0d3eEFtb3VudAAAAAMAAAAEa1JhdwAAAARiUmF3AAAAAWgEAAAABVNDQUxFAAAAAAAAAAPoCQAAaQAAAAIJAABkAAAAAgkAAGgAAAACBQAAAARrUmF3BQAAAAFoBQAAAARiUmF3BQAAAAVTQ0FMRQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAACAAAAAt1c2VyQWRkcmVzcwAAAAd1c2VyTnVtAAAABmFtb3VudAAAAAVzdGFydAAAAAhkdXJhdGlvbgAAAAFrAAAAAWIAAAAGcGVyaW9kBAAAAA11c2VyQW1vdW50S0VZCQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAAB3VzZXJOdW0EAAAADXN0YXJ0QmxvY2tLRVkJAQAAABZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAAAAAQUAAAAHdXNlck51bQQAAAALZHVyYXRpb25LRVkJAQAAABRrZXlMb2NrUGFyYW1EdXJhdGlvbgAAAAEFAAAAB3VzZXJOdW0EAAAABGtLRVkJAQAAAA1rZXlMb2NrUGFyYW1LAAAAAQUAAAAHdXNlck51bQQAAAAEYktFWQkBAAAADWtleUxvY2tQYXJhbUIAAAABBQAAAAd1c2VyTnVtBAAAAAtrQnlQZXJpb0tFWQkBAAAAFWtleUxvY2tQYXJhbUJ5UGVyaW9kSwAAAAIFAAAAB3VzZXJOdW0FAAAABnBlcmlvZAQAAAAMYkJ5UGVyaW9kS0VZCQEAAAAVa2V5TG9ja1BhcmFtQnlQZXJpb2RCAAAAAgUAAAAHdXNlck51bQUAAAAGcGVyaW9kBAAAAAlnd3hBbW91bnQJAQAAAA1jYWxjR3d4QW1vdW50AAAAAwUAAAABawUAAAABYgUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA11c2VyQW1vdW50S0VZBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADXN0YXJ0QmxvY2tLRVkFAAAABXN0YXJ0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtkdXJhdGlvbktFWQUAAAAIZHVyYXRpb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABGtLRVkFAAAAAWsJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAABGJLRVkFAAAAAWIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tCeVBlcmlvS0VZBQAAAAFrCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAxiQnlQZXJpb2RLRVkFAAAAAWIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleUxvY2tQYXJhbXNSZWNvcmQAAAABBQAAAAt1c2VyQWRkcmVzcwkBAAAAFmZvcm1hdExvY2tQYXJhbXNSZWNvcmQAAAAHBQAAAAd1c2VyTnVtBQAAAAZhbW91bnQFAAAABXN0YXJ0BQAAAAhkdXJhdGlvbgUAAAABawUAAAABYgUAAAAJZ3d4QW1vdW50BQAAAANuaWwBAAAAImV4dHJhY3RPcHRpb25hbFBheW1lbnRBbW91bnRPckZhaWwAAAACAAAAAWkAAAAPZXhwZWN0ZWRBc3NldElkAwkAAGYAAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAG29ubHkgb25lIHBheW1lbnQgaXMgYWxsb3dlZAMJAAAAAAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAAAAAAAAAQAAAADcG10CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAwkBAAAAAiE9AAAAAgkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBQAAAA9leHBlY3RlZEFzc2V0SWQJAAACAAAAAQIAAAAbaW52YWxpZCBhc3NldCBpZCBpbiBwYXltZW50CAUAAAADcG10AAAABmFtb3VudAEAAAAUY2FsY0N1cnJlbnRHd3hBbW91bnQAAAABAAAAC3VzZXJBZGRyZXNzBAAAAAVFTVBUWQIAAAAFZW1wdHkEAAAAEnVzZXIyTnVtTWFwcGluZ0tFWQkBAAAAEmtleVVzZXIyTnVtTWFwcGluZwAAAAEFAAAAC3VzZXJBZGRyZXNzBAAAAAd1c2VyTnVtCQEAAAALdmFsdWVPckVsc2UAAAACCQAEIgAAAAEFAAAAEnVzZXIyTnVtTWFwcGluZ0tFWQUAAAAFRU1QVFkEAAAAAWsJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQfAAAAAQkBAAAADWtleUxvY2tQYXJhbUsAAAABBQAAAAd1c2VyTnVtAAAAAAAAAAAABAAAAAFiCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAAA1rZXlMb2NrUGFyYW1CAAAAAQUAAAAHdXNlck51bQAAAAAAAAAAAAQAAAANZ3d4QW1vdW50Q2FsYwkBAAAADWNhbGNHd3hBbW91bnQAAAADBQAAAAFrBQAAAAFiBQAAAAZoZWlnaHQEAAAACWd3eEFtb3VudAMJAABmAAAAAgAAAAAAAAAAAAUAAAANZ3d4QW1vdW50Q2FsYwAAAAAAAAAAAAUAAAANZ3d4QW1vdW50Q2FsYwUAAAAJZ3d4QW1vdW50AQAAABRpbnRlcm5hbENsYWltV3hCb29zdAAAAAMAAAAMbHBBc3NldElkU3RyAAAADnVzZXJBZGRyZXNzU3RyAAAACHJlYWRPbmx5BAAAAAVFTVBUWQIAAAAFRU1QVFkEAAAAEXVzZXJSZWNvcmRPckVtcHR5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAABNrZXlMb2NrUGFyYW1zUmVjb3JkAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIFAAAABUVNUFRZAwkAAAAAAAACBQAAABF1c2VyUmVjb3JkT3JFbXB0eQUAAAAFRU1QVFkJAAUVAAAAAwAAAAAAAAAAAAUAAAADbmlsAgAAABV1c2VyUmVjb3JkOjppczo6ZW1wdHkEAAAAD3VzZXJSZWNvcmRBcnJheQkABLUAAAACBQAAABF1c2VyUmVjb3JkT3JFbXB0eQUAAAADU0VQBAAAAAp1c2VyTnVtU3RyCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAAOSWR4TG9ja1VzZXJOdW0EAAAACEVNUFRZU1RSAgAAAAVlbXB0eQQAAAAKcG9vbFdlaWdodAMJAQAAAAIhPQAAAAIFAAAADGxwQXNzZXRJZFN0cgUAAAAIRU1QVFlTVFIEAAAADnBvb2xBZGRyZXNzU3RyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAaa2V5RmFjdG9yeUxwMkFzc2V0c01hcHBpbmcAAAABBQAAAAxscEFzc2V0SWRTdHIJAAEsAAAAAgIAAAAVdW5zdXBwb3J0ZWQgbHAgYXNzZXQgBQAAAAxscEFzc2V0SWRTdHIJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAFGtleUZhY3RvcnlQb29sV2VpZ2h0AAAAAQUAAAAOcG9vbEFkZHJlc3NTdHIDBQAAAAhyZWFkT25seQAAAAAAAAAAAAkAAAIAAAABCQABLAAAAAICAAAAKG5vdCByZWFkb25seSBtb2RlOiB1bnN1cHBvcnRlZCBscCBhc3NldCAFAAAADGxwQXNzZXRJZFN0cgQAAAASd3hFbWlzc2lvblBlckJsb2NrCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAHmtleUVtaXNzaW9uUmF0ZVBlckJsb2NrQ3VycmVudAAAAAAEAAAADWVtaXNzaW9uU3RhcnQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAVa2V5RW1pc3Npb25TdGFydEJsb2NrAAAAAAQAAAALZW1pc3Npb25FbmQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAATa2V5RW1pc3Npb25FbmRCbG9jawAAAAAEAAAAAWgDCQAAZgAAAAIFAAAABmhlaWdodAUAAAALZW1pc3Npb25FbmQFAAAAC2VtaXNzaW9uRW5kBQAAAAZoZWlnaHQEAAAAAmRoCQABlgAAAAEJAARMAAAAAgkAAGUAAAACBQAAAAFoBQAAAA1lbWlzc2lvblN0YXJ0CQAETAAAAAIAAAAAAAAAAAAFAAAAA25pbAQAAAAidXNlckxwQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQkBAAAAImtleVVzZXJMcEJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwAAAACBQAAAAp1c2VyTnVtU3RyBQAAAAxscEFzc2V0SWRTdHIEAAAAIHVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZCQEAAAAga2V5VXNlckJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwAAAABBQAAAAp1c2VyTnVtU3RyBAAAAB11c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAACJ1c2VyTHBCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAgdXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWxLRVkEAAAAFWJvb3N0RW1pc3Npb25JbnRlZ3JhbAkAAGkAAAACCQAAaAAAAAIJAABoAAAAAgUAAAASd3hFbWlzc2lvblBlckJsb2NrBQAAAAJkaAAAAAAAAAAAAgAAAAAAAAAAAwQAAAAZdXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbAkAAGUAAAACBQAAABVib29zdEVtaXNzaW9uSW50ZWdyYWwFAAAAHXVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsAwkAAGYAAAACAAAAAAAAAAAABQAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsCQAAAgAAAAECAAAAEndyb25nIGNhbGN1bGF0aW9ucwQAAAAXdXNlck1heEJvb3N0SW50ZWdyYWxLRVkJAQAAABdrZXlVc2VyTWF4Qm9vc3RJTlRFR1JBTAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAGHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbEtFWQkBAAAAGGtleVRvdGFsTWF4Qm9vc3RJTlRFR1JBTAAAAAAEAAAAD3VzZXJNYXhCb29zdEludAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAF3VzZXJNYXhCb29zdEludGVncmFsS0VZBAAAABB0b3RhbE1heEJvb3N0SW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAYdG90YWxNYXhCb29zdEludGVncmFsS0VZBAAAABF0b3RhbENhY2hlZEd3eEtFWQkBAAAAEWtleVRvdGFsQ2FjaGVkR3d4AAAAAAQAAAAOdG90YWxDYWNoZWRHd3gJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAARdG90YWxDYWNoZWRHd3hLRVkAAAAAAAAAAAAEAAAAC3VzZXJDdXJyR3d4CQEAAAAUY2FsY0N1cnJlbnRHd3hBbW91bnQAAAABBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAhdXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsS0VZCQEAAAAha2V5VXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsAAAAAQUAAAAKdXNlck51bVN0cgQAAAAedXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAhdXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsS0VZBAAAAB1wb29sVXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbAkAAGsAAAADBQAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsBQAAAApwb29sV2VpZ2h0BQAAAA5QT09MV0VJR0hUTVVMVAQAAAAhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3AwkAAAAAAAACBQAAAA50b3RhbENhY2hlZEd3eAAAAAAAAAAAAAAAAAAAAAAAAAkAAGsAAAADBQAAAB1wb29sVXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbAUAAAALdXNlckN1cnJHd3gFAAAADnRvdGFsQ2FjaGVkR3d4BAAAABN1c2VyQm9vc3RDbGFpbWVkS0VZCQEAAAATa2V5VXNlckJvb3N0Q2xhaW1lZAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAEHVzZXJCb29zdENsYWltZWQJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAABN1c2VyQm9vc3RDbGFpbWVkS0VZBAAAABJ1c2VyQm9vc3RBdmFpbGFibGUJAABlAAAAAgUAAAAhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3BQAAABB1c2VyQm9vc3RDbGFpbWVkBAAAAAlkYXRhU3RhdGUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAInVzZXJMcEJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWxLRVkFAAAAFWJvb3N0RW1pc3Npb25JbnRlZ3JhbAUAAAADbmlsBAAAAAVkZWJ1ZwkABLkAAAACCQAETAAAAAIJAAEsAAAAAgIAAAAedXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWw9CQABpAAAAAEFAAAAHXVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsCQAETAAAAAIJAAEsAAAAAgIAAAAadXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbD0JAAGkAAAAAQUAAAAZdXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbAkABEwAAAACCQABLAAAAAICAAAAEHVzZXJNYXhCb29zdEludD0JAAGkAAAAAQUAAAAPdXNlck1heEJvb3N0SW50CQAETAAAAAIJAAEsAAAAAgIAAAARdG90YWxNYXhCb29zdEludD0JAAGkAAAAAQUAAAAQdG90YWxNYXhCb29zdEludAkABEwAAAACCQABLAAAAAICAAAAH3VzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbD0JAAGkAAAAAQUAAAAedXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsCQAETAAAAAIJAAEsAAAAAgIAAAAidXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3PQkAAaQAAAABBQAAACF1c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWxOZXcJAARMAAAAAgkAASwAAAACAgAAABF1c2VyQm9vc3RDbGFpbWVkPQkAAaQAAAABBQAAABB1c2VyQm9vc3RDbGFpbWVkCQAETAAAAAIJAAEsAAAAAgIAAAATdXNlckJvb3N0QXZhaWxhYmxlPQkAAaQAAAABBQAAABJ1c2VyQm9vc3RBdmFpbGFibGUJAARMAAAAAgkAASwAAAACAgAAAB5wb29sVXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbD0JAAGkAAAAAQUAAAAdcG9vbFVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWwJAARMAAAAAgkAASwAAAACAgAAAAx1c2VyQ3Vyckd3eD0JAAGkAAAAAQUAAAALdXNlckN1cnJHd3gJAARMAAAAAgkAASwAAAACAgAAAA50b3RhbENhY2hlZEd3eAkAAaQAAAABBQAAAA50b3RhbENhY2hlZEd3eAUAAAADbmlsAgAAAAI6OgkABRUAAAADBQAAACF1c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWxOZXcFAAAACWRhdGFTdGF0ZQUAAAAFZGVidWcAAAAHAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAABgAAABFmYWN0b3J5QWRkcmVzc1N0cgAAAA5sb2NrQXNzZXRJZFN0cgAAAA1taW5Mb2NrQW1vdW50AAAAC21pbkR1cmF0aW9uAAAAC21heER1cmF0aW9uAAAADG1hdGhDb250cmFjdAMJAQAAAAIhPQAAAAIFAAAABHRoaXMIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAAA5ub3QgYXV0aG9yaXplZAkABE4AAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOa2V5TmV4dFVzZXJOdW0AAAAAAAAAAAAAAAAACQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAlrZXlDb25maWcAAAAACQEAAAAMZm9ybWF0Q29uZmlnAAAABQUAAAAObG9ja0Fzc2V0SWRTdHIFAAAADW1pbkxvY2tBbW91bnQFAAAAC21pbkR1cmF0aW9uBQAAAAttYXhEdXJhdGlvbgUAAAAMbWF0aENvbnRyYWN0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFrZXlGYWN0b3J5QWRkcmVzcwAAAAAFAAAAEWZhY3RvcnlBZGRyZXNzU3RyBQAAAANuaWwJAQAAAApTdGF0c0VudHJ5AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFpAQAAAARsb2NrAAAAAQAAAAhkdXJhdGlvbgQAAAAIY2ZnQXJyYXkJAQAAABVyZWFkQ29uZmlnQXJyYXlPckZhaWwAAAAABAAAAAphc3NldElkU3RyCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAAA1JZHhDZmdBc3NldElkBAAAAAdhc3NldElkCQACWQAAAAEFAAAACmFzc2V0SWRTdHIEAAAADW1pbkxvY2tBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAATSWR4Q2ZnTWluTG9ja0Ftb3VudAQAAAAPbWluTG9ja0R1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFUlkeENmZ01pbkxvY2tEdXJhdGlvbgQAAAAPbWF4TG9ja0R1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFUlkeENmZ01heExvY2tEdXJhdGlvbgQAAAAMbWF0aENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABJJZHhDZmdNYXRoQ29udHJhY3QDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAANGludmFsaWQgcGF5bWVudCAtIGV4YWN0IG9uZSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEAAAAA3BtdAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAJcG10QW1vdW50CAUAAAADcG10AAAABmFtb3VudAMJAQAAAAIhPQAAAAIFAAAAB2Fzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAeaW52YWxpZCBhc3NldCBpcyBpbiBwYXltZW50IC0gBQAAAAphc3NldElkU3RyAgAAAAwgaXMgZXhwZWN0ZWQEAAAADm5leHRVc2VyTnVtS0VZCQEAAAAOa2V5TmV4dFVzZXJOdW0AAAAABAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAADnVzZXJJc0V4aXN0aW5nCQEAAAAJaXNEZWZpbmVkAAAAAQkABCIAAAABCQEAAAASa2V5VXNlcjJOdW1NYXBwaW5nAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIEAAAACnVzZXJOdW1TdHIDBQAAAA51c2VySXNFeGlzdGluZwkBAAAABXZhbHVlAAAAAQkABCIAAAABCQEAAAASa2V5VXNlcjJOdW1NYXBwaW5nAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIJAAGkAAAAAQkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAADm5leHRVc2VyTnVtS0VZBAAAAAd1c2VyTnVtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEFAAAACnVzZXJOdW1TdHIEAAAACWxvY2tTdGFydAUAAAAGaGVpZ2h0BAAAAA1zdGFydEJsb2NrS0VZCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAACnVzZXJOdW1TdHIEAAAAC2R1cmF0aW9uS0VZCQEAAAAUa2V5TG9ja1BhcmFtRHVyYXRpb24AAAABBQAAAAp1c2VyTnVtU3RyBAAAAA11c2VyQW1vdW50S0VZCQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAACnVzZXJOdW1TdHIDCQAAZgAAAAIFAAAADW1pbkxvY2tBbW91bnQFAAAACXBtdEFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAImFtb3VudCBpcyBsZXNzIHRoZW4gbWluTG9ja0Ftb3VudD0JAAGkAAAAAQUAAAANbWluTG9ja0Ftb3VudAMJAABmAAAAAgUAAAAPbWluTG9ja0R1cmF0aW9uBQAAAAhkdXJhdGlvbgkAAAIAAAABCQABLAAAAAICAAAALXBhc3NlZCBkdXJhdGlvbiBpcyBsZXNzIHRoZW4gbWluTG9ja0R1cmF0aW9uPQkAAaQAAAABBQAAAA9taW5Mb2NrRHVyYXRpb24DCQAAZgAAAAIFAAAACGR1cmF0aW9uBQAAAA9tYXhMb2NrRHVyYXRpb24JAAACAAAAAQkAASwAAAACAgAAADBwYXNzZWQgZHVyYXRpb24gaXMgZ3JlYXRlciB0aGVuIG1heExvY2tEdXJhdGlvbj0JAAGkAAAAAQUAAAAPbWF4TG9ja0R1cmF0aW9uAwMFAAAADnVzZXJJc0V4aXN0aW5nCQAAZwAAAAIJAABkAAAAAgkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAADXN0YXJ0QmxvY2tLRVkJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAAAtkdXJhdGlvbktFWQUAAAAJbG9ja1N0YXJ0BwkAAAIAAAABAgAAADZ0aGVyZSBpcyBhbiBhY3RpdmUgbG9jayAtIGNvbnNpZGVyIHRvIHVzZSBpbmNyZWFzZUxvY2sEAAAAB2NvZWZmWDgJAABrAAAAAwUAAAAIZHVyYXRpb24FAAAABU1VTFQ4BQAAAA9tYXhMb2NrRHVyYXRpb24EAAAADmdXeEFtb3VudFN0YXJ0CQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAHY29lZmZYOAUAAAAFTVVMVDgEAAAAE2dXeFBhcmFtc1Jlc3VsdExpc3QJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAVY2FsY0d3eFBhcmFtc1JFQURPTkxZCQAETAAAAAIFAAAADmdXeEFtb3VudFN0YXJ0CQAETAAAAAIFAAAACWxvY2tTdGFydAkABEwAAAACBQAAAAhkdXJhdGlvbgUAAAADbmlsBQAAAANuaWwEAAAAAWsJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAATZ1d4UGFyYW1zUmVzdWx0TGlzdAAAAAAAAAAAAAQAAAABYgkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAABNnV3hQYXJhbXNSZXN1bHRMaXN0AAAAAAAAAAABBAAAAAZwZXJpb2QJAAGkAAAAAQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAABNnV3hQYXJhbXNSZXN1bHRMaXN0AAAAAAAAAAACBAAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAQAAAANZW1pc3Npb25TdGFydAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAABAAAAAtlbWlzc2lvbkVuZAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABNrZXlFbWlzc2lvbkVuZEJsb2NrAAAAAAQAAAABaAMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAAAtlbWlzc2lvbkVuZAUAAAALZW1pc3Npb25FbmQFAAAABmhlaWdodAQAAAACZGgJAAGWAAAAAQkABEwAAAACCQAAZQAAAAIFAAAAAWgFAAAADWVtaXNzaW9uU3RhcnQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBAAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQkBAAAAIGtleVVzZXJCb29zdEVtaXNzaW9uTGFzdElOVEVHUkFMAAAAAQUAAAAKdXNlck51bVN0cgQAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsCQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAABJ3eEVtaXNzaW9uUGVyQmxvY2sFAAAAAmRoAAAAAAAAAAACAAAAAAAAAAADBAAAABd1c2VyTWF4Qm9vc3RJbnRlZ3JhbEtFWQkBAAAAF2tleVVzZXJNYXhCb29zdElOVEVHUkFMAAAAAQUAAAAKdXNlck51bVN0cgQAAAAYdG90YWxNYXhCb29zdEludGVncmFsS0VZCQEAAAAYa2V5VG90YWxNYXhCb29zdElOVEVHUkFMAAAAAAQAAAAPdXNlck1heEJvb3N0SW50CQAAaQAAAAIJAABoAAAAAgUAAAAOZ1d4QW1vdW50U3RhcnQFAAAACGR1cmF0aW9uAAAAAAAAAAACBAAAABB0b3RhbE1heEJvb3N0SW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAYdG90YWxNYXhCb29zdEludGVncmFsS0VZBAAAABF0b3RhbENhY2hlZEd3eEtFWQkBAAAAEWtleVRvdGFsQ2FjaGVkR3d4AAAAAAQAAAAOdG90YWxDYWNoZWRHd3gJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAARdG90YWxDYWNoZWRHd3hLRVkAAAAAAAAAAAAEAAAAA2FycgMFAAAADnVzZXJJc0V4aXN0aW5nBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADm5leHRVc2VyTnVtS0VZCQAAZAAAAAIFAAAAB3VzZXJOdW0AAAAAAAAAAAEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleVVzZXIyTnVtTWFwcGluZwAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAp1c2VyTnVtU3RyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlOdW0yVXNlck1hcHBpbmcAAAABBQAAAAp1c2VyTnVtU3RyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAADbmlsCQAETgAAAAIJAARNAAAAAgkABE4AAAACCQAETgAAAAIFAAAAA2FycgkBAAAAD0xvY2tQYXJhbXNFbnRyeQAAAAgFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAp1c2VyTnVtU3RyBQAAAAlwbXRBbW91bnQFAAAACWxvY2tTdGFydAUAAAAIZHVyYXRpb24FAAAAAWsFAAAAAWIFAAAABnBlcmlvZAkBAAAAClN0YXRzRW50cnkAAAAEBQAAAAlwbXRBbW91bnQFAAAACGR1cmF0aW9uAAAAAAAAAAABAwUAAAAOdXNlcklzRXhpc3RpbmcAAAAAAAAAAAAAAAAAAAAAAAEJAQAAAAxIaXN0b3J5RW50cnkAAAAIAgAAAARsb2NrBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAJcG10QW1vdW50BQAAAAlsb2NrU3RhcnQFAAAACGR1cmF0aW9uBQAAAAFrBQAAAAFiBQAAAAFpCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQUAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABF0b3RhbENhY2hlZEd3eEtFWQkAAGQAAAACBQAAAA50b3RhbENhY2hlZEd3eAUAAAAOZ1d4QW1vdW50U3RhcnQFAAAAA25pbAAAAAFpAQAAAAxpbmNyZWFzZUxvY2sAAAABAAAADWRlbHRhRHVyYXRpb24EAAAACGNmZ0FycmF5CQEAAAAVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAAAAAQAAAAKYXNzZXRJZFN0cgkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAANSWR4Q2ZnQXNzZXRJZAQAAAAHYXNzZXRJZAkAAlkAAAABBQAAAAphc3NldElkU3RyBAAAAA9taW5Mb2NrRHVyYXRpb24JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAVSWR4Q2ZnTWluTG9ja0R1cmF0aW9uBAAAAA9tYXhMb2NrRHVyYXRpb24JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAVSWR4Q2ZnTWF4TG9ja0R1cmF0aW9uBAAAAAxtYXRoQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAEklkeENmZ01hdGhDb250cmFjdAQAAAAJcG10QW1vdW50CQEAAAAiZXh0cmFjdE9wdGlvbmFsUGF5bWVudEFtb3VudE9yRmFpbAAAAAIFAAAAAWkFAAAAB2Fzc2V0SWQEAAAADnVzZXJBZGRyZXNzU3RyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAPdXNlclJlY29yZEFycmF5CQEAAAAacmVhZExvY2tQYXJhbXNSZWNvcmRPckZhaWwAAAABBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAKdXNlck51bVN0cgkAAZEAAAACBQAAAA91c2VyUmVjb3JkQXJyYXkFAAAADklkeExvY2tVc2VyTnVtBAAAAAp1c2VyQW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPdXNlclJlY29yZEFycmF5BQAAAA1JZHhMb2NrQW1vdW50BAAAAAlsb2NrU3RhcnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA91c2VyUmVjb3JkQXJyYXkFAAAADElkeExvY2tTdGFydAQAAAAMbG9ja0R1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPdXNlclJlY29yZEFycmF5BQAAAA9JZHhMb2NrRHVyYXRpb24EAAAAB2xvY2tFbmQJAABkAAAAAgUAAAAJbG9ja1N0YXJ0BQAAAAxsb2NrRHVyYXRpb24EAAAAEXJlbWFpbmluZ0R1cmF0aW9uCQABlgAAAAEJAARMAAAAAgkAAGUAAAACBQAAAAdsb2NrRW5kBQAAAAZoZWlnaHQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBAAAAA11c2VyQW1vdW50TmV3CQAAZAAAAAIFAAAACnVzZXJBbW91bnQFAAAACXBtdEFtb3VudAQAAAAPbG9ja0R1cmF0aW9uTmV3CQAAZAAAAAIFAAAAEXJlbWFpbmluZ0R1cmF0aW9uBQAAAA1kZWx0YUR1cmF0aW9uAwkAAGYAAAACAAAAAAAAAAAABQAAAA1kZWx0YUR1cmF0aW9uCQAAAgAAAAECAAAAGmR1cmF0aW9uIGlzIGxlc3MgdGhlbiB6ZXJvAwkAAGYAAAACBQAAAA9taW5Mb2NrRHVyYXRpb24FAAAAD2xvY2tEdXJhdGlvbk5ldwkAAAIAAAABCQABLAAAAAICAAAALWxvY2tEdXJhdGlvbk5ldyBpcyBsZXNzIHRoZW4gbWluTG9ja0R1cmF0aW9uPQkAAaQAAAABBQAAAA9taW5Mb2NrRHVyYXRpb24DCQAAZgAAAAIFAAAAD2xvY2tEdXJhdGlvbk5ldwUAAAAPbWF4TG9ja0R1cmF0aW9uCQAAAgAAAAEJAAEsAAAAAgIAAABEZGVsdGFEdXJhdGlvbiArIGV4aXN0ZWRMb2NrRHVyYXRpb24gaXMgZ3JlYXRlciB0aGVuIG1heExvY2tEdXJhdGlvbj0JAAGkAAAAAQUAAAAPbWF4TG9ja0R1cmF0aW9uBAAAAAdjb2VmZlg4CQAAawAAAAMFAAAAD2xvY2tEdXJhdGlvbk5ldwUAAAAFTVVMVDgFAAAAD21heExvY2tEdXJhdGlvbgQAAAAOZ1d4QW1vdW50U3RhcnQJAABrAAAAAwUAAAANdXNlckFtb3VudE5ldwUAAAAHY29lZmZYOAUAAAAFTVVMVDgEAAAADGxvY2tTdGFydE5ldwUAAAAGaGVpZ2h0BAAAABNnV3hQYXJhbXNSZXN1bHRMaXN0CQEAAAAJYXNBbnlMaXN0AAAAAQkAA/wAAAAEBQAAAAxtYXRoQ29udHJhY3QCAAAAFWNhbGNHd3hQYXJhbXNSRUFET05MWQkABEwAAAACBQAAAA5nV3hBbW91bnRTdGFydAkABEwAAAACBQAAAAxsb2NrU3RhcnROZXcJAARMAAAAAgUAAAAPbG9ja0R1cmF0aW9uTmV3BQAAAANuaWwFAAAAA25pbAQAAAABawkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAABNnV3hQYXJhbXNSZXN1bHRMaXN0AAAAAAAAAAAABAAAAAFiCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAE2dXeFBhcmFtc1Jlc3VsdExpc3QAAAAAAAAAAAEEAAAABnBlcmlvZAkAAaQAAAABCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAE2dXeFBhcmFtc1Jlc3VsdExpc3QAAAAAAAAAAAIEAAAAEnd4RW1pc3Npb25QZXJCbG9jawkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAAB5rZXlFbWlzc2lvblJhdGVQZXJCbG9ja0N1cnJlbnQAAAAABAAAAA1lbWlzc2lvblN0YXJ0CQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAFWtleUVtaXNzaW9uU3RhcnRCbG9jawAAAAAEAAAAC2VtaXNzaW9uRW5kCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAE2tleUVtaXNzaW9uRW5kQmxvY2sAAAAABAAAAAFoAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAAC2VtaXNzaW9uRW5kBQAAAAtlbWlzc2lvbkVuZAUAAAAGaGVpZ2h0BAAAAAJkaAkAAZYAAAABCQAETAAAAAIJAABlAAAAAgUAAAABaAUAAAANZW1pc3Npb25TdGFydAkABEwAAAACAAAAAAAAAAAABQAAAANuaWwEAAAAIHVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZCQEAAAAga2V5VXNlckJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwAAAABBQAAAAp1c2VyTnVtU3RyBAAAAB11c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAIHVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZBAAAABVib29zdEVtaXNzaW9uSW50ZWdyYWwJAABpAAAAAgkAAGgAAAACCQAAaAAAAAIFAAAAEnd4RW1pc3Npb25QZXJCbG9jawUAAAACZGgAAAAAAAAAAAIAAAAAAAAAAAMEAAAAGXVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWwJAABlAAAAAgUAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsBQAAAB11c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbAMJAABmAAAAAgAAAAAAAAAAAAUAAAAZdXNlckJvb3N0RW1pc3Npb25JbnRlZ3JhbAkAAAIAAAABAgAAABJ3cm9uZyBjYWxjdWxhdGlvbnMEAAAAF3VzZXJNYXhCb29zdEludGVncmFsS0VZCQEAAAAXa2V5VXNlck1heEJvb3N0SU5URUdSQUwAAAABBQAAAAp1c2VyTnVtU3RyBAAAABh0b3RhbE1heEJvb3N0SW50ZWdyYWxLRVkJAQAAABhrZXlUb3RhbE1heEJvb3N0SU5URUdSQUwAAAAABAAAAA91c2VyTWF4Qm9vc3RJbnQJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAABd1c2VyTWF4Qm9vc3RJbnRlZ3JhbEtFWQQAAAAQdG90YWxNYXhCb29zdEludAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAGHRvdGFsTWF4Qm9vc3RJbnRlZ3JhbEtFWQQAAAALY3VyclVzZXJHd3gJAQAAABRjYWxjQ3VycmVudEd3eEFtb3VudAAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAAAdnd3hEaWZmCQAAZQAAAAIFAAAADmdXeEFtb3VudFN0YXJ0BQAAAAtjdXJyVXNlckd3eAMJAABmAAAAAgAAAAAAAAAAAAUAAAAHZ3d4RGlmZgkAAAIAAAABAgAAABZnd3hEaWZmIGlzIGxlc3MgdGhlbiAwBAAAABF0b3RhbENhY2hlZEd3eEtFWQkBAAAAEWtleVRvdGFsQ2FjaGVkR3d4AAAAAAQAAAAOdG90YWxDYWNoZWRHd3gJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAARdG90YWxDYWNoZWRHd3hLRVkAAAAAAAAAAAAEAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQkBAAAAIWtleVVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbAAAAAEFAAAACnVzZXJOdW1TdHIEAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQQAAAAhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3CQAAawAAAAMFAAAAGXVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWwFAAAAC2N1cnJVc2VyR3d4BQAAAA50b3RhbENhY2hlZEd3eAQAAAASdXNlck1heEJvb3N0SW50TmV3CQAAaQAAAAIJAABoAAAAAgUAAAAOZ1d4QW1vdW50U3RhcnQFAAAAD2xvY2tEdXJhdGlvbk5ldwAAAAAAAAAAAgQAAAAYcmVtYWluaW5nVXNlck1heEJvb3N0SW50CQAAaQAAAAIJAABoAAAAAgUAAAALY3VyclVzZXJHd3gFAAAAEXJlbWFpbmluZ0R1cmF0aW9uAAAAAAAAAAACBAAAABN1c2VyTWF4Qm9vc3RJbnREaWZmCQAAZQAAAAIFAAAAEnVzZXJNYXhCb29zdEludE5ldwUAAAAYcmVtYWluaW5nVXNlck1heEJvb3N0SW50CQAETgAAAAIJAARNAAAAAgkABE4AAAACCQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAACAUAAAAOdXNlckFkZHJlc3NTdHIFAAAACnVzZXJOdW1TdHIFAAAADXVzZXJBbW91bnROZXcFAAAADGxvY2tTdGFydE5ldwUAAAAPbG9ja0R1cmF0aW9uTmV3BQAAAAFrBQAAAAFiBQAAAAZwZXJpb2QJAQAAAApTdGF0c0VudHJ5AAAABAUAAAAJcG10QW1vdW50BQAAAA1kZWx0YUR1cmF0aW9uAAAAAAAAAAAAAAAAAAAAAAAACQEAAAAMSGlzdG9yeUVudHJ5AAAACAIAAAAEbG9jawUAAAAOdXNlckFkZHJlc3NTdHIFAAAACXBtdEFtb3VudAUAAAAJbG9ja1N0YXJ0BQAAAA9sb2NrRHVyYXRpb25OZXcFAAAAAWsFAAAAAWIFAAAAAWkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEXRvdGFsQ2FjaGVkR3d4S0VZCQAAZAAAAAIFAAAADnRvdGFsQ2FjaGVkR3d4BQAAAAdnd3hEaWZmBQAAAANuaWwAAAABaQEAAAAMY2xhaW1XeEJvb3N0AAAAAgAAAAxscEFzc2V0SWRTdHIAAAAOdXNlckFkZHJlc3NTdHIDCQEAAAACIT0AAAACBQAAAA9zdGFraW5nQ29udHJhY3QIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAABJwZXJtaXNzaW9ucyBkZW5pZWQEAAAADSR0MDI0NjI1MjQ3MjcJAQAAABRpbnRlcm5hbENsYWltV3hCb29zdAAAAAMFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIHBAAAABJ1c2VyQm9vc3RBdmFpbGFibGUIBQAAAA0kdDAyNDYyNTI0NzI3AAAAAl8xBAAAAAlkYXRhU3RhdGUIBQAAAA0kdDAyNDYyNTI0NzI3AAAAAl8yBAAAAAVkZWJ1ZwgFAAAADSR0MDI0NjI1MjQ3MjcAAAACXzMJAAUUAAAAAgUAAAAJZGF0YVN0YXRlCQAETAAAAAIFAAAAEnVzZXJCb29zdEF2YWlsYWJsZQUAAAADbmlsAAAAAWkBAAAAFGNsYWltV3hCb29zdFJFQURPTkxZAAAAAgAAAAxscEFzc2V0SWRTdHIAAAAOdXNlckFkZHJlc3NTdHIEAAAADSR0MDI0ODU5MjQ5NjAJAQAAABRpbnRlcm5hbENsYWltV3hCb29zdAAAAAMFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIGBAAAABJ1c2VyQm9vc3RBdmFpbGFibGUIBQAAAA0kdDAyNDg1OTI0OTYwAAAAAl8xBAAAAAlkYXRhU3RhdGUIBQAAAA0kdDAyNDg1OTI0OTYwAAAAAl8yBAAAAAVkZWJ1ZwgFAAAADSR0MDI0ODU5MjQ5NjAAAAACXzMJAAUUAAAAAgUAAAADbmlsCQAETAAAAAIFAAAAEnVzZXJCb29zdEF2YWlsYWJsZQkABEwAAAACBQAAAAVkZWJ1ZwUAAAADbmlsAAAAAWkBAAAABnVubG9jawAAAAEAAAALdXNlckFkZHJlc3MEAAAAD3VzZXJSZWNvcmRBcnJheQkBAAAAGnJlYWRMb2NrUGFyYW1zUmVjb3JkT3JGYWlsAAAAAQUAAAALdXNlckFkZHJlc3MEAAAACnVzZXJOdW1TdHIJAAGRAAAAAgUAAAAPdXNlclJlY29yZEFycmF5BQAAAA5JZHhMb2NrVXNlck51bQQAAAAKdXNlckFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAANSWR4TG9ja0Ftb3VudAQAAAAJbG9ja1N0YXJ0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPdXNlclJlY29yZEFycmF5BQAAAAxJZHhMb2NrU3RhcnQEAAAADGxvY2tEdXJhdGlvbgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAAPSWR4TG9ja0R1cmF0aW9uBAAAAAdsb2NrRW5kCQAAZAAAAAIFAAAACWxvY2tTdGFydAUAAAAMbG9ja0R1cmF0aW9uBAAAAAhjZmdBcnJheQkBAAAAFXJlYWRDb25maWdBcnJheU9yRmFpbAAAAAAEAAAAB2Fzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAANSWR4Q2ZnQXNzZXRJZAMJAABnAAAAAgUAAAAHbG9ja0VuZAUAAAAGaGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAV3YWl0IAkAAaQAAAABBQAAAAdsb2NrRW5kAgAAAAogdG8gdW5sb2NrAwkAAGcAAAACAAAAAAAAAAAABQAAAAp1c2VyQW1vdW50CQAAAgAAAAECAAAAEW5vdGhpbmcgdG8gdW5sb2NrBAAAAAZwZXJpb2QCAAAAATAJAARNAAAAAgkABE0AAAACCQAETgAAAAIJAQAAAA9Mb2NrUGFyYW1zRW50cnkAAAAIBQAAAAt1c2VyQWRkcmVzcwUAAAAKdXNlck51bVN0cgAAAAAAAAAAAAUAAAAJbG9ja1N0YXJ0BQAAAAxsb2NrRHVyYXRpb24AAAAAAAAAAAAAAAAAAAAAAAAFAAAABnBlcmlvZAkBAAAAClN0YXRzRW50cnkAAAAECQEAAAABLQAAAAEFAAAACnVzZXJBbW91bnQAAAAAAAAAAAAAAAAAAAAAAAAA//////////8JAQAAAAxIaXN0b3J5RW50cnkAAAAIAgAAAAZ1bmxvY2sFAAAAC3VzZXJBZGRyZXNzBQAAAAp1c2VyQW1vdW50BQAAAAlsb2NrU3RhcnQFAAAADGxvY2tEdXJhdGlvbgAAAAAAAAAAAAAAAAAAAAAAAAUAAAABaQkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAALdXNlckFkZHJlc3MFAAAACnVzZXJBbW91bnQFAAAAB2Fzc2V0SWQAAAABaQEAAAATZ3d4VXNlckluZm9SRUFET05MWQAAAAEAAAALdXNlckFkZHJlc3MEAAAACWd3eEFtb3VudAkBAAAAFGNhbGNDdXJyZW50R3d4QW1vdW50AAAAAQUAAAALdXNlckFkZHJlc3MJAAUUAAAAAgUAAAADbmlsCQAETAAAAAIFAAAACWd3eEFtb3VudAUAAAADbmlsAAAAAMT/h1Q=", "chainId": 84, "height": 1826467, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ASUzbivFhwxTqanDMf1cRLKLkTo89CHKmen7MYTZby4Y Next: 7M8JiRPJcoT4Gzw7gvDqQJQxkXMBaMzWHzHsJTQnGLZv Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let SCALE8 = 8
77
88 let MULT8 = 100000000
99
1010 let POOLWEIGHTMULT = MULT8
1111
1212 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("mandatory this." + key) + " is not defined"))
1313
1414
1515 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
1616
1717
1818 func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
1919
2020
2121 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
2222
2323
2424 func asAnyList (val) = match val {
2525 case valAnyLyst: List[Any] =>
2626 valAnyLyst
2727 case _ =>
2828 throw("fail to cast into List[Any]")
2929 }
3030
3131
3232 func asInt (val) = match val {
3333 case valInt: Int =>
3434 valInt
3535 case _ =>
3636 throw("fail to cast into Int")
3737 }
3838
3939
4040 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4141
4242
4343 let IdxFactoryCfgStakingDapp = 1
4444
4545 let IdxFactoryCfgBoostingDapp = 2
4646
4747 let IdxFactoryCfgIdoDapp = 3
4848
4949 let IdxFactoryCfgTeamDapp = 4
5050
5151 let IdxFactoryCfgEmissionDapp = 5
5252
5353 let IdxFactoryCfgRestDapp = 6
5454
5555 let IdxFactoryCfgSlippageDapp = 7
5656
5757 func keyFactoryCfg () = "%s__factoryConfig"
5858
5959
6060 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
6161
6262
6363 func keyFactoryLpList () = "%s__lpTokensList"
6464
6565
6666 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
6767
6868
6969 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
7070
7171
7272 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(this, keyFactoryAddress()))
7373
7474
7575 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
7676
7777
7878 func readFactoryCfgOrFail (factory) = split(getStringOrFail(factory, keyFactoryCfg()), SEP)
7979
8080
8181 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
8282
8383
8484 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
8585
8686
8787 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
8888
8989
9090 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
9191
9292
9393 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
9494
9595
9696 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
9797
9898
9999 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
100100
101101
102102 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
103103
104104
105105 let IdxCfgAssetId = 1
106106
107107 let IdxCfgMinLockAmount = 2
108108
109109 let IdxCfgMinLockDuration = 3
110110
111111 let IdxCfgMaxLockDuration = 4
112112
113113 let IdxCfgMathContract = 5
114114
115115 func keyConfig () = "%s__config"
116116
117117
118118 func readConfigArrayOrFail () = split(getStringOrFail(this, keyConfig()), SEP)
119119
120120
121121 func formatConfigS (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = makeString(["%s%d%d%d", assetId, minLockAmount, minLockDuration, maxLockDuration, mathContract], SEP)
122122
123123
124124 func formatConfig (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = formatConfigS(assetId, toString(minLockAmount), toString(minLockDuration), toString(maxLockDuration), mathContract)
125125
126126
127127 let IdxLockUserNum = 1
128128
129129 let IdxLockAmount = 2
130130
131131 let IdxLockStart = 3
132132
133133 let IdxLockDuration = 4
134134
135135 let IdxLockParamK = 5
136136
137137 let IdxLockParamB = 6
138138
139139 func keyLockParamsRecord (userAddress) = makeString(["%s%s__lock", userAddress], SEP)
140140
141141
142142 func readLockParamsRecordOrFail (userAddress) = split(getStringOrFail(this, keyLockParamsRecord(userAddress)), SEP)
143143
144144
145145 func formatLockParamsRecordS (userNum,amount,start,duration,paramK,paramB,lastUpdTimestamp,gwxAmount) = makeString(["%d%d%d%d%d%d%d%d", userNum, amount, start, duration, paramK, paramB, lastUpdTimestamp, gwxAmount], SEP)
146146
147147
148148 func formatLockParamsRecord (userNum,amount,start,duration,paramK,paramB,gwxAmount) = formatLockParamsRecordS(userNum, toString(amount), toString(start), toString(duration), toString(paramK), toString(paramB), toString(lastBlock.timestamp), toString(gwxAmount))
149149
150150
151151 func keyNextUserNum () = "%s__nextUserNum"
152152
153153
154154 func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", userAddress], SEP)
155155
156156
157157 func keyNum2UserMapping (num) = makeString(["%s%s%s__mapping__num2user", num], SEP)
158158
159159
160160 func keyLockParamUserAmount (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "amount"], SEP)
161161
162162
163163 func keyLockParamStartBlock (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "start"], SEP)
164164
165165
166166 func keyLockParamDuration (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "duration"], SEP)
167167
168168
169169 func keyLockParamK (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "k"], SEP)
170170
171171
172172 func keyLockParamB (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "b"], SEP)
173173
174174
175175 func keyLockParamByPeriodK (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "k", period], SEP)
176176
177177
178178 func keyLockParamByPeriodB (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "b", period], SEP)
179179
180180
181181 func keyLockParamTotalAmount () = "%s%s__stats__activeTotalLocked"
182182
183183
184184 func keyStatsLocksDurationSumInBlocks () = "%s%s__stats__locksDurationSumInBlocks"
185185
186186
187187 func keyStatsLocksCount () = "%s%s__stats__locksCount"
188188
189189
190190 func keyStatsUsersCount () = "%s%s__stats__activeUsersCount"
191191
192192
193193 func keyUserBoostEmissionLastINTEGRAL (userNum) = makeString(["%s%d__userBoostEmissionLastInt", userNum], SEP)
194194
195195
196196 func keyUserLpBoostEmissionLastINTEGRAL (userNum,lpAssetId) = makeString(["%s%d__userBoostEmissionLastInt", userNum, lpAssetId], SEP)
197197
198198
199199 func keyUserMaxBoostINTEGRAL (userNum) = makeString(["%s%d__maxBoostInt", userNum], SEP)
200200
201201
202202 func keyTotalMaxBoostINTEGRAL () = "%s%s__maxBoostInt__total"
203203
204204
205205 func keyUserBoostAvalaibleToClaimTotal (userNum) = makeString(["%s%d__userBoostAvaliableToClaimTotal", userNum], SEP)
206206
207207
208208 func keyUserBoostClaimed (userNum) = makeString(["%s%d__userBoostClaimed", userNum], SEP)
209209
210210
211211 func keyTotalCachedGwx () = "%s%s__gwxCached__total"
212212
213213
214214 let factoryContract = readFactoryAddressOrFail()
215215
216216 let factoryCfg = readFactoryCfgOrFail(factoryContract)
217217
218218 let emissionContract = getEmissionAddressOrFail(factoryCfg)
219219
220220 let stakingContract = getStakingAddressOrFail(factoryCfg)
221221
222222 func HistoryEntry (type,user,amount,lockStart,duration,k,b,i) = {
223223 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
224224 let historyDATA = makeString(["%d%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount), toString(lockStart), toString(duration), toString(k), toString(b)], SEP)
225225 StringEntry(historyKEY, historyDATA)
226226 }
227227
228228
229229 func StatsEntry (totalLockedInc,durationInc,lockCountInc,usersCountInc) = {
230230 let locksDurationSumInBlocksKEY = keyStatsLocksDurationSumInBlocks()
231231 let locksCountKEY = keyStatsLocksCount()
232232 let usersCountKEY = keyStatsUsersCount()
233233 let totalAmountKEY = keyLockParamTotalAmount()
234234 let locksDurationSumInBlocks = getIntOrZero(this, locksDurationSumInBlocksKEY)
235235 let locksCount = getIntOrZero(this, locksCountKEY)
236236 let usersCount = getIntOrZero(this, usersCountKEY)
237237 let totalAmount = getIntOrZero(this, totalAmountKEY)
238238 [IntegerEntry(locksDurationSumInBlocksKEY, (locksDurationSumInBlocks + durationInc)), IntegerEntry(locksCountKEY, (locksCount + lockCountInc)), IntegerEntry(usersCountKEY, (usersCount + usersCountInc)), IntegerEntry(totalAmountKEY, (totalAmount + totalLockedInc))]
239239 }
240240
241241
242242 func calcGwxAmount (kRaw,bRaw,h) = {
243243 let SCALE = 1000
244244 (((kRaw * h) + bRaw) / SCALE)
245245 }
246246
247247
248248 func LockParamsEntry (userAddress,userNum,amount,start,duration,k,b,period) = {
249249 let userAmountKEY = keyLockParamUserAmount(userNum)
250250 let startBlockKEY = keyLockParamStartBlock(userNum)
251251 let durationKEY = keyLockParamDuration(userNum)
252252 let kKEY = keyLockParamK(userNum)
253253 let bKEY = keyLockParamB(userNum)
254254 let kByPerioKEY = keyLockParamByPeriodK(userNum, period)
255255 let bByPeriodKEY = keyLockParamByPeriodB(userNum, period)
256256 let gwxAmount = calcGwxAmount(k, b, height)
257257 [IntegerEntry(userAmountKEY, amount), IntegerEntry(startBlockKEY, start), IntegerEntry(durationKEY, duration), IntegerEntry(kKEY, k), IntegerEntry(bKEY, b), IntegerEntry(kByPerioKEY, k), IntegerEntry(bByPeriodKEY, b), StringEntry(keyLockParamsRecord(userAddress), formatLockParamsRecord(userNum, amount, start, duration, k, b, gwxAmount))]
258258 }
259259
260260
261261 func extractOptionalPaymentAmountOrFail (i,expectedAssetId) = if ((size(i.payments) > 1))
262262 then throw("only one payment is allowed")
263263 else if ((size(i.payments) == 0))
264264 then 0
265265 else {
266266 let pmt = i.payments[0]
267267 if ((value(pmt.assetId) != expectedAssetId))
268268 then throw("invalid asset id in payment")
269269 else pmt.amount
270270 }
271271
272272
273273 func calcCurrentGwxAmount (userAddress) = {
274274 let EMPTY = "empty"
275275 let user2NumMappingKEY = keyUser2NumMapping(userAddress)
276276 let userNum = valueOrElse(getString(user2NumMappingKEY), EMPTY)
277277 let k = valueOrElse(getInteger(keyLockParamK(userNum)), 0)
278278 let b = valueOrElse(getInteger(keyLockParamB(userNum)), 0)
279279 let gwxAmountCalc = calcGwxAmount(k, b, height)
280280 let gwxAmount = if ((0 > gwxAmountCalc))
281281 then 0
282282 else gwxAmountCalc
283283 gwxAmount
284284 }
285285
286286
287287 func internalClaimWxBoost (lpAssetIdStr,userAddressStr,readOnly) = {
288288 let EMPTY = "EMPTY"
289289 let userRecordOrEmpty = valueOrElse(getString(this, keyLockParamsRecord(userAddressStr)), EMPTY)
290290 if ((userRecordOrEmpty == EMPTY))
291291 then $Tuple3(0, nil, "userRecord::is::empty")
292292 else {
293293 let userRecordArray = split(userRecordOrEmpty, SEP)
294294 let userNumStr = userRecordArray[IdxLockUserNum]
295295 let EMPTYSTR = "empty"
296296 let poolWeight = if ((lpAssetIdStr != EMPTYSTR))
297297 then {
298298 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
299299 getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
300300 }
301301 else if (readOnly)
302302 then 0
303303 else throw(("not readonly mode: unsupported lp asset " + lpAssetIdStr))
304304 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
305305 let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
306306 let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
307307 let h = if ((height > emissionEnd))
308308 then emissionEnd
309309 else height
310310 let dh = max([(h - emissionStart), 0])
311311 let userLpBoostEmissionLastIntegralKEY = keyUserLpBoostEmissionLastINTEGRAL(userNumStr, lpAssetIdStr)
312312 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
313313 let userBoostEmissionLastIntegral = valueOrElse(getInteger(this, userLpBoostEmissionLastIntegralKEY), getIntOrZero(this, userBoostEmissionLastIntegralKEY))
314314 let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
315315 let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
316316 if ((0 > userBoostEmissionIntegral))
317317 then throw("wrong calculations")
318318 else {
319319 let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
320320 let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
321321 let userMaxBoostInt = getIntOrZero(this, userMaxBoostIntegralKEY)
322322 let totalMaxBoostInt = getIntOrZero(this, totalMaxBoostIntegralKEY)
323323 let totalCachedGwxKEY = keyTotalCachedGwx()
324324 let totalCachedGwx = valueOrElse(getInteger(this, totalCachedGwxKEY), 0)
325325 let userCurrGwx = calcCurrentGwxAmount(userAddressStr)
326326 let userBoostAvalaibleToClaimTotalKEY = keyUserBoostAvalaibleToClaimTotal(userNumStr)
327327 let userBoostAvaliableToClaimTotal = getIntOrZero(this, userBoostAvalaibleToClaimTotalKEY)
328328 let poolUserBoostEmissionIntegral = fraction(userBoostEmissionIntegral, poolWeight, POOLWEIGHTMULT)
329329 let userBoostAvaliableToClaimTotalNew = if ((totalCachedGwx == 0))
330330 then 0
331331 else fraction(poolUserBoostEmissionIntegral, userCurrGwx, totalCachedGwx)
332332 let userBoostClaimedKEY = keyUserBoostClaimed(userNumStr)
333333 let userBoostClaimed = getIntOrZero(this, userBoostClaimedKEY)
334334 let userBoostAvailable = (userBoostAvaliableToClaimTotalNew - userBoostClaimed)
335335 let dataState = [IntegerEntry(userLpBoostEmissionLastIntegralKEY, boostEmissionIntegral)]
336336 let debug = makeString([("userBoostEmissionLastIntegral=" + toString(userBoostEmissionLastIntegral)), ("userBoostEmissionIntegral=" + toString(userBoostEmissionIntegral)), ("userMaxBoostInt=" + toString(userMaxBoostInt)), ("totalMaxBoostInt=" + toString(totalMaxBoostInt)), ("userBoostAvaliableToClaimTotal=" + toString(userBoostAvaliableToClaimTotal)), ("userBoostAvaliableToClaimTotalNew=" + toString(userBoostAvaliableToClaimTotalNew)), ("userBoostClaimed=" + toString(userBoostClaimed)), ("userBoostAvailable=" + toString(userBoostAvailable)), ("poolUserBoostEmissionIntegral=" + toString(poolUserBoostEmissionIntegral)), ("userCurrGwx=" + toString(userCurrGwx)), ("totalCachedGwx" + toString(totalCachedGwx))], "::")
337337 $Tuple3(userBoostAvaliableToClaimTotalNew, dataState, debug)
338338 }
339339 }
340340 }
341341
342342
343343 @Callable(i)
344344 func constructor (factoryAddressStr,lockAssetIdStr,minLockAmount,minDuration,maxDuration,mathContract) = if ((this != i.caller))
345345 then throw("not authorized")
346346 else ([IntegerEntry(keyNextUserNum(), 0), StringEntry(keyConfig(), formatConfig(lockAssetIdStr, minLockAmount, minDuration, maxDuration, mathContract)), StringEntry(keyFactoryAddress(), factoryAddressStr)] ++ StatsEntry(0, 0, 0, 0))
347347
348348
349349
350350 @Callable(i)
351351 func lock (duration) = {
352352 let cfgArray = readConfigArrayOrFail()
353353 let assetIdStr = cfgArray[IdxCfgAssetId]
354354 let assetId = fromBase58String(assetIdStr)
355355 let minLockAmount = parseIntValue(cfgArray[IdxCfgMinLockAmount])
356356 let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
357357 let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
358358 let mathContract = addressFromStringValue(cfgArray[IdxCfgMathContract])
359359 if ((size(i.payments) != 1))
360360 then throw("invalid payment - exact one payment must be attached")
361361 else {
362362 let pmt = i.payments[0]
363363 let pmtAmount = pmt.amount
364364 if ((assetId != value(pmt.assetId)))
365365 then throw((("invalid asset is in payment - " + assetIdStr) + " is expected"))
366366 else {
367367 let nextUserNumKEY = keyNextUserNum()
368368 let userAddressStr = toString(i.caller)
369369 let userIsExisting = isDefined(getString(keyUser2NumMapping(userAddressStr)))
370370 let userNumStr = if (userIsExisting)
371371 then value(getString(keyUser2NumMapping(userAddressStr)))
372372 else toString(getIntOrFail(this, nextUserNumKEY))
373373 let userNum = parseIntValue(userNumStr)
374374 let lockStart = height
375375 let startBlockKEY = keyLockParamStartBlock(userNumStr)
376376 let durationKEY = keyLockParamDuration(userNumStr)
377377 let userAmountKEY = keyLockParamUserAmount(userNumStr)
378378 if ((minLockAmount > pmtAmount))
379379 then throw(("amount is less then minLockAmount=" + toString(minLockAmount)))
380380 else if ((minLockDuration > duration))
381381 then throw(("passed duration is less then minLockDuration=" + toString(minLockDuration)))
382382 else if ((duration > maxLockDuration))
383383 then throw(("passed duration is greater then maxLockDuration=" + toString(maxLockDuration)))
384384 else if (if (userIsExisting)
385385 then ((getIntOrFail(this, startBlockKEY) + getIntOrFail(this, durationKEY)) >= lockStart)
386386 else false)
387387 then throw("there is an active lock - consider to use increaseLock")
388388 else {
389389 let coeffX8 = fraction(duration, MULT8, maxLockDuration)
390390 let gWxAmountStart = fraction(pmtAmount, coeffX8, MULT8)
391391 let gWxParamsResultList = asAnyList(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, lockStart, duration], nil))
392392 let k = asInt(gWxParamsResultList[0])
393393 let b = asInt(gWxParamsResultList[1])
394394 let period = toString(asInt(gWxParamsResultList[2]))
395395 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
396396 let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
397397 let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
398398 let h = if ((height > emissionEnd))
399399 then emissionEnd
400400 else height
401401 let dh = max([(h - emissionStart), 0])
402402 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
403403 let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
404404 let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
405405 let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
406406 let userMaxBoostInt = ((gWxAmountStart * duration) / 2)
407407 let totalMaxBoostInt = getIntOrZero(this, totalMaxBoostIntegralKEY)
408408 let totalCachedGwxKEY = keyTotalCachedGwx()
409409 let totalCachedGwx = valueOrElse(getInteger(this, totalCachedGwxKEY), 0)
410410 let arr = if (userIsExisting)
411411 then nil
412412 else [IntegerEntry(nextUserNumKEY, (userNum + 1)), StringEntry(keyUser2NumMapping(userAddressStr), userNumStr), StringEntry(keyNum2UserMapping(userNumStr), userAddressStr)]
413413 ((((arr ++ LockParamsEntry(userAddressStr, userNumStr, pmtAmount, lockStart, duration, k, b, period)) ++ StatsEntry(pmtAmount, duration, 1, if (userIsExisting)
414414 then 0
415415 else 1)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, duration, k, b, i)) ++ [IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral), IntegerEntry(totalCachedGwxKEY, (totalCachedGwx + gWxAmountStart))])
416416 }
417417 }
418418 }
419419 }
420420
421421
422422
423423 @Callable(i)
424424 func increaseLock (deltaDuration) = {
425425 let cfgArray = readConfigArrayOrFail()
426426 let assetIdStr = cfgArray[IdxCfgAssetId]
427427 let assetId = fromBase58String(assetIdStr)
428428 let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
429429 let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
430430 let mathContract = addressFromStringValue(cfgArray[IdxCfgMathContract])
431431 let pmtAmount = extractOptionalPaymentAmountOrFail(i, assetId)
432432 let userAddressStr = toString(i.caller)
433433 let userRecordArray = readLockParamsRecordOrFail(userAddressStr)
434434 let userNumStr = userRecordArray[IdxLockUserNum]
435435 let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
436436 let lockStart = parseIntValue(userRecordArray[IdxLockStart])
437437 let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
438438 let lockEnd = (lockStart + lockDuration)
439439 let remainingDuration = max([(lockEnd - height), 0])
440440 let userAmountNew = (userAmount + pmtAmount)
441441 let lockDurationNew = (remainingDuration + deltaDuration)
442442 if ((0 > deltaDuration))
443443 then throw("duration is less then zero")
444444 else if ((minLockDuration > lockDurationNew))
445445 then throw(("lockDurationNew is less then minLockDuration=" + toString(minLockDuration)))
446446 else if ((lockDurationNew > maxLockDuration))
447447 then throw(("deltaDuration + existedLockDuration is greater then maxLockDuration=" + toString(maxLockDuration)))
448448 else {
449449 let coeffX8 = fraction(lockDurationNew, MULT8, maxLockDuration)
450450 let gWxAmountStart = fraction(userAmountNew, coeffX8, MULT8)
451451 let lockStartNew = height
452452 let gWxParamsResultList = asAnyList(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, lockStartNew, lockDurationNew], nil))
453453 let k = asInt(gWxParamsResultList[0])
454454 let b = asInt(gWxParamsResultList[1])
455455 let period = toString(asInt(gWxParamsResultList[2]))
456456 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
457457 let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
458458 let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
459459 let h = if ((height > emissionEnd))
460460 then emissionEnd
461461 else height
462462 let dh = max([(h - emissionStart), 0])
463463 let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
464464 let userBoostEmissionLastIntegral = getIntOrZero(this, userBoostEmissionLastIntegralKEY)
465465 let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
466466 let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
467467 if ((0 > userBoostEmissionIntegral))
468468 then throw("wrong calculations")
469469 else {
470470 let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
471471 let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
472472 let userMaxBoostInt = getIntOrZero(this, userMaxBoostIntegralKEY)
473473 let totalMaxBoostInt = getIntOrZero(this, totalMaxBoostIntegralKEY)
474474 let currUserGwx = calcCurrentGwxAmount(userAddressStr)
475475 let gwxDiff = (gWxAmountStart - currUserGwx)
476476 if ((0 > gwxDiff))
477477 then throw("gwxDiff is less then 0")
478478 else {
479479 let totalCachedGwxKEY = keyTotalCachedGwx()
480480 let totalCachedGwx = valueOrElse(getInteger(this, totalCachedGwxKEY), 0)
481481 let userBoostAvalaibleToClaimTotalKEY = keyUserBoostAvalaibleToClaimTotal(userNumStr)
482482 let userBoostAvaliableToClaimTotal = getIntOrZero(this, userBoostAvalaibleToClaimTotalKEY)
483483 let userBoostAvaliableToClaimTotalNew = fraction(userBoostEmissionIntegral, currUserGwx, totalCachedGwx)
484484 let userMaxBoostIntNew = ((gWxAmountStart * lockDurationNew) / 2)
485485 let remainingUserMaxBoostInt = ((currUserGwx * remainingDuration) / 2)
486486 let userMaxBoostIntDiff = (userMaxBoostIntNew - remainingUserMaxBoostInt)
487487 (((LockParamsEntry(userAddressStr, userNumStr, userAmountNew, lockStartNew, lockDurationNew, k, b, period) ++ StatsEntry(pmtAmount, deltaDuration, 0, 0)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, lockDurationNew, k, b, i)) ++ [IntegerEntry(totalCachedGwxKEY, (totalCachedGwx + gwxDiff))])
488488 }
489489 }
490490 }
491491 }
492492
493493
494494
495495 @Callable(i)
496496 func claimWxBoost (lpAssetIdStr,userAddressStr) = if ((stakingContract != i.caller))
497497 then throw("permissions denied")
498498 else {
499499 let $t02462524727 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
500500 let userBoostAvailable = $t02462524727._1
501501 let dataState = $t02462524727._2
502502 let debug = $t02462524727._3
503503 $Tuple2(dataState, [userBoostAvailable])
504504 }
505505
506506
507507
508508 @Callable(i)
509509 func claimWxBoostREADONLY (lpAssetIdStr,userAddressStr) = {
510510 let $t02485924960 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
511511 let userBoostAvailable = $t02485924960._1
512512 let dataState = $t02485924960._2
513513 let debug = $t02485924960._3
514514 $Tuple2(nil, [userBoostAvailable, debug])
515515 }
516516
517517
518518
519519 @Callable(i)
520520 func unlock (userAddress) = {
521521 let userRecordArray = readLockParamsRecordOrFail(userAddress)
522522 let userNumStr = userRecordArray[IdxLockUserNum]
523523 let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
524524 let lockStart = parseIntValue(userRecordArray[IdxLockStart])
525525 let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
526526 let lockEnd = (lockStart + lockDuration)
527527 let cfgArray = readConfigArrayOrFail()
528528 let assetId = fromBase58String(cfgArray[IdxCfgAssetId])
529529 if ((lockEnd >= height))
530530 then throw((("wait " + toString(lockEnd)) + " to unlock"))
531531 else if ((0 >= userAmount))
532532 then throw("nothing to unlock")
533533 else {
534534 let period = "0"
535535 (((LockParamsEntry(userAddress, userNumStr, 0, lockStart, lockDuration, 0, 0, period) ++ StatsEntry(-(userAmount), 0, 0, -1)) :+ HistoryEntry("unlock", userAddress, userAmount, lockStart, lockDuration, 0, 0, i)) :+ ScriptTransfer(addressFromStringValue(userAddress), userAmount, assetId))
536536 }
537537 }
538538
539539
540540
541541 @Callable(i)
542542 func gwxUserInfoREADONLY (userAddress) = {
543543 let gwxAmount = calcCurrentGwxAmount(userAddress)
544544 $Tuple2(nil, [gwxAmount])
545545 }
546546
547547

github/deemru/w8io/026f985 
70.93 ms