tx · AHjKioTyAYGiZp7vE7zhLZaY5yPNn1xZMNcDHUrsGETQ

3P73HDkPqG15nLXevjCbmXtazHYTZbpPoPw:  -0.04100000 Waves

2023.03.24 12:49 [3569535] smart account 3P73HDkPqG15nLXevjCbmXtazHYTZbpPoPw > SELF 0.00000000 Waves

{ "type": 13, "id": "AHjKioTyAYGiZp7vE7zhLZaY5yPNn1xZMNcDHUrsGETQ", "fee": 4100000, "feeAssetId": null, "timestamp": 1679651298894, "version": 2, "chainId": 87, "sender": "3P73HDkPqG15nLXevjCbmXtazHYTZbpPoPw", "senderPublicKey": "B3jG1KiAb24bgwe28D9JKKkg9mtpiGTeEAYmQPrtHwQQ", "proofs": [ "", "36UEpjA7E2yxHFxsCx44vG5AKf9YTkSixjBjiwK5CZ64gXhQ2AWY6yLfVirXevuan7pABPBVJ1BFfceaw7qxgDHt", "65LUFEbWkxT5ghoXp3XJk32AJ6CCAywSCBtcVbwJ9rRziApvwAXDBUQgUnYEqZGB2LgGm5fmwgg9rKupRW98ojYy" ], "script": "base64:BgJiCAISAwoBCBIDCgEIEgMKAQgSBAoCCAESBQoDAggBEgUKAwgBARIECgIICBIECgIICBIECgIIARIFCgMCCAESAwoBCBIECgIIAhIDCgEIEgMKARgSAwoBGBIECgIICBIAEgBkAAdrQWN0aXZlAgZhY3RpdmUAC2tBY3RpdmVHbG9iAhRhY3RpdmVfYWxsX2NvbnRyYWN0cwAPa0RlcHJlY2F0ZWRQb29sAgtkZXByZWNhdGVkXwAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQAaa1Jld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQCHV9jdXJyZW50X3Bvb2xfZnJhY3Rpb25fcmV3YXJkABtrUmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMCHl9wcmV2aW91c19wb29sX2ZyYWN0aW9uX3Jld2FyZAATa0hlaWdodFBvb2xGcmFjdGlvbgIaX3Bvb2xfcmV3YXJkX3VwZGF0ZV9oZWlnaHQAE2tSZXdhcmRVcGRhdGVIZWlnaHQCFHJld2FyZF91cGRhdGVfaGVpZ2h0ABZrVXNlclNoYXJlVG9rZW5zU3Rha2VkAhRfc2hhcmVfdG9rZW5zX2xvY2tlZAAWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAIVX3NoYXJlX3Rva2Vuc19ibG9ja2VkABprVXNlclNoYXJlVG9rZW5zTG9ja2VkVHlwZQIaX3NoYXJlX3Rva2Vuc19ibG9ja2VkX3R5cGUAHGtVc2VyU2hhcmVUb2tlbnNMb2NrZWRIZWlnaHQCHF9zaGFyZV90b2tlbnNfYmxvY2tlZF9oZWlnaHQAF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsAhVfc2hhcmVfdG9rZW5zX3ZpcnR1YWwAFmtTaGFyZVRvdGFsU2hhcmVUb2tlbnMCGl90b3RhbF9zaGFyZV90b2tlbnNfbG9ja2VkABNrU2hhcmVUb2tlbnNWaXJ0dWFsAhtfdG90YWxfc2hhcmVfdG9rZW5zX3ZpcnR1YWwAC2tMb2NrUGFyYW1zAgxfbG9ja19wYXJhbXMADWtMb2NrV2F2ZXNGZWUCDmxvY2tfd2F2ZXNfZmVlAA5rUG9vbEJvb3N0Q29lZgILX2Jvb3N0X2NvZWYAEWtGYXJtTGFzdEludGVyZXN0Ag5fbGFzdF9pbnRlcmVzdAAVa0Zhcm1Vc2VyTGFzdEludGVyZXN0Ag5fbGFzdF9pbnRlcmVzdAASa0Jvb3N0TGFzdEludGVyZXN0AhBfbGFzdF9pbnRlcmVzdF9iABZrQm9vc3RVc2VyTGFzdEludGVyZXN0AhJfbGFzdF9pbnRlcmVzdF91X2IAE2tMYXN0SW50ZXJlc3RIZWlnaHQCFV9sYXN0X2ludGVyZXN0X2hlaWdodAAHa1NXT1BpZAIHU1dPUF9pZAAOa0F2YWlsYWJsZVNXT1ACD19hdmFpbGFibGVfU1dPUAAQa0hhcnZlc3RQb29sVm90ZQIYX2hhcnZlc3RfcG9vbF92b3RlX2dTV09QAAlrUG9vbFZvdGUCEF9wb29sX3ZvdGVfZ1NXT1AADWtVc2VyUG9vbFZvdGUCEF91c2VyX3ZvdGVfZ1NXT1AACmtQb29sU3RydWMCC19wb29sX3N0cnVjAA5rVXNlclBvb2xTdHJ1YwIQX3VzZXJfcG9vbF9zdHJ1YwAUa0hhcnZlc3RVc2VyUG9vbFZvdGUCHV9oYXJ2ZXN0X3VzZXJfcG9vbF92b3RlX2dTV09QABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AhRmaXJzdF9oYXJ2ZXN0X2hlaWdodAANa1NoYXJlTGltaXRGSAIcc2hhcmVfbGltaXRfb25fZmlyc3RfaGFydmVzdAATa1N0cmF0QkZhcm1JbnRlcmVzdAIWX3N0cmF0X2JfZmFybV9pbnRlcmVzdAANa0NwbW1Db250cmFjdAINY3BtbV9jb250cmFjdAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwAPa1RlYW1Cb3hBZGRyZXNzAhB0ZWFtX2JveF9hZGRyZXNzAA5rVm90aW5nQWRkcmVzcwIOdm90aW5nX2FkZHJlc3MAC2tHb3ZBZGRyZXNzAhJnb3Zlcm5hbmNlX2FkZHJlc3MAEWtMUEZhcm1pbmdBZGRyZXNzAgpscF9mYXJtaW5nABRrRmFybWluZ1RyZWFzdXJlQWRkcgIQZmFybWluZ190cmVhc3VyZQAGb3JhY2xlCQEHQWRkcmVzcwEBGgFXiv8IaJo1ukDNYXTyEjfepjfw+jjO6B44AA50b3RhbFZvdGVTaGFyZQCAyK+gJQALc2NhbGVWYWx1ZTgAgMLXLwALc2NhbGVWYWx1ZTYAwIQ9ABJsb2NrQm9vc3RDb2VmU2NhbGUA6AcAEGRlZlBvb2xCb29zdENvZWYA9AMADnN0YXJ0RW1pc3Npb25IANDYtQEAEHN3b3BZZWFyRW1pc3Npb24AgIDpg7HeFgANYmxvY2tzUGVyWWVhcgD6jyAAB3RlYW1GZWUAGQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwAPbW9uZXlCb3hBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUQa01vbmV5Qm94QWRkcmVzcwAOdGVhbUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ9rVGVhbUJveEFkZHJlc3MADXZvdGluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ5rVm90aW5nQWRkcmVzcwAKZ292QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFC2tHb3ZBZGRyZXNzABFhZG1pbkludm9rZVB1YktleQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRJrQWRtaW5JbnZva2VQdWJLZXkAEGxwRmFybWluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRFrTFBGYXJtaW5nQWRkcmVzcwATZmFybWluZ1RyZWFzdXJlQWRkcgkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFFGtGYXJtaW5nVHJlYXN1cmVBZGRyAAxjcG1tQ29udHJhY3QJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQ3BtbUNvbnRyYWN0AAZhY3RpdmUJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMFB2tBY3RpdmUACmFjdGl2ZUdsb2IJAQt2YWx1ZU9yRWxzZQIJAJsIAgUGb3JhY2xlBQtrQWN0aXZlR2xvYgYABFNXT1AJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa1NXT1BpZAEWZ2V0UmV3YXJkc1BlckJsb2NrSW5mbwAED2VtaXNzaW9uUGVyaW9kcwkAaQIJAGUCBQZoZWlnaHQFDnN0YXJ0RW1pc3Npb25IBQ1ibG9ja3NQZXJZZWFyCgEMY2FsY0VtaXNzaW9uAgNhY2MBaQQLJHQwNDkyODQ5NjUFA2FjYwQLY3VyRW1pc3Npb24IBQskdDA0OTI4NDk2NQJfMQQMcHJldkVtaXNzaW9uCAULJHQwNDkyODQ5NjUCXzIDCQBmAgUPZW1pc3Npb25QZXJpb2RzBQFpCQCUCgIJAGsDBQtjdXJFbWlzc2lvbgBLAGQFC2N1ckVtaXNzaW9uCQCUCgIFC2N1ckVtaXNzaW9uBQxwcmV2RW1pc3Npb24ECyR0MDUxMjM1Mjg5CgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBRBzd29wWWVhckVtaXNzaW9uBRBzd29wWWVhckVtaXNzaW9uCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxjYWxjRW1pc3Npb24CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQLY3VyRW1pc3Npb24IBQskdDA1MTIzNTI4OQJfMQQMcHJldkVtaXNzaW9uCAULJHQwNTEyMzUyODkCXzIJAJUKAwkAaQIFC2N1ckVtaXNzaW9uBQ1ibG9ja3NQZXJZZWFyCQBpAgUMcHJldkVtaXNzaW9uBQ1ibG9ja3NQZXJZZWFyCQBkAgUOc3RhcnRFbWlzc2lvbkgJAGgCBQ1ibG9ja3NQZXJZZWFyBQ9lbWlzc2lvblBlcmlvZHMBFWdldEhlaWdodEZpcnN0SGFydmVzdAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUTa0ZpcnN0SGFydmVzdEhlaWdodAAAARRnZXRGSFNoYXJlTGltaXRUb2tlbgEEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHBvb2wFDWtTaGFyZUxpbWl0RkgJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFDWtTaGFyZUxpbWl0RkgBEmdldFRvdGFsU2hhcmVUb2tlbgEEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUWa1NoYXJlVG90YWxTaGFyZVRva2VucwkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBQRwb29sBRZrU2hhcmVUb3RhbFNoYXJlVG9rZW5zAQxnZXRQb29sVm90ZWQBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNdm90aW5nQWRkcmVzcwkArAICBQRwb29sBQlrUG9vbFZvdGUJAQt2YWx1ZU9yRWxzZQIJALYJAQkAkQMCCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNdm90aW5nQWRkcmVzcwkArAICBQRwb29sBQprUG9vbFN0cnVjAgACAV8AAAAAARBnZXRVc2VyUG9vbFZvdGVkAgRwb29sBHVzZXIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNdm90aW5nQWRkcmVzcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUEcG9vbAUNa1VzZXJQb29sVm90ZQkBC3ZhbHVlT3JFbHNlAgkAtgkBCQCRAwIJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ12b3RpbmdBZGRyZXNzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQRwb29sBQ5rVXNlclBvb2xTdHJ1YwIAAgFfAAAAAAEPZ2V0U2hhcmVBc3NldElkAQRwb29sCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQV2YWx1ZQEJAKYIAQUEcG9vbAIOc2hhcmVfYXNzZXRfaWQBDmFjY291bnRCYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHRoaXMFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yAQ5jYWxjU2NhbGVWYWx1ZQIIYXNzZXRJZDEIYXNzZXRJZDIEEGFzc2V0SWQxRGVjaW1hbHMICQEFdmFsdWUBCQDsBwEFCGFzc2V0SWQxCGRlY2ltYWxzBBBhc3NldElkMkRlY2ltYWxzCAkBBXZhbHVlAQkA7AcBBQhhc3NldElkMghkZWNpbWFscwQLc2NhbGVEaWdpdHMJAGQCCQBlAgUQYXNzZXRJZDJEZWNpbWFscwUQYXNzZXRJZDFEZWNpbWFscwAICQBsBgAKAAAFC3NjYWxlRGlnaXRzAAAAAAUERE9XTgERdXNlckF2YWlsYWJsZVNXT1ACBHBvb2wEdXNlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBQ5rQXZhaWxhYmxlU1dPUAAAAQpyZXdhcmRJbmZvAQRwb29sBAskdDA3MTA0NzIxOQkBFmdldFJld2FyZHNQZXJCbG9ja0luZm8ABBp0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAgFCyR0MDcxMDQ3MjE5Al8xBBt0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMIBQskdDA3MTA0NzIxOQJfMgQYbGFzdEVtaXNzaW9uVXBkYXRlSGVpZ2h0CAULJHQwNzEwNDcyMTkCXzMEGXJld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHBvb2wFGmtSZXdhcmRQb29sRnJhY3Rpb25DdXJyZW50CQCsAgIJAKwCAgkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBQRwb29sBRprUmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAIMIGF0IGFkZHJlc3MgCQClCAEFCmdvdkFkZHJlc3MEEnJld2FyZFVwZGF0ZUhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCmdvdkFkZHJlc3MFE2tSZXdhcmRVcGRhdGVIZWlnaHQJAKwCAgkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBRNrUmV3YXJkVXBkYXRlSGVpZ2h0AgwgYXQgYWRkcmVzcyAJAKUIAQUKZ292QWRkcmVzcwQWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHBvb2wFE2tIZWlnaHRQb29sRnJhY3Rpb24FEnJld2FyZFVwZGF0ZUhlaWdodAQacmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHBvb2wFG2tSZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwkArAICCQCsAgIJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUEcG9vbAUba1Jld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzAgwgYXQgYWRkcmVzcyAJAKUIAQUKZ292QWRkcmVzcwQRcmV3YXJkUG9vbEN1cnJlbnQJAGsDBRp0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAUZcmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAUOdG90YWxWb3RlU2hhcmUEEnJld2FyZFBvb2xQcmV2aW91cwkAawMFGnRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50BRpyZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwUOdG90YWxWb3RlU2hhcmUEFXJld2FyZFBvb2xQcmV2Q3VycmVudAkAawMFG3RvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwUZcmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAUOdG90YWxWb3RlU2hhcmUEFnJld2FyZFBvb2xQcmV2UHJldmlvdXMJAGsDBRt0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMFGnJld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzBQ50b3RhbFZvdGVTaGFyZQMDCQBmAgURcmV3YXJkUG9vbEN1cnJlbnQFGnRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50BgkAZgIFEnJld2FyZFBvb2xQcmV2aW91cwUbdG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzCQACAQJicmV3YXJkUG9vbEN1cnJlbnQgPiB0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudCBvciByZXdhcmRQb29sUHJldmlvdXMgPiB0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMJAJkKBwURcmV3YXJkUG9vbEN1cnJlbnQFEnJld2FyZFVwZGF0ZUhlaWdodAUScmV3YXJkUG9vbFByZXZpb3VzBRZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BRhsYXN0RW1pc3Npb25VcGRhdGVIZWlnaHQFFXJld2FyZFBvb2xQcmV2Q3VycmVudAUWcmV3YXJkUG9vbFByZXZQcmV2aW91cwETZ2V0TGFzdEludGVyZXN0SW5mbwEEcG9vbAQMZmFybUludGVyZXN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAQNYm9vc3RJbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAAABBJsYXN0SW50ZXJlc3RIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrTGFzdEludGVyZXN0SGVpZ2h0BQZoZWlnaHQJAJUKAwUSbGFzdEludGVyZXN0SGVpZ2h0BQxmYXJtSW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QBC2NhbGNGYXJtUndkAgRwb29sDmN1clRvdGFsUmV3YXJkBA1wb29sQm9vc3RDb2VmCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xCb29zdENvZWYFEGRlZlBvb2xCb29zdENvZWYJAGsDBQ5jdXJUb3RhbFJld2FyZAUSbG9ja0Jvb3N0Q29lZlNjYWxlCQBkAgUNcG9vbEJvb3N0Q29lZgUSbG9ja0Jvb3N0Q29lZlNjYWxlAQxjYWxjQm9vc3RSd2QCBHBvb2wOY3VyVG90YWxSZXdhcmQEDXBvb2xCb29zdENvZWYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbEJvb3N0Q29lZgUQZGVmUG9vbEJvb3N0Q29lZgkAawMFDmN1clRvdGFsUmV3YXJkBQ1wb29sQm9vc3RDb2VmCQBkAgUNcG9vbEJvb3N0Q29lZgUSbG9ja0Jvb3N0Q29lZlNjYWxlAQxjYWxjSW50ZXJlc3QMBHBvb2wSbGFzdEludGVyZXN0SGVpZ2h0EnJld2FyZFVwZGF0ZUhlaWdodBZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0DGZhcm1JbnRlcmVzdA1ib29zdEludGVyZXN0CXBvb2xWb3RlZBVjdXJyZW50UmV3YXJkUGVyQmxvY2sQc2hhcmVUb2tlbkxvY2tlZBZwcmV2aW91c1Jld2FyZFBlckJsb2NrCnNjYWxlVmFsdWUIdG9IZWlnaHQEDSR0MDEwMjMzMTE0MTgDAwMJAGYCBRJyZXdhcmRVcGRhdGVIZWlnaHQFCHRvSGVpZ2h0CQAAAgUScmV3YXJkVXBkYXRlSGVpZ2h0BRZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BwYDCQBmAgUIdG9IZWlnaHQFEnJld2FyZFVwZGF0ZUhlaWdodAkBAiE9AgUScmV3YXJkVXBkYXRlSGVpZ2h0BRZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BwQBcgkAaAIFFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAGUCBQh0b0hlaWdodAUSbGFzdEludGVyZXN0SGVpZ2h0CQCVCgMFAXIFDGZhcm1JbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAMDAwkAZgIFCHRvSGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQJAAACBRJyZXdhcmRVcGRhdGVIZWlnaHQFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQHCQBmAgUSbGFzdEludGVyZXN0SGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQHBAFyCQBoAgUVY3VycmVudFJld2FyZFBlckJsb2NrCQBlAgUIdG9IZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAkAlQoDBQFyBQxmYXJtSW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QECXJ3ZEJmclVwZAkAaAIFFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAGUCBRJyZXdhcmRVcGRhdGVIZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAQGZkJmclVwCQBkAgUMZmFybUludGVyZXN0CQBrAwkBC2NhbGNGYXJtUndkAgUEcG9vbAUJcndkQmZyVXBkBQpzY2FsZVZhbHVlBRBzaGFyZVRva2VuTG9ja2VkBAZiQmZyVXAJAGQCBQ1ib29zdEludGVyZXN0AwkAZgIFCXBvb2xWb3RlZAAACQBrAwkBDGNhbGNCb29zdFJ3ZAIFBHBvb2wFCXJ3ZEJmclVwZAULc2NhbGVWYWx1ZTgFCXBvb2xWb3RlZAAABANyd2QJAGgCBRVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAGUCBQh0b0hlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0CQCVCgMFA3J3ZAUGZkJmclVwBQZiQmZyVXAEBnJld2FyZAgFDSR0MDEwMjMzMTE0MTgCXzEEDmZhcm1JbnRyQmVmb3JlCAUNJHQwMTAyMzMxMTQxOAJfMgQPYm9vc3RJbnRyQmVmb3JlCAUNJHQwMTAyMzMxMTQxOAJfMwQPbmV3RmFybUludGVyZXN0CQBkAgUOZmFybUludHJCZWZvcmUJAGsDCQELY2FsY0Zhcm1Sd2QCBQRwb29sBQZyZXdhcmQFCnNjYWxlVmFsdWUFEHNoYXJlVG9rZW5Mb2NrZWQEEG5ld0Jvb3N0SW50ZXJlc3QJAGQCBQ9ib29zdEludHJCZWZvcmUDCQBmAgUJcG9vbFZvdGVkAAAJAGsDCQEMY2FsY0Jvb3N0UndkAgUEcG9vbAUGcmV3YXJkBQtzY2FsZVZhbHVlOAUJcG9vbFZvdGVkAAAJAJQKAgUPbmV3RmFybUludGVyZXN0BRBuZXdCb29zdEludGVyZXN0AQljbGFpbUNhbGMCBHBvb2wEdXNlcgQKc2NhbGVWYWx1ZQkBDmNhbGNTY2FsZVZhbHVlAgUEU1dPUAkBD2dldFNoYXJlQXNzZXRJZAEFBHBvb2wECXBvb2xWb3RlZAkBDGdldFBvb2xWb3RlZAEFBHBvb2wECnVQb29sVm90ZWQJARBnZXRVc2VyUG9vbFZvdGVkAgUEcG9vbAUEdXNlcgQKc2hhcmVUb2tlbgkBEmdldFRvdGFsU2hhcmVUb2tlbgEFBHBvb2wEEXRvdGFsU2hhcmVWaXJ0dWFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAUKc2hhcmVUb2tlbgQSc3RyYXRCRmFybUludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1N0cmF0QkZhcm1JbnRlcmVzdAAABA0kdDAxMjI1NjEyMzM3CQETZ2V0TGFzdEludGVyZXN0SW5mbwEFBHBvb2wEEmxhc3RJbnRlcmVzdEhlaWdodAgFDSR0MDEyMjU2MTIzMzcCXzEEDGZhcm1JbnRlcmVzdAgFDSR0MDEyMjU2MTIzMzcCXzIEDWJvb3N0SW50ZXJlc3QIBQ0kdDAxMjI1NjEyMzM3Al8zBA0kdDAxMjM0MjEyNTk5CQEKcmV3YXJkSW5mbwEFBHBvb2wEFWN1cnJlbnRSZXdhcmRQZXJCbG9jawgFDSR0MDEyMzQyMTI1OTkCXzEEEnJld2FyZFVwZGF0ZUhlaWdodAgFDSR0MDEyMzQyMTI1OTkCXzIEFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sIBQ0kdDAxMjM0MjEyNTk5Al8zBBZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CAUNJHQwMTIzNDIxMjU5OQJfNAQUZW1pc3Npb25VcGRhdGVIZWlnaHQIBQ0kdDAxMjM0MjEyNTk5Al81BBlwcmV2Q3VycmVudFJld2FyZFBlckJsb2NrCAUNJHQwMTIzNDIxMjU5OQJfNgQacHJldlByZXZpb3VzUmV3YXJkUGVyQmxvY2sIBQ0kdDAxMjM0MjEyNTk5Al83BA11RmFybUludGVyZXN0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFWtGYXJtVXNlckxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0BA51Qm9vc3RJbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrQm9vc3RVc2VyTGFzdEludGVyZXN0AwMJAGYCBRJzdHJhdEJGYXJtSW50ZXJlc3QFDXVGYXJtSW50ZXJlc3QJAGYCBQp1UG9vbFZvdGVkAAAHAAAFDWJvb3N0SW50ZXJlc3QEEnVTaGFyZVRva2Vuc1N0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkAAAEEHVTaGFyZVRva2Vuc1ZpcnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFEnVTaGFyZVRva2Vuc1N0YWtlZAMJAAACBRF0b3RhbFNoYXJlVmlydHVhbAAABAp0b1RyZWFzdXJ5AwkAZgIFFGVtaXNzaW9uVXBkYXRlSGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQJAGQCCQBoAgUZcHJldkN1cnJlbnRSZXdhcmRQZXJCbG9jawkAZQIFFGVtaXNzaW9uVXBkYXRlSGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQJAGgCBRVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAGUCBQZoZWlnaHQFFGVtaXNzaW9uVXBkYXRlSGVpZ2h0CQBoAgUVY3VycmVudFJld2FyZFBlckJsb2NrCQBlAgUGaGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQECnRlYW1SZXdhcmQJAGsDBQp0b1RyZWFzdXJ5BQd0ZWFtRmVlAGQJAJcKBQUMZmFybUludGVyZXN0BQ1ib29zdEludGVyZXN0AAAJAGUCBQp0b1RyZWFzdXJ5BQp0ZWFtUmV3YXJkBQp0ZWFtUmV3YXJkBA0kdDAxMzY0MjE0Nzc5AwkAZgIFFGVtaXNzaW9uVXBkYXRlSGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQEDSR0MDE0MDU1MTQ2MTQJAQxjYWxjSW50ZXJlc3QMBQRwb29sBRJsYXN0SW50ZXJlc3RIZWlnaHQFEnJld2FyZFVwZGF0ZUhlaWdodAUWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAUMZmFybUludGVyZXN0BQ1ib29zdEludGVyZXN0BQlwb29sVm90ZWQFGXByZXZDdXJyZW50UmV3YXJkUGVyQmxvY2sFEXRvdGFsU2hhcmVWaXJ0dWFsBRpwcmV2UHJldmlvdXNSZXdhcmRQZXJCbG9jawUKc2NhbGVWYWx1ZQUUZW1pc3Npb25VcGRhdGVIZWlnaHQEE3ByZXZOZXdGYXJtSW50ZXJlc3QIBQ0kdDAxNDA1NTE0NjE0Al8xBBRwcmV2TmV3Qm9vc3RJbnRlcmVzdAgFDSR0MDE0MDU1MTQ2MTQCXzIJAJUKAwUTcHJldk5ld0Zhcm1JbnRlcmVzdAUUcHJldk5ld0Jvb3N0SW50ZXJlc3QFFGVtaXNzaW9uVXBkYXRlSGVpZ2h0CQCVCgMFDGZhcm1JbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAUSbGFzdEludGVyZXN0SGVpZ2h0BBBwcmV2RmFybUludGVyZXN0CAUNJHQwMTM2NDIxNDc3OQJfMQQRcHJldkJvb3N0SW50ZXJlc3QIBQ0kdDAxMzY0MjE0Nzc5Al8yBAhMSUhlaWdodAgFDSR0MDEzNjQyMTQ3NzkCXzMEDSR0MDE0Nzg4MTUyMTEJAQxjYWxjSW50ZXJlc3QMBQRwb29sBQhMSUhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0BRZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BRBwcmV2RmFybUludGVyZXN0BRFwcmV2Qm9vc3RJbnRlcmVzdAUJcG9vbFZvdGVkBRVjdXJyZW50UmV3YXJkUGVyQmxvY2sFEXRvdGFsU2hhcmVWaXJ0dWFsBRZwcmV2aW91c1Jld2FyZFBlckJsb2NrBQpzY2FsZVZhbHVlBQZoZWlnaHQED25ld0Zhcm1JbnRlcmVzdAgFDSR0MDE0Nzg4MTUyMTECXzEEEG5ld0Jvb3N0SW50ZXJlc3QIBQ0kdDAxNDc4ODE1MjExAl8yBAdmYXJtUndkCQBrAwUQdVNoYXJlVG9rZW5zVmlydAkAZQIFD25ld0Zhcm1JbnRlcmVzdAUNdUZhcm1JbnRlcmVzdAUKc2NhbGVWYWx1ZQQNcG9vbEJvb3N0Q29lZgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQm9vc3RDb2VmBRBkZWZQb29sQm9vc3RDb2VmBAtib29zdFJ3ZE1heAkAawMJAGsDBRB1U2hhcmVUb2tlbnNWaXJ0CQBlAgUPbmV3RmFybUludGVyZXN0CQCWAwEJAMwIAgUNdUZhcm1JbnRlcmVzdAkAzAgCBRJzdHJhdEJGYXJtSW50ZXJlc3QFA25pbAUKc2NhbGVWYWx1ZQUNcG9vbEJvb3N0Q29lZgUSbG9ja0Jvb3N0Q29lZlNjYWxlBAtjdXJCb29zdFJ3ZAkAawMJAGUCBRBuZXdCb29zdEludGVyZXN0BQ51Qm9vc3RJbnRlcmVzdAUKdVBvb2xWb3RlZAULc2NhbGVWYWx1ZTgECGJvb3N0UndkCQCXAwEJAMwIAgULYm9vc3RSd2RNYXgJAMwIAgULY3VyQm9vc3RSd2QFA25pbAQKdG9UcmVhc3VyeQkAZQIFC2Jvb3N0UndkTWF4BQhib29zdFJ3ZAQKdGVhbVJld2FyZAkAawMFCnRvVHJlYXN1cnkFB3RlYW1GZWUAZAMJAGYCAAAFCnRvVHJlYXN1cnkJAAIBAg50b1RyZWFzdXJ5IDwgMAkAlwoFBQ9uZXdGYXJtSW50ZXJlc3QFEG5ld0Jvb3N0SW50ZXJlc3QJAGQCBQdmYXJtUndkBQhib29zdFJ3ZAkAZQIFCnRvVHJlYXN1cnkFCnRlYW1SZXdhcmQFCnRlYW1SZXdhcmQBG2F2YWlsYWJsZUNsYWltQ2FsY0FsbEJ5VXNlcgIFcG9vbHMEdXNlcgoBDWNhbGNBdmFpbGFibGUCA2FjYwRwb29sBA0kdDAxNjE2NTE2MTk0BQNhY2MECG5ld1Bvb2xzCAUNJHQwMTYxNjUxNjE5NAJfMQQHYW1vdW50cwgFDSR0MDE2MTY1MTYxOTQCXzIEDSR0MDE2MjAzMTYyNTYJAQljbGFpbUNhbGMCBQRwb29sBQR1c2VyBAJmaQgFDSR0MDE2MjAzMTYyNTYCXzEEAmJpCAUNJHQwMTYyMDMxNjI1NgJfMgQLY2xhaW1BbW91bnQIBQ0kdDAxNjIwMzE2MjU2Al8zBAJ0dAgFDSR0MDE2MjAzMTYyNTYCXzQEDWF2YWlsYWJsZUZ1bmQJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sBQR1c2VyBQtjbGFpbUFtb3VudAkAlAoCCQDNCAIFCG5ld1Bvb2xzBQRwb29sCQDNCAIFB2Ftb3VudHMFDWF2YWlsYWJsZUZ1bmQKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1jYWxjQXZhaWxhYmxlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAEVY2FuTG9ja0luRmlyc3RIYXJ2ZXN0BQRwb29sBHVzZXIVdXNlclNoYXJlVG9rZW5zU3Rha2VkCXBtdEFtb3VudAhsb2NrVHlwZQMJAGYCCQEVZ2V0SGVpZ2h0Rmlyc3RIYXJ2ZXN0AQUEcG9vbAUGaGVpZ2h0BA90b3RhbFZvdGVBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNdm90aW5nQWRkcmVzcwkArAICBQRwb29sBRBrSGFydmVzdFBvb2xWb3RlAAAEDnVzZXJWb3RlQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBHBvb2wFFGtIYXJ2ZXN0VXNlclBvb2xWb3RlAAAEEUZIU2hhcmVUb2tlbkxpbWl0CQEUZ2V0RkhTaGFyZUxpbWl0VG9rZW4BCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBBVGSFNoYXJlVG9rZW5Vc2VyTGltaXQJAGUCCQBrAwURRkhTaGFyZVRva2VuTGltaXQFDnVzZXJWb3RlQW1vdW50BQ90b3RhbFZvdGVBbW91bnQFFXVzZXJTaGFyZVRva2Vuc1N0YWtlZAMJAGYCBQhsb2NrVHlwZQAACQACAQIyWW91IGNhbid0IGxvY2sgc2hhcmVUb2tlbnMgdGlsbCBmaXJzdCBoYXJ2ZXN0IGVuZC4DCQAAAgUOdXNlclZvdGVBbW91bnQAAAkAAgECQ1lvdSBjYW4ndCBsb2NrIHNoYXJlVG9rZW5zLiBZb3UgZGlkbid0IHZvdGUgZm9yIHBvb2wgaW4gZmlyc3Qgd2Vlay4DCQBnAgUJcG10QW1vdW50BRVGSFNoYXJlVG9rZW5Vc2VyTGltaXQJAGUCBQlwbXRBbW91bnQFFUZIU2hhcmVUb2tlblVzZXJMaW1pdAAAAAABDWdldExvY2tQYXJhbXMBBHR5cGUECmxvY2tQYXJhbXMJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgkApAMBBQR0eXBlBQtrTG9ja1BhcmFtcwkArAICAh5UaGVyZSBhcmUgbm8ga2V5IGZvciBsb2NrIHR5cGUJAKQDAQUEdHlwZQIBXwkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKbG9ja1BhcmFtcwAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKbG9ja1BhcmFtcwABAQdzdXNwZW5kAQVjYXVzZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcJAMwIAgkBC1N0cmluZ0VudHJ5AgUGa0NhdXNlBQVjYXVzZQUDbmlsAQhpc0FjdGl2ZQADAwUGYWN0aXZlBQphY3RpdmVHbG9iBwUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBC2lzQWRtaW5DYWxsAQFpAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMFA25pbAgFAWkPY2FsbGVyUHVibGljS2V5BQR1bml0CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1Bvb2xDYWxsAgFpBHBvb2wDAwkAAAIJAKUIAQgFAWkGY2FsbGVyBQRwb29sBgkAAAIIBQFpBmNhbGxlcgUMY3BtbUNvbnRyYWN0BQR1bml0CQACAQIgT25seSBwb29sIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BEWdldERlcHJlY2F0ZWRQb29sAQRwb29sCQELdmFsdWVPckVsc2UCCQCbCAIFBm9yYWNsZQkArAICBQ9rRGVwcmVjYXRlZFBvb2wFBHBvb2wHARBpc0RlcHJlY2F0ZWRQb29sAQRwb29sAwkBASEBCQERZ2V0RGVwcmVjYXRlZFBvb2wBBQRwb29sBQR1bml0CQACAQIvUG9vbCBpcyBkZXByZWNhdGVkLiBPbmx5IHVubG9jayBhY3Rpb24gYWxsb3dlZC4BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgETY2FsY0xvY2tTaGFyZVRva2VucwQBaQZjYWxsZXIEcG9vbAhsb2NrVHlwZQQMc2hhcmVBc3NldElkCQEPZ2V0U2hhcmVBc3NldElkAQUEcG9vbAQEdXNlcgkApQgBBQZjYWxsZXIECnRvdGFsU2hhcmUJARJnZXRUb3RhbFNoYXJlVG9rZW4BBQRwb29sBBF0b3RhbFNoYXJlVmlydHVhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwFCnRvdGFsU2hhcmUEEHVzZXJTdGFrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAAABA91c2VyTG9ja2VkSGVpZ3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUca1VzZXJTaGFyZVRva2Vuc0xvY2tlZEhlaWdodAAABBB1c2VyTG9ja2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNMb2NrZWQAAAQRdXNlckFtb3VudFZpcnR1YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFEHVzZXJTdGFrZWRBbW91bnQEFHRvdGFsVXNlclNoYXJlVG9rZW5zCQBkAgkAZAIFEHVzZXJTdGFrZWRBbW91bnQFEHVzZXJMb2NrZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA0kdDAxOTM4MDE5NDMyCQENZ2V0TG9ja1BhcmFtcwEFCGxvY2tUeXBlBApsb2NrUGVyaW9kCAUNJHQwMTkzODAxOTQzMgJfMQQIbG9ja0NvZWYIBQ0kdDAxOTM4MDE5NDMyAl8yBAxsb2NrV2F2ZXNGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDWtMb2NrV2F2ZXNGZWUDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDHNoYXJlQXNzZXRJZAkAAgECG1dyb25nIHNoYXJldG9rZW4gaW4gcGF5bWVudAMJAGcCAAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQACAQIlUGF5bWVudCBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCGxvY2tUeXBlCQACAQIVbG9ja1R5cGUgbXVzdCBiZSA+PSAwBBVzaGFyZVRva2Vuc0NoYW5nZU9uRkgJARVjYW5Mb2NrSW5GaXJzdEhhcnZlc3QFBQRwb29sBQR1c2VyBRB1c2VyU3Rha2VkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIbG9ja1R5cGUDCQAAAgUVc2hhcmVUb2tlbnNDaGFuZ2VPbkZIBRVzaGFyZVRva2Vuc0NoYW5nZU9uRkgEDSR0MDE5ODU5MjE3OTMDCQAAAgUIbG9ja1R5cGUAAAQUdXNlckFtb3VudFZpcnR1YWxOZXcJAGUCCQBkAgURdXNlckFtb3VudFZpcnR1YWwICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BRVzaGFyZVRva2Vuc0NoYW5nZU9uRkgJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAkAZQIJAGQCBRB1c2VyU3Rha2VkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUVc2hhcmVUb2tlbnNDaGFuZ2VPbkZICQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUUdXNlckFtb3VudFZpcnR1YWxOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAkAZQIJAGQCBRF0b3RhbFNoYXJlVmlydHVhbAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwJAGUCCQBkAgUKdG90YWxTaGFyZQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAMDCQAAAgUPdXNlckxvY2tlZEhlaWd0AAADAwkAZgIAAgkAkAMBCAUBaQhwYXltZW50cwYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAEHYXNzZXRJZAUEdW5pdAYJAGYCBQxsb2NrV2F2ZXNGZWUICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50BwkAAgEJAKwCAgkArAICAitZb3UgbmVlZCB0byBwYXkgYWRkaXRpb25hbCB3YXZlcyBjb21pc3Npb24gCQCkAwEFDGxvY2tXYXZlc0ZlZQIFV0FWRVMDCQBmAgUPdXNlckxvY2tlZEhlaWd0CQBkAgUGaGVpZ2h0BQpsb2NrUGVyaW9kCQACAQJPWW91IGNhbm5vdCBsb2NrIHNoYXJldG9rZW5zIGZvciBhIHBlcmlvZCBsZXNzIHRoYW4gd2hhdCB5b3UgaGF2ZSBhbHJlYWR5IGxvY2tlZAQTdXNlckxvY2tlZEFtb3VudE5ldwkAZAIFEHVzZXJMb2NrZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBJ1c2VyTG9ja2VkSGVpZ3ROZXcJAGQCBQZoZWlnaHQFCmxvY2tQZXJpb2QEFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQBkAgkAawMFE3VzZXJMb2NrZWRBbW91bnROZXcFCGxvY2tDb2VmBRJsb2NrQm9vc3RDb2VmU2NhbGUFEHVzZXJTdGFrZWRBbW91bnQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAUTdXNlckxvY2tlZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUca1VzZXJTaGFyZVRva2Vuc0xvY2tlZEhlaWdodAUSdXNlckxvY2tlZEhlaWd0TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRprVXNlclNoYXJlVG9rZW5zTG9ja2VkVHlwZQUIbG9ja1R5cGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRR1c2VyQW1vdW50VmlydHVhbE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsCQBkAgkAZQIFEXRvdGFsU2hhcmVWaXJ0dWFsBRF1c2VyQW1vdW50VmlydHVhbAUUdXNlckFtb3VudFZpcnR1YWxOZXcFA25pbAkAZAIFCnRvdGFsU2hhcmUICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAtsb2NrRW50cmllcwgFDSR0MDE5ODU5MjE3OTMCXzEEDXRvdGFsU2hhcmVOZXcIBQ0kdDAxOTg1OTIxNzkzAl8yAwkAZgIFDXRvdGFsU2hhcmVOZXcJAQ5hY2NvdW50QmFsYW5jZQEFDHNoYXJlQXNzZXRJZAkAAgECMEJhbGFuY2Ugb2Ygc2hhcmUtdG9rZW4gaXMgbG93ZXIgdGhhbiB0b3RhbEFtb3VudAQNJHQwMjE5MTgyMjAxMgkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDIxOTE4MjIwMTICXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAyMTkxODIyMDEyAl8yBAtjbGFpbUFtb3VudAgFDSR0MDIxOTE4MjIwMTICXzMECnRvVHJlYXN1cmUIBQ0kdDAyMTkxODIyMDEyAl80BAp0ZWFtUmV3YXJkCAUNJHQwMjE5MTgyMjAxMgJfNQQRYXZhaWxhYmxlRnVuZHNOZXcJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sBQR1c2VyBQtjbGFpbUFtb3VudAQEdXBscAMJAAACCQCdCAIJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd2ZXJzaW9uAgUzLjAuMAkA/AcEBRBscEZhcm1pbmdBZGRyZXNzAhJ1cGRhdGVVc2VySW50ZXJlc3QJAMwIAgUEdXNlcgkAzAgCBQRwb29sCQDMCAIFFHRvdGFsVXNlclNoYXJlVG9rZW5zBQNuaWwFA25pbAAAAwkAAAIFBHVwbHAFBHVwbHAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUVa0Zhcm1Vc2VyTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtCb29zdFVzZXJMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa0Zhcm1MYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRJrQm9vc3RMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFmtTaGFyZVRvdGFsU2hhcmVUb2tlbnMFDXRvdGFsU2hhcmVOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFDmtBdmFpbGFibGVTV09QBRFhdmFpbGFibGVGdW5kc05ldwkAzAgCCQEHUmVpc3N1ZQMFBFNXT1AJAGQCBQp0b1RyZWFzdXJlBQp0ZWFtUmV3YXJkBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmYXJtaW5nVHJlYXN1cmVBZGRyBQp0b1RyZWFzdXJlBQRTV09QCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDnRlYW1Cb3hBZGRyZXNzBQp0ZWFtUmV3YXJkBQRTV09QBQNuaWwFC2xvY2tFbnRyaWVzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdjYWxjV2l0aGRyYXdTaGFyZVRva2VucwQBaQZjYWxsZXIEcG9vbBlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BANpbnYDCQERZ2V0RGVwcmVjYXRlZFBvb2wBBQRwb29sCQD8BwQFBHRoaXMCGHVubG9ja1VzZXJMb2NrRGVwcmVjYXRlZAkAzAgCBQRwb29sCQDMCAIJAKUIAQUGY2FsbGVyBQNuaWwFA25pbAAAAwkAAAIFA2ludgUDaW52BA1zaGFyZVRva2Vuc0lkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQV2YWx1ZQEJAKYIAQUEcG9vbAIOc2hhcmVfYXNzZXRfaWQEBHVzZXIJAKUIAQUGY2FsbGVyBA0kdDAyMzM4MDIzNDc0CQEJY2xhaW1DYWxjAgUEcG9vbAUEdXNlcgQMZmFybUludGVyZXN0CAUNJHQwMjMzODAyMzQ3NAJfMQQNYm9vc3RJbnRlcmVzdAgFDSR0MDIzMzgwMjM0NzQCXzIEC2NsYWltQW1vdW50CAUNJHQwMjMzODAyMzQ3NAJfMwQKdG9UcmVhc3VyZQgFDSR0MDIzMzgwMjM0NzQCXzQECnRlYW1SZXdhcmQIBQ0kdDAyMzM4MDIzNDc0Al81BBB1c2VyU3Rha2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNTdGFrZWQAAAQQdXNlckxvY2tlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zTG9ja2VkAAAEEXVzZXJBbW91bnRWaXJ0dWFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRB1c2VyU3Rha2VkQW1vdW50BBN1c2VyU3Rha2VkQW1vdW50TmV3CQBlAgUQdXNlclN0YWtlZEFtb3VudAUZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAQRYXZhaWxhYmxlRnVuZHNOZXcJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sBQR1c2VyBQtjbGFpbUFtb3VudAQQdG90YWxTaGFyZUFtb3VudAkBEmdldFRvdGFsU2hhcmVUb2tlbgEFBHBvb2wEEXRvdGFsU2hhcmVWaXJ0dWFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAUQdG90YWxTaGFyZUFtb3VudAQTdG90YWxTaGFyZUFtb3VudE5ldwkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQEFHRvdGFsU2hhcmVWaXJ0dWFsTmV3CQBlAgURdG90YWxTaGFyZVZpcnR1YWwFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQEFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQBlAgURdXNlckFtb3VudFZpcnR1YWwFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQDCQBmAgUZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAUQdXNlclN0YWtlZEFtb3VudAkAAgECLFdpdGhkcmF3IGFtb3VudCBtb3JlIHRoZW4gdXNlciBsb2NrZWQgYW1vdW50AwkAZgIJAQ5hY2NvdW50QmFsYW5jZQEFDXNoYXJlVG9rZW5zSWQFEHRvdGFsU2hhcmVBbW91bnQJAAIBAjBCYWxhbmNlIG9mIHNoYXJlLXRva2VuIGlzIGxvd2VyIHRoYW4gdG90YWxBbW91bnQEBHVwbHADCQAAAgkAnQgCCQEHQWRkcmVzcwEJANkEAQUEcG9vbAIHdmVyc2lvbgIFMy4wLjAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwISdXBkYXRlVXNlckludGVyZXN0CQDMCAIFBHVzZXIJAMwIAgUEcG9vbAkAzAgCCQBkAgUQdXNlclN0YWtlZEFtb3VudAUQdXNlckxvY2tlZEFtb3VudAUDbmlsBQNuaWwAAAMJAAACBQR1cGxwBQR1cGxwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRVrRmFybVVzZXJMYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa0Jvb3N0VXNlckxhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrTGFzdEludGVyZXN0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNTdGFrZWQFE3VzZXJTdGFrZWRBbW91bnROZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRR1c2VyQW1vdW50VmlydHVhbE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRZrU2hhcmVUb3RhbFNoYXJlVG9rZW5zBRN0b3RhbFNoYXJlQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwFFHRvdGFsU2hhcmVWaXJ0dWFsTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBQ5rQXZhaWxhYmxlU1dPUAURYXZhaWxhYmxlRnVuZHNOZXcJAMwIAgkBB1JlaXNzdWUDBQRTV09QCQBkAgUKdG9UcmVhc3VyZQUKdGVhbVJld2FyZAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmFybWluZ1RyZWFzdXJlQWRkcgUKdG9UcmVhc3VyZQUEU1dPUAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ50ZWFtQm94QWRkcmVzcwUKdGVhbVJld2FyZAUEU1dPUAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQFDXNoYXJlVG9rZW5zSWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEJY2FsY0NsYWltAwFpBHBvb2wGY2FsbGVyBA1zaGFyZVRva2Vuc0lkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQV2YWx1ZQEJAKYIAQUEcG9vbAIOc2hhcmVfYXNzZXRfaWQEBHVzZXIJAKUIAQUGY2FsbGVyBBBzaGFyZVRva2VuTG9ja2VkCQESZ2V0VG90YWxTaGFyZVRva2VuAQUEcG9vbAQNJHQwMjYwNTcyNjE1MQkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDI2MDU3MjYxNTECXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAyNjA1NzI2MTUxAl8yBAtjbGFpbUFtb3VudAgFDSR0MDI2MDU3MjYxNTECXzMECnRvVHJlYXN1cmUIBQ0kdDAyNjA1NzI2MTUxAl80BAp0ZWFtUmV3YXJkCAUNJHQwMjYwNTcyNjE1MQJfNQQNYXZhaWxhYmxlRnVuZAkAZAIJARF1c2VyQXZhaWxhYmxlU1dPUAIFBHBvb2wFBHVzZXIFC2NsYWltQW1vdW50AwkAZgIJAQ5hY2NvdW50QmFsYW5jZQEFDXNoYXJlVG9rZW5zSWQFEHNoYXJlVG9rZW5Mb2NrZWQJAAIBAjBCYWxhbmNlIG9mIHNoYXJlLXRva2VuIGlzIGxvd2VyIHRoYW4gdG90YWxBbW91bnQEBnVUcmFucwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDWF2YWlsYWJsZUZ1bmQFBFNXT1AFA25pbAUDbmlsCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUVa0Zhcm1Vc2VyTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtCb29zdFVzZXJMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa0Zhcm1MYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRJrQm9vc3RMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBQ5rQXZhaWxhYmxlU1dPUAAACQDMCAIJAQdSZWlzc3VlAwUEU1dPUAkAZAIJAGQCBQp0b1RyZWFzdXJlBQ1hdmFpbGFibGVGdW5kBQp0ZWFtUmV3YXJkBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmYXJtaW5nVHJlYXN1cmVBZGRyBQp0b1RyZWFzdXJlBQRTV09QCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDnRlYW1Cb3hBZGRyZXNzBQp0ZWFtUmV3YXJkBQRTV09QBQNuaWwFBnVUcmFucwUNYXZhaWxhYmxlRnVuZAESdW5sb2NrVXNlckxvY2tDYWxjAwFpBHBvb2wEdXNlcgQRdG90YWxTaGFyZVZpcnR1YWwJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAQQdXNlclN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkAAAEEHVzZXJMb2NrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAAABBF1c2VyQW1vdW50VmlydHVhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUQdXNlclN0YWtlZEFtb3VudAQTdXNlclN0YWtlZEFtb3VudE5ldwkAZAIFEHVzZXJTdGFrZWRBbW91bnQFEHVzZXJMb2NrZWRBbW91bnQEDSR0MDI3NjI1Mjc3MTkJAQljbGFpbUNhbGMCBQRwb29sBQR1c2VyBAxmYXJtSW50ZXJlc3QIBQ0kdDAyNzYyNTI3NzE5Al8xBA1ib29zdEludGVyZXN0CAUNJHQwMjc2MjUyNzcxOQJfMgQLY2xhaW1BbW91bnQIBQ0kdDAyNzYyNTI3NzE5Al8zBAp0b1RyZWFzdXJlCAUNJHQwMjc2MjUyNzcxOQJfNAQKdGVhbVJld2FyZAgFDSR0MDI3NjI1Mjc3MTkCXzUEEWF2YWlsYWJsZUZ1bmRzTmV3CQBkAgkBEXVzZXJBdmFpbGFibGVTV09QAgUEcG9vbAUEdXNlcgULY2xhaW1BbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFWtGYXJtVXNlckxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrQm9vc3RVc2VyTGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tMYXN0SW50ZXJlc3RIZWlnaHQFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAUTdXNlclN0YWtlZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFE3VzZXJTdGFrZWRBbW91bnROZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAkAZAIJAGUCBRF0b3RhbFNoYXJlVmlydHVhbAURdXNlckFtb3VudFZpcnR1YWwFE3VzZXJTdGFrZWRBbW91bnROZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFDmtBdmFpbGFibGVTV09QBRFhdmFpbGFibGVGdW5kc05ldwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zTG9ja2VkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFHGtVc2VyU2hhcmVUb2tlbnNMb2NrZWRIZWlnaHQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUaa1VzZXJTaGFyZVRva2Vuc0xvY2tlZFR5cGUJAMwIAgkBB1JlaXNzdWUDBQRTV09QCQBkAgUKdG9UcmVhc3VyZQUKdGVhbVJld2FyZAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmFybWluZ1RyZWFzdXJlQWRkcgUKdG9UcmVhc3VyZQUEU1dPUAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ50ZWFtQm94QWRkcmVzcwUKdGVhbVJld2FyZAUEU1dPUAUDbmlsEgFpAQRpbml0AQdlYXJseUxQAwkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUHa1NXT1BpZAkAAgECGFNXT1AgYWxyZWFkeSBpbml0aWFsaXplZAQKaW5pdEFtb3VudACAgOmDsd4WBAlTV09QaXNzdWUJAMIIBQIEU1dPUAITU1dPUCBwcm90b2NvbCB0b2tlbgUKaW5pdEFtb3VudAAIBgQGU1dPUGlkCQC4CAEFCVNXT1Bpc3N1ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkAwggFAgRTV09QAhNTV09QIHByb3RvY29sIHRva2VuBQppbml0QW1vdW50AAgGCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tTV09QaWQJANgEAQUGU1dPUGlkBQNuaWwBaQEUaW5pdFBvb2xTaGFyZUZhcm1pbmcBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUWa1NoYXJlVG90YWxTaGFyZVRva2VucwAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0AAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0AAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQESdXBkYXRlUG9vbEludGVyZXN0AQRwb29sCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AggFAWkGY2FsbGVyBQpnb3ZBZGRyZXNzCQACAQImT25seSBHb3Zlcm5hbmNlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24EBHVzZXIJAKUIAQkApwgBBRFhZG1pbkludm9rZVB1YktleQQNJHQwMjk5NTYzMDAzMAkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDI5OTU2MzAwMzACXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAyOTk1NjMwMDMwAl8yBA9ib29zdExQaW50ZXJlc3QIBQ0kdDAyOTk1NjMwMDMwAl8zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tMYXN0SW50ZXJlc3RIZWlnaHQFBmhlaWdodAUDbmlsAWkBD2xvY2tTaGFyZVRva2VucwIEcG9vbAhsb2NrVHlwZQkBC3ZhbHVlT3JFbHNlAgkBEGlzRGVwcmVjYXRlZFBvb2wBBQRwb29sCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQETY2FsY0xvY2tTaGFyZVRva2VucwQFAWkIBQFpBmNhbGxlcgUEcG9vbAUIbG9ja1R5cGUBaQEXbG9ja1NoYXJlVG9rZW5zRnJvbVBvb2wDC2NhbGxlckJ5dGVzBHBvb2wIbG9ja1R5cGUJAQt2YWx1ZU9yRWxzZQIJARBpc0RlcHJlY2F0ZWRQb29sAQUEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzUG9vbENhbGwCBQFpBQRwb29sCQETY2FsY0xvY2tTaGFyZVRva2VucwQFAWkJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMFBHBvb2wFCGxvY2tUeXBlAWkBFWxvY2tTdGFrZWRTaGFyZVRva2VucwMEcG9vbAhsb2NrVHlwZQpsb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEQaXNEZXByZWNhdGVkUG9vbAEFBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDHNoYXJlQXNzZXRJZAkBD2dldFNoYXJlQXNzZXRJZAEFBHBvb2wEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAp0b3RhbFNoYXJlCQESZ2V0VG90YWxTaGFyZVRva2VuAQUEcG9vbAQRdG90YWxTaGFyZVZpcnR1YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsBQp0b3RhbFNoYXJlBBB1c2VyU3Rha2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNTdGFrZWQAAAQPdXNlckxvY2tlZEhlaWd0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFHGtVc2VyU2hhcmVUb2tlbnNMb2NrZWRIZWlnaHQAAAQQdXNlckxvY2tlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zTG9ja2VkAAAEEXVzZXJBbW91bnRWaXJ0dWFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRB1c2VyU3Rha2VkQW1vdW50BBR0b3RhbFVzZXJTaGFyZVRva2VucwkAZAIFEHVzZXJTdGFrZWRBbW91bnQFEHVzZXJMb2NrZWRBbW91bnQEDSR0MDMxNjU5MzE3MTEJAQ1nZXRMb2NrUGFyYW1zAQUIbG9ja1R5cGUECmxvY2tQZXJpb2QIBQ0kdDAzMTY1OTMxNzExAl8xBAhsb2NrQ29lZggFDSR0MDMxNjU5MzE3MTECXzIEDGxvY2tXYXZlc0ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUNa0xvY2tXYXZlc0ZlZQMJAGYCCQEVZ2V0SGVpZ2h0Rmlyc3RIYXJ2ZXN0AQUEcG9vbAUGaGVpZ2h0CQACAQIyWW91IGNhbid0IGxvY2sgc2hhcmVUb2tlbnMgdGlsbCBmaXJzdCBoYXJ2ZXN0IGVuZC4DCQBnAgAABQhsb2NrVHlwZQkAAgECFGxvY2tUeXBlIG11c3QgYmUgPiAwAwkAZgIFCmxvY2tBbW91bnQFEHVzZXJTdGFrZWRBbW91bnQJAAIBCQCsAgICGVlvdSBjYW4ndCBsb2NrIG1vcmUgdGhhbiAJAKQDAQUQdXNlclN0YWtlZEFtb3VudAMJAGYCCQEOYWNjb3VudEJhbGFuY2UBBQxzaGFyZUFzc2V0SWQFCnRvdGFsU2hhcmUJAAIBAjBCYWxhbmNlIG9mIHNoYXJlLXRva2VuIGlzIGxvd2VyIHRoYW4gdG90YWxBbW91bnQDAwkAAAIFD3VzZXJMb2NrZWRIZWlndAAAAwMJAGYCAAEJAJADAQgFAWkIcGF5bWVudHMGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFBHVuaXQGCQBmAgUMbG9ja1dhdmVzRmVlCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAcJAAIBCQCsAgIJAKwCAgIrWW91IG5lZWQgdG8gcGF5IGFkZGl0aW9uYWwgd2F2ZXMgY29taXNzaW9uIAkApAMBBQxsb2NrV2F2ZXNGZWUCBVdBVkVTAwMJAAACBQ91c2VyTG9ja2VkSGVpZ3QAAAkAZwIAAAUKbG9ja0Ftb3VudAcJAAIBAiFsb2NrQW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQpsb2NrQW1vdW50CQACAQIbbG9ja0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlAwkAZgIFD3VzZXJMb2NrZWRIZWlndAkAZAIFBmhlaWdodAUKbG9ja1BlcmlvZAkAAgECT1lvdSBjYW5ub3QgbG9jayBzaGFyZXRva2VucyBmb3IgYSBwZXJpb2QgbGVzcyB0aGFuIHdoYXQgeW91IGhhdmUgYWxyZWFkeSBsb2NrZWQEE3VzZXJMb2NrZWRBbW91bnROZXcJAGQCBRB1c2VyTG9ja2VkQW1vdW50BQpsb2NrQW1vdW50BBN1c2VyU3Rha2VkQW1vdW50TmV3CQBlAgUQdXNlclN0YWtlZEFtb3VudAUKbG9ja0Ftb3VudAQSdXNlckxvY2tlZEhlaWd0TmV3CQBkAgUGaGVpZ2h0BQpsb2NrUGVyaW9kBBR1c2VyQW1vdW50VmlydHVhbE5ldwkAZAIJAGsDBRN1c2VyTG9ja2VkQW1vdW50TmV3BQhsb2NrQ29lZgUSbG9ja0Jvb3N0Q29lZlNjYWxlBRN1c2VyU3Rha2VkQW1vdW50TmV3BA0kdDAzMzA1NzMzMTUxCQEJY2xhaW1DYWxjAgUEcG9vbAUEdXNlcgQMZmFybUludGVyZXN0CAUNJHQwMzMwNTczMzE1MQJfMQQNYm9vc3RJbnRlcmVzdAgFDSR0MDMzMDU3MzMxNTECXzIEC2NsYWltQW1vdW50CAUNJHQwMzMwNTczMzE1MQJfMwQKdG9UcmVhc3VyZQgFDSR0MDMzMDU3MzMxNTECXzQECnRlYW1SZXdhcmQIBQ0kdDAzMzA1NzMzMTUxAl81BBFhdmFpbGFibGVGdW5kc05ldwkAZAIJARF1c2VyQXZhaWxhYmxlU1dPUAIFBHBvb2wFBHVzZXIFC2NsYWltQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkBRN1c2VyU3Rha2VkQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zTG9ja2VkBRN1c2VyTG9ja2VkQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRxrVXNlclNoYXJlVG9rZW5zTG9ja2VkSGVpZ2h0BRJ1c2VyTG9ja2VkSGVpZ3ROZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFGmtVc2VyU2hhcmVUb2tlbnNMb2NrZWRUeXBlBQhsb2NrVHlwZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwJAGQCCQBlAgURdG90YWxTaGFyZVZpcnR1YWwFEXVzZXJBbW91bnRWaXJ0dWFsBRR1c2VyQW1vdW50VmlydHVhbE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUVa0Zhcm1Vc2VyTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtCb29zdFVzZXJMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa0Zhcm1MYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRJrQm9vc3RMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBQ5rQXZhaWxhYmxlU1dPUAURYXZhaWxhYmxlRnVuZHNOZXcJAMwIAgkBB1JlaXNzdWUDBQRTV09QCQBkAgUKdG9UcmVhc3VyZQUKdGVhbVJld2FyZAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmFybWluZ1RyZWFzdXJlQWRkcgUKdG9UcmVhc3VyZQUEU1dPUAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ50ZWFtQm94QWRkcmVzcwUKdGVhbVJld2FyZAUEU1dPUAUDbmlsAWkBDnVubG9ja1VzZXJMb2NrAgRwb29sBHVzZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAED3VzZXJMb2NrZWRIZWlndAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFHGtVc2VyU2hhcmVUb2tlbnNMb2NrZWRIZWlnaHQJAKwCAgkArAICCQCsAgIJAKwCAgIRVGhlcmUgaXMgbm8gcG9vbCAFBHBvb2wCCSBvciB1c2VyIAUEdXNlcgIJd2l0aCBsb2NrAwkAZgIFD3VzZXJMb2NrZWRIZWlndAUGaGVpZ2h0CQACAQkArAICAiJZb3UgY2FuJ3QgdW5sb2NrIHNoYXJldG9rZW5zIHRpbGwgCQCkAwEFD3VzZXJMb2NrZWRIZWlndAkAzggCCQESdW5sb2NrVXNlckxvY2tDYWxjAwUBaQUEcG9vbAUEdXNlcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFDWtMb2NrV2F2ZXNGZWUFBHVuaXQFA25pbAFpARh1bmxvY2tVc2VyTG9ja0RlcHJlY2F0ZWQCBHBvb2wEdXNlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpAwkBASEBCQERZ2V0RGVwcmVjYXRlZFBvb2wBBQRwb29sCQACAQIXUG9vbCBtdXN0IGJlIGRlcHJlY2F0ZWQDCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRxrVXNlclNoYXJlVG9rZW5zTG9ja2VkSGVpZ2h0CQDOCAIJARJ1bmxvY2tVc2VyTG9ja0NhbGMDBQFpBQRwb29sBQR1c2VyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUNa0xvY2tXYXZlc0ZlZQUEdW5pdAUDbmlsBQNuaWwBaQETd2l0aGRyYXdTaGFyZVRva2VucwIEcG9vbBlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQEXY2FsY1dpdGhkcmF3U2hhcmVUb2tlbnMEBQFpCAUBaQZjYWxsZXIFBHBvb2wFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQBaQEbd2l0aGRyYXdTaGFyZVRva2Vuc0Zyb21Qb29sAwtjYWxsZXJCeXRlcwRwb29sGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc1Bvb2xDYWxsAgUBaQUEcG9vbAkBF2NhbGNXaXRoZHJhd1NoYXJlVG9rZW5zBAUBaQkBB0FkZHJlc3MBBQtjYWxsZXJCeXRlcwUEcG9vbAUZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAFpAQVjbGFpbQEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQBcgkBCWNhbGNDbGFpbQMFAWkFBHBvb2wIBQFpBmNhbGxlcgMJAAACCAUBcgJfMgAACQACAQIZWW91IGhhdmUgMCBhdmFpbGFibGUgU1dPUAUBcgFpAQ1jbGFpbUludGVybmFsAgRwb29sBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQFpCQEJY2FsY0NsYWltAwUBaQUEcG9vbAkBB0FkZHJlc3MBBQZjYWxsZXIBaQENY2xhaW1BbmRTdGFrZQEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQLY2xhaW1BbW91bnQKAAFACQD8BwQFBHRoaXMCDWNsYWltSW50ZXJuYWwJAMwIAgUEcG9vbAkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgULY2xhaW1BbW91bnQFC2NsYWltQW1vdW50AwkAAAIFC2NsYWltQW1vdW50AAAJAAIBAhlZb3UgaGF2ZSAwIGF2YWlsYWJsZSBTV09QBApzdGFrZVRvR292CQD8BwQFCmdvdkFkZHJlc3MCE2xvY2tTV09QRnJvbUZhcm1pbmcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEU1dPUAULY2xhaW1BbW91bnQFA25pbAMJAAACBQpzdGFrZVRvR292BQpzdGFrZVRvR292BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIY2xhaW1BbGwBBXBvb2xzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACgEIY2xhaW1JbnYCCmNsYWltVG90YWwEcG9vbAQLY2xhaW1BbW91bnQKAAFACQD8BwQFBHRoaXMCDWNsYWltSW50ZXJuYWwJAMwIAgUEcG9vbAkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgULY2xhaW1BbW91bnQFC2NsYWltQW1vdW50CQBkAgUKY2xhaW1Ub3RhbAULY2xhaW1BbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECmNsYWltVG90YWwKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGNsYWltSW52AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAMJAAACBQpjbGFpbVRvdGFsAAAJAAIBAhlZb3UgaGF2ZSAwIGF2YWlsYWJsZSBTV09QCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKY2xhaW1Ub3RhbAUEU1dPUAUDbmlsAWkBEGNsYWltQWxsQW5kU3Rha2UBBXBvb2xzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACgEIY2xhaW1JbnYCCmNsYWltVG90YWwEcG9vbAQLY2xhaW1BbW91bnQKAAFACQD8BwQFBHRoaXMCDWNsYWltSW50ZXJuYWwJAMwIAgUEcG9vbAkAzAgCCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgULY2xhaW1BbW91bnQFC2NsYWltQW1vdW50CQBkAgUKY2xhaW1Ub3RhbAULY2xhaW1BbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECmNsYWltVG90YWwKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGNsYWltSW52AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAMJAAACBQpjbGFpbVRvdGFsAAAJAAIBAhlZb3UgaGF2ZSAwIGF2YWlsYWJsZSBTV09QBApzdGFrZVRvR292CQD8BwQFCmdvdkFkZHJlc3MCE2xvY2tTV09QRnJvbUZhcm1pbmcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEU1dPUAUKY2xhaW1Ub3RhbAUDbmlsAwkAAAIFCnN0YWtlVG9Hb3YFCnN0YWtlVG9Hb3YFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARd1cGRhdGVVc2VyQm9vc3RJbnRlcmVzdAIEcG9vbAR1c2VyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AggFAWkGY2FsbGVyBQ12b3RpbmdBZGRyZXNzCQACAQIjT25seSB2b2l0aW5nIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24EDSR0MDM3OTc1MzgwNjkJAQljbGFpbUNhbGMCBQRwb29sBQR1c2VyBAxmYXJtSW50ZXJlc3QIBQ0kdDAzNzk3NTM4MDY5Al8xBA1ib29zdEludGVyZXN0CAUNJHQwMzc5NzUzODA2OQJfMgQLY2xhaW1BbW91bnQIBQ0kdDAzNzk3NTM4MDY5Al8zBAp0b1RyZWFzdXJlCAUNJHQwMzc5NzUzODA2OQJfNAQKdGVhbVJld2FyZAgFDSR0MDM3OTc1MzgwNjkCXzUEEWF2YWlsYWJsZUZ1bmRzTmV3CQBkAgkBEXVzZXJBdmFpbGFibGVTV09QAgUEcG9vbAUEdXNlcgULY2xhaW1BbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFWtGYXJtVXNlckxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrQm9vc3RVc2VyTGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tMYXN0SW50ZXJlc3RIZWlnaHQFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUOa0F2YWlsYWJsZVNXT1AFEWF2YWlsYWJsZUZ1bmRzTmV3CQDMCAIJAQdSZWlzc3VlAwUEU1dPUAkAZAIFCnRvVHJlYXN1cmUFCnRlYW1SZXdhcmQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFE2Zhcm1pbmdUcmVhc3VyZUFkZHIFCnRvVHJlYXN1cmUFBFNXT1AJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOdGVhbUJveEFkZHJlc3MFCnRlYW1SZXdhcmQFBFNXT1AFA25pbAFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEFBmFjdGl2ZQkAAgEJAKwCAgIiREFwcCBpcyBhbHJlYWR5IHN1c3BlbmRlZC4gQ2F1c2U6IAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQZrQ2F1c2UCGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkCQEHc3VzcGVuZAECD1BhdXNlZCBieSBhZG1pbgFpAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDBQZhY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELRGVsZXRlRW50cnkBBQZrQ2F1c2UFA25pbAECdHgBBnZlcmlmeQAEByRtYXRjaDAFAnR4BBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIqswIm", "height": 3569535, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2Lb5TwozpJz5bf5gcjpPHqGPxR7bGzocCygUU5RV1gYw Next: EDgUdwvY7a81oQRH5J5XQf9vyaTYaQZJpWKVLpPNcrW1 Diff:
OldNewDifferences
553553 then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, (userStakedAmount + userLockedAmount)], nil)
554554 else 0
555555 if ((uplp == uplp))
556- then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTotalShareTokens), totalShareAmountNew), IntegerEntry((pool + kShareTokensVirtual), totalShareVirtualNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
556+ then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTotalShareTokens), totalShareAmountNew), IntegerEntry((pool + kShareTokensVirtual), totalShareVirtualNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, (toTreasure + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
557557 else throw("Strict value is not equal to itself.")
558558 }
559559 }
565565 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
566566 let user = toString(caller)
567567 let shareTokenLocked = getTotalShareToken(pool)
568- let $t02604426138 = claimCalc(pool, user)
569- let farmInterest = $t02604426138._1
570- let boostInterest = $t02604426138._2
571- let claimAmount = $t02604426138._3
572- let toTreasure = $t02604426138._4
573- let teamReward = $t02604426138._5
568+ let $t02605726151 = claimCalc(pool, user)
569+ let farmInterest = $t02605726151._1
570+ let boostInterest = $t02605726151._2
571+ let claimAmount = $t02605726151._3
572+ let toTreasure = $t02605726151._4
573+ let teamReward = $t02605726151._5
574574 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
575575 if ((accountBalance(shareTokensId) > shareTokenLocked))
576576 then throw("Balance of share-token is lower than totalAmount")
589589 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
590590 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
591591 let userStakedAmountNew = (userStakedAmount + userLockedAmount)
592- let $t02761227706 = claimCalc(pool, user)
593- let farmInterest = $t02761227706._1
594- let boostInterest = $t02761227706._2
595- let claimAmount = $t02761227706._3
596- let toTreasure = $t02761227706._4
597- let teamReward = $t02761227706._5
592+ let $t02762527719 = claimCalc(pool, user)
593+ let farmInterest = $t02762527719._1
594+ let boostInterest = $t02762527719._2
595+ let claimAmount = $t02762527719._3
596+ let toTreasure = $t02762527719._4
597+ let teamReward = $t02762527719._5
598598 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
599599 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userStakedAmountNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userStakedAmountNew)), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), DeleteEntry((((pool + "_") + user) + kUserShareTokensLocked)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedHeight)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedType)), Reissue(SWOP, (toTreasure + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP)]
600- }
601-
602-
603-func calcWithdrawShareTokensAdmin (i,usr,pool,shareTokensWithdrawAmount) = {
604- let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
605- let user = toString(usr)
606- let $t02913529229 = claimCalc(pool, user)
607- let farmInterest = $t02913529229._1
608- let boostInterest = $t02913529229._2
609- let claimAmount = $t02913529229._3
610- let toTreasure = $t02913529229._4
611- let teamReward = $t02913529229._5
612- let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
613- let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
614- let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
615- let userStakedAmountNew = (userStakedAmount - shareTokensWithdrawAmount)
616- let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
617- let totalShareAmount = getTotalShareToken(pool)
618- let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShareAmount)
619- let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
620- let totalShareVirtualNew = (totalShareVirtual - shareTokensWithdrawAmount)
621- let userAmountVirtualNew = (userAmountVirtual - shareTokensWithdrawAmount)
622- if ((shareTokensWithdrawAmount > userStakedAmount))
623- then throw("Withdraw amount more then user locked amount")
624- else if ((accountBalance(shareTokensId) > totalShareAmount))
625- then throw("Balance of share-token is lower than totalAmount")
626- else {
627- let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
628- then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, (userStakedAmount + userLockedAmount)], nil)
629- else 0
630- if ((uplp == uplp))
631- then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTotalShareTokens), totalShareAmountNew), IntegerEntry((pool + kShareTokensVirtual), totalShareVirtualNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, (toTreasure + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP), ScriptTransfer(usr, shareTokensWithdrawAmount, shareTokensId)]
632- else throw("Strict value is not equal to itself.")
633- }
634600 }
635601
636602
656622 then throw("Only Governance can call this function")
657623 else {
658624 let user = toString(addressFromPublicKey(adminInvokePubKey))
659- let $t03260932683 = claimCalc(pool, user)
660- let farmInterest = $t03260932683._1
661- let boostInterest = $t03260932683._2
662- let boostLPinterest = $t03260932683._3
625+ let $t02995630030 = claimCalc(pool, user)
626+ let farmInterest = $t02995630030._1
627+ let boostInterest = $t02995630030._2
628+ let boostLPinterest = $t02995630030._3
663629 [IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height)]
664630 })
665631
686652 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
687653 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
688654 let totalUserShareTokens = (userStakedAmount + userLockedAmount)
689- let $t03431234364 = getLockParams(lockType)
690- let lockPeriod = $t03431234364._1
691- let lockCoef = $t03431234364._2
655+ let $t03165931711 = getLockParams(lockType)
656+ let lockPeriod = $t03165931711._1
657+ let lockCoef = $t03165931711._2
692658 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
693659 if ((getHeightFirstHarvest(pool) > height))
694660 then throw("You can't lock shareTokens till first harvest end.")
719685 let userStakedAmountNew = (userStakedAmount - lockAmount)
720686 let userLockedHeigtNew = (height + lockPeriod)
721687 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmountNew)
722- let $t03571035804 = claimCalc(pool, user)
723- let farmInterest = $t03571035804._1
724- let boostInterest = $t03571035804._2
725- let claimAmount = $t03571035804._3
726- let toTreasure = $t03571035804._4
727- let teamReward = $t03571035804._5
688+ let $t03305733151 = claimCalc(pool, user)
689+ let farmInterest = $t03305733151._1
690+ let boostInterest = $t03305733151._2
691+ let claimAmount = $t03305733151._3
692+ let toTreasure = $t03305733151._4
693+ let teamReward = $t03305733151._5
728694 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
729695 [IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew)), IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, (toTreasure + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP)]
730696 }
877843 func updateUserBoostInterest (pool,user) = valueOrElse(isActive(), if ((i.caller != votingAddress))
878844 then throw("Only voiting can call this function")
879845 else {
880- let $t04062840722 = claimCalc(pool, user)
881- let farmInterest = $t04062840722._1
882- let boostInterest = $t04062840722._2
883- let claimAmount = $t04062840722._3
884- let toTreasure = $t04062840722._4
885- let teamReward = $t04062840722._5
846+ let $t03797538069 = claimCalc(pool, user)
847+ let farmInterest = $t03797538069._1
848+ let boostInterest = $t03797538069._2
849+ let claimAmount = $t03797538069._3
850+ let toTreasure = $t03797538069._4
851+ let teamReward = $t03797538069._5
886852 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
887853 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, (toTreasure + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP)]
888854 })
900866 func activate () = valueOrElse(isAdminCall(i), if (active)
901867 then throw("DApp is already active")
902868 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
903-
904-
905-
906-@Callable(i)
907-func withdrawShareTokensAdmin (pool,shareTokensWithdrawAmount,user) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), calcWithdrawShareTokensAdmin(i, Address(fromBase58String(user)), pool, shareTokensWithdrawAmount)))
908869
909870
910871 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let kActive = "active"
55
66 let kActiveGlob = "active_all_contracts"
77
88 let kDeprecatedPool = "deprecated_"
99
1010 let kCause = "shutdown_cause"
1111
1212 let kRewardPoolFractionCurrent = "_current_pool_fraction_reward"
1313
1414 let kRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
1515
1616 let kHeightPoolFraction = "_pool_reward_update_height"
1717
1818 let kRewardUpdateHeight = "reward_update_height"
1919
2020 let kUserShareTokensStaked = "_share_tokens_locked"
2121
2222 let kUserShareTokensLocked = "_share_tokens_blocked"
2323
2424 let kUserShareTokensLockedType = "_share_tokens_blocked_type"
2525
2626 let kUserShareTokensLockedHeight = "_share_tokens_blocked_height"
2727
2828 let kUserShareTokensVirtual = "_share_tokens_virtual"
2929
3030 let kShareTotalShareTokens = "_total_share_tokens_locked"
3131
3232 let kShareTokensVirtual = "_total_share_tokens_virtual"
3333
3434 let kLockParams = "_lock_params"
3535
3636 let kLockWavesFee = "lock_waves_fee"
3737
3838 let kPoolBoostCoef = "_boost_coef"
3939
4040 let kFarmLastInterest = "_last_interest"
4141
4242 let kFarmUserLastInterest = "_last_interest"
4343
4444 let kBoostLastInterest = "_last_interest_b"
4545
4646 let kBoostUserLastInterest = "_last_interest_u_b"
4747
4848 let kLastInterestHeight = "_last_interest_height"
4949
5050 let kSWOPid = "SWOP_id"
5151
5252 let kAvailableSWOP = "_available_SWOP"
5353
5454 let kHarvestPoolVote = "_harvest_pool_vote_gSWOP"
5555
5656 let kPoolVote = "_pool_vote_gSWOP"
5757
5858 let kUserPoolVote = "_user_vote_gSWOP"
5959
6060 let kPoolStruc = "_pool_struc"
6161
6262 let kUserPoolStruc = "_user_pool_struc"
6363
6464 let kHarvestUserPoolVote = "_harvest_user_pool_vote_gSWOP"
6565
6666 let kFirstHarvestHeight = "first_harvest_height"
6767
6868 let kShareLimitFH = "share_limit_on_first_harvest"
6969
7070 let kStratBFarmInterest = "_strat_b_farm_interest"
7171
7272 let kCpmmContract = "cpmm_contract"
7373
7474 let kAdminPubKey1 = "admin_pub_1"
7575
7676 let kAdminPubKey2 = "admin_pub_2"
7777
7878 let kAdminPubKey3 = "admin_pub_3"
7979
8080 let kAdminInvokePubKey = "admin_invoke_pub"
8181
8282 let kMoneyBoxAddress = "money_box_address"
8383
8484 let kTeamBoxAddress = "team_box_address"
8585
8686 let kVotingAddress = "voting_address"
8787
8888 let kGovAddress = "governance_address"
8989
9090 let kLPFarmingAddress = "lp_farming"
9191
9292 let kFarmingTreasureAddr = "farming_treasure"
9393
9494 let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
9595
9696 let totalVoteShare = 10000000000
9797
9898 let scaleValue8 = 100000000
9999
100100 let scaleValue6 = 1000000
101101
102102 let lockBoostCoefScale = 1000
103103
104104 let defPoolBoostCoef = 500
105105
106106 let startEmissionH = 2976848
107107
108108 let swopYearEmission = 100000000000000
109109
110110 let blocksPerYear = 526330
111111
112112 let teamFee = 25
113113
114114 func getBase58FromOracle (key) = match getString(oracle, key) {
115115 case string: String =>
116116 fromBase58String(string)
117117 case nothing =>
118118 throw((key + "is empty"))
119119 }
120120
121121
122122 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
123123
124124 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
125125
126126 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
127127
128128 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
129129
130130 let teamBoxAddress = Address(getBase58FromOracle(kTeamBoxAddress))
131131
132132 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
133133
134134 let govAddress = Address(getBase58FromOracle(kGovAddress))
135135
136136 let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
137137
138138 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
139139
140140 let farmingTreasureAddr = Address(getBase58FromOracle(kFarmingTreasureAddr))
141141
142142 let cpmmContract = Address(getBase58FromOracle(kCpmmContract))
143143
144144 let active = getBooleanValue(this, kActive)
145145
146146 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
147147
148148 let SWOP = fromBase58String(getStringValue(this, kSWOPid))
149149
150150 func getRewardsPerBlockInfo () = {
151151 let emissionPeriods = ((height - startEmissionH) / blocksPerYear)
152152 func calcEmission (acc,i) = {
153153 let $t049284965 = acc
154154 let curEmission = $t049284965._1
155155 let prevEmission = $t049284965._2
156156 if ((emissionPeriods > i))
157157 then $Tuple2(fraction(curEmission, 75, 100), curEmission)
158158 else $Tuple2(curEmission, prevEmission)
159159 }
160160
161161 let $t051235289 = {
162162 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
163163 let $s = size($l)
164164 let $acc0 = $Tuple2(swopYearEmission, swopYearEmission)
165165 func $f0_1 ($a,$i) = if (($i >= $s))
166166 then $a
167167 else calcEmission($a, $l[$i])
168168
169169 func $f0_2 ($a,$i) = if (($i >= $s))
170170 then $a
171171 else throw("List size exceeds 20")
172172
173173 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
174174 }
175175 let curEmission = $t051235289._1
176176 let prevEmission = $t051235289._2
177177 $Tuple3((curEmission / blocksPerYear), (prevEmission / blocksPerYear), (startEmissionH + (blocksPerYear * emissionPeriods)))
178178 }
179179
180180
181181 func getHeightFirstHarvest (pool) = valueOrElse(getInteger(Address(fromBase58String(pool)), kFirstHarvestHeight), 0)
182182
183183
184184 func getFHShareLimitToken (pool) = valueOrErrorMessage(getInteger(pool, kShareLimitFH), ("No data on the key: " + kShareLimitFH))
185185
186186
187187 func getTotalShareToken (pool) = valueOrErrorMessage(getInteger(this, (pool + kShareTotalShareTokens)), (("No data on the key: " + pool) + kShareTotalShareTokens))
188188
189189
190190 func getPoolVoted (pool) = valueOrElse(getInteger(votingAddress, (pool + kPoolVote)), valueOrElse(parseInt(split(valueOrElse(getString(votingAddress, (pool + kPoolStruc)), ""), "_")[0]), 0))
191191
192192
193193 func getUserPoolVoted (pool,user) = valueOrElse(getInteger(votingAddress, (((user + "_") + pool) + kUserPoolVote)), valueOrElse(parseInt(split(valueOrElse(getString(votingAddress, (((user + "_") + pool) + kUserPoolStruc)), ""), "_")[0]), 0))
194194
195195
196196 func getShareAssetId (pool) = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
197197
198198
199199 func accountBalance (assetId) = match assetId {
200200 case id: ByteVector =>
201201 assetBalance(this, id)
202202 case waves: Unit =>
203203 wavesBalance(this).available
204204 case _ =>
205205 throw("Match error")
206206 }
207207
208208
209209 func calcScaleValue (assetId1,assetId2) = {
210210 let assetId1Decimals = value(assetInfo(assetId1)).decimals
211211 let assetId2Decimals = value(assetInfo(assetId2)).decimals
212212 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
213213 pow(10, 0, scaleDigits, 0, 0, DOWN)
214214 }
215215
216216
217217 func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + kAvailableSWOP)), 0)
218218
219219
220220 func rewardInfo (pool) = {
221221 let $t071047219 = getRewardsPerBlockInfo()
222222 let totalRewardPerBlockCurrent = $t071047219._1
223223 let totalRewardPerBlockPrevious = $t071047219._2
224224 let lastEmissionUpdateHeight = $t071047219._3
225225 let rewardPoolFractionCurrent = valueOrErrorMessage(getInteger(govAddress, (pool + kRewardPoolFractionCurrent)), (((("No data on the key: " + pool) + kRewardPoolFractionCurrent) + " at address ") + toString(govAddress)))
226226 let rewardUpdateHeight = valueOrErrorMessage(getInteger(govAddress, kRewardUpdateHeight), ((("No data on the key: " + kRewardUpdateHeight) + " at address ") + toString(govAddress)))
227227 let poolRewardUpdateHeight = valueOrElse(getInteger(govAddress, (pool + kHeightPoolFraction)), rewardUpdateHeight)
228228 let rewardPoolFractionPrevious = valueOrErrorMessage(getInteger(govAddress, (pool + kRewardPoolFractionPrevious)), (((("No data on the key: " + pool) + kRewardPoolFractionPrevious) + " at address ") + toString(govAddress)))
229229 let rewardPoolCurrent = fraction(totalRewardPerBlockCurrent, rewardPoolFractionCurrent, totalVoteShare)
230230 let rewardPoolPrevious = fraction(totalRewardPerBlockCurrent, rewardPoolFractionPrevious, totalVoteShare)
231231 let rewardPoolPrevCurrent = fraction(totalRewardPerBlockPrevious, rewardPoolFractionCurrent, totalVoteShare)
232232 let rewardPoolPrevPrevious = fraction(totalRewardPerBlockPrevious, rewardPoolFractionPrevious, totalVoteShare)
233233 if (if ((rewardPoolCurrent > totalRewardPerBlockCurrent))
234234 then true
235235 else (rewardPoolPrevious > totalRewardPerBlockPrevious))
236236 then throw("rewardPoolCurrent > totalRewardPerBlockCurrent or rewardPoolPrevious > totalRewardPerBlockPrevious")
237237 else $Tuple7(rewardPoolCurrent, rewardUpdateHeight, rewardPoolPrevious, poolRewardUpdateHeight, lastEmissionUpdateHeight, rewardPoolPrevCurrent, rewardPoolPrevPrevious)
238238 }
239239
240240
241241 func getLastInterestInfo (pool) = {
242242 let farmInterest = valueOrErrorMessage(getInteger(this, (pool + kFarmLastInterest)), (("No data on the key: " + pool) + kFarmLastInterest))
243243 let boostInterest = valueOrElse(getInteger(this, (pool + kBoostLastInterest)), 0)
244244 let lastInterestHeight = valueOrElse(getInteger(this, (pool + kLastInterestHeight)), height)
245245 $Tuple3(lastInterestHeight, farmInterest, boostInterest)
246246 }
247247
248248
249249 func calcFarmRwd (pool,curTotalReward) = {
250250 let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
251251 fraction(curTotalReward, lockBoostCoefScale, (poolBoostCoef + lockBoostCoefScale))
252252 }
253253
254254
255255 func calcBoostRwd (pool,curTotalReward) = {
256256 let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
257257 fraction(curTotalReward, poolBoostCoef, (poolBoostCoef + lockBoostCoefScale))
258258 }
259259
260260
261261 func calcInterest (pool,lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,farmInterest,boostInterest,poolVoted,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue,toHeight) = {
262262 let $t01023311418 = if (if (if ((rewardUpdateHeight > toHeight))
263263 then (rewardUpdateHeight == poolRewardUpdateHeight)
264264 else false)
265265 then true
266266 else if ((toHeight > rewardUpdateHeight))
267267 then (rewardUpdateHeight != poolRewardUpdateHeight)
268268 else false)
269269 then {
270270 let r = (previousRewardPerBlock * (toHeight - lastInterestHeight))
271271 $Tuple3(r, farmInterest, boostInterest)
272272 }
273273 else if (if (if ((toHeight > rewardUpdateHeight))
274274 then (rewardUpdateHeight == poolRewardUpdateHeight)
275275 else false)
276276 then (lastInterestHeight > rewardUpdateHeight)
277277 else false)
278278 then {
279279 let r = (currentRewardPerBlock * (toHeight - lastInterestHeight))
280280 $Tuple3(r, farmInterest, boostInterest)
281281 }
282282 else {
283283 let rwdBfrUpd = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
284284 let fBfrUp = (farmInterest + fraction(calcFarmRwd(pool, rwdBfrUpd), scaleValue, shareTokenLocked))
285285 let bBfrUp = (boostInterest + (if ((poolVoted > 0))
286286 then fraction(calcBoostRwd(pool, rwdBfrUpd), scaleValue8, poolVoted)
287287 else 0))
288288 let rwd = (currentRewardPerBlock * (toHeight - rewardUpdateHeight))
289289 $Tuple3(rwd, fBfrUp, bBfrUp)
290290 }
291291 let reward = $t01023311418._1
292292 let farmIntrBefore = $t01023311418._2
293293 let boostIntrBefore = $t01023311418._3
294294 let newFarmInterest = (farmIntrBefore + fraction(calcFarmRwd(pool, reward), scaleValue, shareTokenLocked))
295295 let newBoostInterest = (boostIntrBefore + (if ((poolVoted > 0))
296296 then fraction(calcBoostRwd(pool, reward), scaleValue8, poolVoted)
297297 else 0))
298298 $Tuple2(newFarmInterest, newBoostInterest)
299299 }
300300
301301
302302 func claimCalc (pool,user) = {
303303 let scaleValue = calcScaleValue(SWOP, getShareAssetId(pool))
304304 let poolVoted = getPoolVoted(pool)
305305 let uPoolVoted = getUserPoolVoted(pool, user)
306306 let shareToken = getTotalShareToken(pool)
307307 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), shareToken)
308308 let stratBFarmInterest = valueOrElse(getInteger(this, (pool + kStratBFarmInterest)), 0)
309309 let $t01225612337 = getLastInterestInfo(pool)
310310 let lastInterestHeight = $t01225612337._1
311311 let farmInterest = $t01225612337._2
312312 let boostInterest = $t01225612337._3
313313 let $t01234212599 = rewardInfo(pool)
314314 let currentRewardPerBlock = $t01234212599._1
315315 let rewardUpdateHeight = $t01234212599._2
316316 let previousRewardPerBlock = $t01234212599._3
317317 let poolRewardUpdateHeight = $t01234212599._4
318318 let emissionUpdateHeight = $t01234212599._5
319319 let prevCurrentRewardPerBlock = $t01234212599._6
320320 let prevPreviousRewardPerBlock = $t01234212599._7
321321 let uFarmInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kFarmUserLastInterest)), farmInterest)
322322 let uBoostInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostUserLastInterest)), if (if ((stratBFarmInterest > uFarmInterest))
323323 then (uPoolVoted > 0)
324324 else false)
325325 then 0
326326 else boostInterest)
327327 let uShareTokensStaked = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
328328 let uShareTokensVirt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), uShareTokensStaked)
329329 if ((totalShareVirtual == 0))
330330 then {
331331 let toTreasury = if ((emissionUpdateHeight > lastInterestHeight))
332332 then ((prevCurrentRewardPerBlock * (emissionUpdateHeight - lastInterestHeight)) + (currentRewardPerBlock * (height - emissionUpdateHeight)))
333333 else (currentRewardPerBlock * (height - lastInterestHeight))
334334 let teamReward = fraction(toTreasury, teamFee, 100)
335335 $Tuple5(farmInterest, boostInterest, 0, (toTreasury - teamReward), teamReward)
336336 }
337337 else {
338338 let $t01364214779 = if ((emissionUpdateHeight > lastInterestHeight))
339339 then {
340340 let $t01405514614 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, prevCurrentRewardPerBlock, totalShareVirtual, prevPreviousRewardPerBlock, scaleValue, emissionUpdateHeight)
341341 let prevNewFarmInterest = $t01405514614._1
342342 let prevNewBoostInterest = $t01405514614._2
343343 $Tuple3(prevNewFarmInterest, prevNewBoostInterest, emissionUpdateHeight)
344344 }
345345 else $Tuple3(farmInterest, boostInterest, lastInterestHeight)
346346 let prevFarmInterest = $t01364214779._1
347347 let prevBoostInterest = $t01364214779._2
348348 let LIHeight = $t01364214779._3
349349 let $t01478815211 = calcInterest(pool, LIHeight, rewardUpdateHeight, poolRewardUpdateHeight, prevFarmInterest, prevBoostInterest, poolVoted, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue, height)
350350 let newFarmInterest = $t01478815211._1
351351 let newBoostInterest = $t01478815211._2
352352 let farmRwd = fraction(uShareTokensVirt, (newFarmInterest - uFarmInterest), scaleValue)
353353 let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
354354 let boostRwdMax = fraction(fraction(uShareTokensVirt, (newFarmInterest - max([uFarmInterest, stratBFarmInterest])), scaleValue), poolBoostCoef, lockBoostCoefScale)
355355 let curBoostRwd = fraction((newBoostInterest - uBoostInterest), uPoolVoted, scaleValue8)
356356 let boostRwd = min([boostRwdMax, curBoostRwd])
357357 let toTreasury = (boostRwdMax - boostRwd)
358358 let teamReward = fraction(toTreasury, teamFee, 100)
359359 if ((0 > toTreasury))
360360 then throw("toTreasury < 0")
361361 else $Tuple5(newFarmInterest, newBoostInterest, (farmRwd + boostRwd), (toTreasury - teamReward), teamReward)
362362 }
363363 }
364364
365365
366366 func availableClaimCalcAllByUser (pools,user) = {
367367 func calcAvailable (acc,pool) = {
368368 let $t01616516194 = acc
369369 let newPools = $t01616516194._1
370370 let amounts = $t01616516194._2
371371 let $t01620316256 = claimCalc(pool, user)
372372 let fi = $t01620316256._1
373373 let bi = $t01620316256._2
374374 let claimAmount = $t01620316256._3
375375 let tt = $t01620316256._4
376376 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
377377 $Tuple2((newPools :+ pool), (amounts :+ availableFund))
378378 }
379379
380380 let $l = pools
381381 let $s = size($l)
382382 let $acc0 = $Tuple2(nil, nil)
383383 func $f0_1 ($a,$i) = if (($i >= $s))
384384 then $a
385385 else calcAvailable($a, $l[$i])
386386
387387 func $f0_2 ($a,$i) = if (($i >= $s))
388388 then $a
389389 else throw("List size exceeds 60")
390390
391391 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60)
392392 }
393393
394394
395395 func canLockInFirstHarvest (pool,user,userShareTokensStaked,pmtAmount,lockType) = if ((getHeightFirstHarvest(pool) > height))
396396 then {
397397 let totalVoteAmount = valueOrElse(getInteger(votingAddress, (pool + kHarvestPoolVote)), 0)
398398 let userVoteAmount = valueOrElse(getInteger(votingAddress, (((user + "_") + pool) + kHarvestUserPoolVote)), 0)
399399 let FHShareTokenLimit = getFHShareLimitToken(addressFromStringValue(pool))
400400 let FHShareTokenUserLimit = (fraction(FHShareTokenLimit, userVoteAmount, totalVoteAmount) - userShareTokensStaked)
401401 if ((lockType > 0))
402402 then throw("You can't lock shareTokens till first harvest end.")
403403 else if ((userVoteAmount == 0))
404404 then throw("You can't lock shareTokens. You didn't vote for pool in first week.")
405405 else if ((pmtAmount >= FHShareTokenUserLimit))
406406 then (pmtAmount - FHShareTokenUserLimit)
407407 else 0
408408 }
409409 else 0
410410
411411
412412 func getLockParams (type) = {
413413 let lockParams = split(valueOrErrorMessage(getString(this, (toString(type) + kLockParams)), ("There are no key for lock type" + toString(type))), "_")
414414 $Tuple2(parseIntValue(lockParams[0]), parseIntValue(lockParams[1]))
415415 }
416416
417417
418418 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
419419
420420
421421 func isActive () = if (if (active)
422422 then activeGlob
423423 else false)
424424 then unit
425425 else throw("DApp is inactive at this moment")
426426
427427
428428 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
429429 then unit
430430 else throw("Only admin can call this function")
431431
432432
433433 func isPoolCall (i,pool) = if (if ((toString(i.caller) == pool))
434434 then true
435435 else (i.caller == cpmmContract))
436436 then unit
437437 else throw("Only pool can call this function")
438438
439439
440440 func getDeprecatedPool (pool) = valueOrElse(getBoolean(oracle, (kDeprecatedPool + pool)), false)
441441
442442
443443 func isDeprecatedPool (pool) = if (!(getDeprecatedPool(pool)))
444444 then unit
445445 else throw("Pool is deprecated. Only unlock action allowed.")
446446
447447
448448 func isSelfCall (i) = if ((i.caller == this))
449449 then unit
450450 else throw("Only contract itself can call this function")
451451
452452
453453 func calcLockShareTokens (i,caller,pool,lockType) = {
454454 let shareAssetId = getShareAssetId(pool)
455455 let user = toString(caller)
456456 let totalShare = getTotalShareToken(pool)
457457 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShare)
458458 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
459459 let userLockedHeigt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), 0)
460460 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
461461 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
462462 let totalUserShareTokens = ((userStakedAmount + userLockedAmount) + i.payments[0].amount)
463463 let $t01938019432 = getLockParams(lockType)
464464 let lockPeriod = $t01938019432._1
465465 let lockCoef = $t01938019432._2
466466 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
467467 if ((i.payments[0].assetId != shareAssetId))
468468 then throw("Wrong sharetoken in payment")
469469 else if ((0 >= i.payments[0].amount))
470470 then throw("Payment amount must be greater than 0")
471471 else if ((0 > lockType))
472472 then throw("lockType must be >= 0")
473473 else {
474474 let shareTokensChangeOnFH = canLockInFirstHarvest(pool, user, userStakedAmount, i.payments[0].amount, lockType)
475475 if ((shareTokensChangeOnFH == shareTokensChangeOnFH))
476476 then {
477477 let $t01985921793 = if ((lockType == 0))
478478 then {
479479 let userAmountVirtualNew = ((userAmountVirtual + i.payments[0].amount) - shareTokensChangeOnFH)
480480 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), ((userStakedAmount + i.payments[0].amount) - shareTokensChangeOnFH)), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual + i.payments[0].amount) - shareTokensChangeOnFH)), ScriptTransfer(caller, shareTokensChangeOnFH, i.payments[0].assetId)], ((totalShare + i.payments[0].amount) - shareTokensChangeOnFH))
481481 }
482482 else if (if ((userLockedHeigt == 0))
483483 then if (if ((2 > size(i.payments)))
484484 then true
485485 else (i.payments[1].assetId != unit))
486486 then true
487487 else (lockWavesFee > i.payments[1].amount)
488488 else false)
489489 then throw((("You need to pay additional waves comission " + toString(lockWavesFee)) + "WAVES"))
490490 else if ((userLockedHeigt > (height + lockPeriod)))
491491 then throw("You cannot lock sharetokens for a period less than what you have already locked")
492492 else {
493493 let userLockedAmountNew = (userLockedAmount + i.payments[0].amount)
494494 let userLockedHeigtNew = (height + lockPeriod)
495495 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmount)
496496 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew))], (totalShare + i.payments[0].amount))
497497 }
498498 let lockEntries = $t01985921793._1
499499 let totalShareNew = $t01985921793._2
500500 if ((totalShareNew > accountBalance(shareAssetId)))
501501 then throw("Balance of share-token is lower than totalAmount")
502502 else {
503503 let $t02191822012 = claimCalc(pool, user)
504504 let farmInterest = $t02191822012._1
505505 let boostInterest = $t02191822012._2
506506 let claimAmount = $t02191822012._3
507507 let toTreasure = $t02191822012._4
508508 let teamReward = $t02191822012._5
509509 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
510510 let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
511511 then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, totalUserShareTokens], nil)
512512 else 0
513513 if ((uplp == uplp))
514514 then ([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((pool + kShareTotalShareTokens), totalShareNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, (toTreasure + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP)] ++ lockEntries)
515515 else throw("Strict value is not equal to itself.")
516516 }
517517 }
518518 else throw("Strict value is not equal to itself.")
519519 }
520520 }
521521
522522
523523 func calcWithdrawShareTokens (i,caller,pool,shareTokensWithdrawAmount) = {
524524 let inv = if (getDeprecatedPool(pool))
525525 then invoke(this, "unlockUserLockDeprecated", [pool, toString(caller)], nil)
526526 else 0
527527 if ((inv == inv))
528528 then {
529529 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
530530 let user = toString(caller)
531531 let $t02338023474 = claimCalc(pool, user)
532532 let farmInterest = $t02338023474._1
533533 let boostInterest = $t02338023474._2
534534 let claimAmount = $t02338023474._3
535535 let toTreasure = $t02338023474._4
536536 let teamReward = $t02338023474._5
537537 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
538538 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
539539 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
540540 let userStakedAmountNew = (userStakedAmount - shareTokensWithdrawAmount)
541541 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
542542 let totalShareAmount = getTotalShareToken(pool)
543543 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShareAmount)
544544 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
545545 let totalShareVirtualNew = (totalShareVirtual - shareTokensWithdrawAmount)
546546 let userAmountVirtualNew = (userAmountVirtual - shareTokensWithdrawAmount)
547547 if ((shareTokensWithdrawAmount > userStakedAmount))
548548 then throw("Withdraw amount more then user locked amount")
549549 else if ((accountBalance(shareTokensId) > totalShareAmount))
550550 then throw("Balance of share-token is lower than totalAmount")
551551 else {
552552 let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
553553 then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, (userStakedAmount + userLockedAmount)], nil)
554554 else 0
555555 if ((uplp == uplp))
556- then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTotalShareTokens), totalShareAmountNew), IntegerEntry((pool + kShareTokensVirtual), totalShareVirtualNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
556+ then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTotalShareTokens), totalShareAmountNew), IntegerEntry((pool + kShareTokensVirtual), totalShareVirtualNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, (toTreasure + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
557557 else throw("Strict value is not equal to itself.")
558558 }
559559 }
560560 else throw("Strict value is not equal to itself.")
561561 }
562562
563563
564564 func calcClaim (i,pool,caller) = {
565565 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
566566 let user = toString(caller)
567567 let shareTokenLocked = getTotalShareToken(pool)
568- let $t02604426138 = claimCalc(pool, user)
569- let farmInterest = $t02604426138._1
570- let boostInterest = $t02604426138._2
571- let claimAmount = $t02604426138._3
572- let toTreasure = $t02604426138._4
573- let teamReward = $t02604426138._5
568+ let $t02605726151 = claimCalc(pool, user)
569+ let farmInterest = $t02605726151._1
570+ let boostInterest = $t02605726151._2
571+ let claimAmount = $t02605726151._3
572+ let toTreasure = $t02605726151._4
573+ let teamReward = $t02605726151._5
574574 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
575575 if ((accountBalance(shareTokensId) > shareTokenLocked))
576576 then throw("Balance of share-token is lower than totalAmount")
577577 else {
578578 let uTrans = if ((i.caller != this))
579579 then [ScriptTransfer(i.caller, availableFund, SWOP)]
580580 else nil
581581 $Tuple2(([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), 0), Reissue(SWOP, ((toTreasure + availableFund) + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP)] ++ uTrans), availableFund)
582582 }
583583 }
584584
585585
586586 func unlockUserLockCalc (i,pool,user) = {
587587 let totalShareVirtual = getIntegerValue(this, (pool + kShareTokensVirtual))
588588 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
589589 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
590590 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
591591 let userStakedAmountNew = (userStakedAmount + userLockedAmount)
592- let $t02761227706 = claimCalc(pool, user)
593- let farmInterest = $t02761227706._1
594- let boostInterest = $t02761227706._2
595- let claimAmount = $t02761227706._3
596- let toTreasure = $t02761227706._4
597- let teamReward = $t02761227706._5
592+ let $t02762527719 = claimCalc(pool, user)
593+ let farmInterest = $t02762527719._1
594+ let boostInterest = $t02762527719._2
595+ let claimAmount = $t02762527719._3
596+ let toTreasure = $t02762527719._4
597+ let teamReward = $t02762527719._5
598598 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
599599 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userStakedAmountNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userStakedAmountNew)), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), DeleteEntry((((pool + "_") + user) + kUserShareTokensLocked)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedHeight)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedType)), Reissue(SWOP, (toTreasure + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP)]
600- }
601-
602-
603-func calcWithdrawShareTokensAdmin (i,usr,pool,shareTokensWithdrawAmount) = {
604- let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
605- let user = toString(usr)
606- let $t02913529229 = claimCalc(pool, user)
607- let farmInterest = $t02913529229._1
608- let boostInterest = $t02913529229._2
609- let claimAmount = $t02913529229._3
610- let toTreasure = $t02913529229._4
611- let teamReward = $t02913529229._5
612- let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
613- let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
614- let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
615- let userStakedAmountNew = (userStakedAmount - shareTokensWithdrawAmount)
616- let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
617- let totalShareAmount = getTotalShareToken(pool)
618- let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShareAmount)
619- let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
620- let totalShareVirtualNew = (totalShareVirtual - shareTokensWithdrawAmount)
621- let userAmountVirtualNew = (userAmountVirtual - shareTokensWithdrawAmount)
622- if ((shareTokensWithdrawAmount > userStakedAmount))
623- then throw("Withdraw amount more then user locked amount")
624- else if ((accountBalance(shareTokensId) > totalShareAmount))
625- then throw("Balance of share-token is lower than totalAmount")
626- else {
627- let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
628- then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, (userStakedAmount + userLockedAmount)], nil)
629- else 0
630- if ((uplp == uplp))
631- then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTotalShareTokens), totalShareAmountNew), IntegerEntry((pool + kShareTokensVirtual), totalShareVirtualNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, (toTreasure + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP), ScriptTransfer(usr, shareTokensWithdrawAmount, shareTokensId)]
632- else throw("Strict value is not equal to itself.")
633- }
634600 }
635601
636602
637603 @Callable(i)
638604 func init (earlyLP) = if (isDefined(getString(this, kSWOPid)))
639605 then throw("SWOP already initialized")
640606 else {
641607 let initAmount = 100000000000000
642608 let SWOPissue = Issue("SWOP", "SWOP protocol token", initAmount, 8, true)
643609 let SWOPid = calculateAssetId(SWOPissue)
644610 [BooleanEntry(kActive, true), Issue("SWOP", "SWOP protocol token", initAmount, 8, true), StringEntry(kSWOPid, toBase58String(SWOPid))]
645611 }
646612
647613
648614
649615 @Callable(i)
650616 func initPoolShareFarming (pool) = valueOrElse(isAdminCall(i), [IntegerEntry((pool + kShareTotalShareTokens), 0), IntegerEntry((pool + kFarmLastInterest), 0), IntegerEntry((pool + kBoostLastInterest), 0), IntegerEntry((pool + kLastInterestHeight), height)])
651617
652618
653619
654620 @Callable(i)
655621 func updatePoolInterest (pool) = valueOrElse(isActive(), if ((i.caller != govAddress))
656622 then throw("Only Governance can call this function")
657623 else {
658624 let user = toString(addressFromPublicKey(adminInvokePubKey))
659- let $t03260932683 = claimCalc(pool, user)
660- let farmInterest = $t03260932683._1
661- let boostInterest = $t03260932683._2
662- let boostLPinterest = $t03260932683._3
625+ let $t02995630030 = claimCalc(pool, user)
626+ let farmInterest = $t02995630030._1
627+ let boostInterest = $t02995630030._2
628+ let boostLPinterest = $t02995630030._3
663629 [IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height)]
664630 })
665631
666632
667633
668634 @Callable(i)
669635 func lockShareTokens (pool,lockType) = valueOrElse(isDeprecatedPool(pool), valueOrElse(isActive(), calcLockShareTokens(i, i.caller, pool, lockType)))
670636
671637
672638
673639 @Callable(i)
674640 func lockShareTokensFromPool (callerBytes,pool,lockType) = valueOrElse(isDeprecatedPool(pool), valueOrElse(isActive(), valueOrElse(isPoolCall(i, pool), calcLockShareTokens(i, Address(callerBytes), pool, lockType))))
675641
676642
677643
678644 @Callable(i)
679645 func lockStakedShareTokens (pool,lockType,lockAmount) = valueOrElse(isDeprecatedPool(pool), valueOrElse(isActive(), {
680646 let shareAssetId = getShareAssetId(pool)
681647 let user = toString(i.caller)
682648 let totalShare = getTotalShareToken(pool)
683649 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShare)
684650 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
685651 let userLockedHeigt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), 0)
686652 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
687653 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
688654 let totalUserShareTokens = (userStakedAmount + userLockedAmount)
689- let $t03431234364 = getLockParams(lockType)
690- let lockPeriod = $t03431234364._1
691- let lockCoef = $t03431234364._2
655+ let $t03165931711 = getLockParams(lockType)
656+ let lockPeriod = $t03165931711._1
657+ let lockCoef = $t03165931711._2
692658 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
693659 if ((getHeightFirstHarvest(pool) > height))
694660 then throw("You can't lock shareTokens till first harvest end.")
695661 else if ((0 >= lockType))
696662 then throw("lockType must be > 0")
697663 else if ((lockAmount > userStakedAmount))
698664 then throw(("You can't lock more than " + toString(userStakedAmount)))
699665 else if ((accountBalance(shareAssetId) > totalShare))
700666 then throw("Balance of share-token is lower than totalAmount")
701667 else if (if ((userLockedHeigt == 0))
702668 then if (if ((1 > size(i.payments)))
703669 then true
704670 else (i.payments[0].assetId != unit))
705671 then true
706672 else (lockWavesFee > i.payments[0].amount)
707673 else false)
708674 then throw((("You need to pay additional waves comission " + toString(lockWavesFee)) + "WAVES"))
709675 else if (if ((userLockedHeigt == 0))
710676 then (0 >= lockAmount)
711677 else false)
712678 then throw("lockAmount must be greater than 0")
713679 else if ((0 > lockAmount))
714680 then throw("lockAmount must be positive")
715681 else if ((userLockedHeigt > (height + lockPeriod)))
716682 then throw("You cannot lock sharetokens for a period less than what you have already locked")
717683 else {
718684 let userLockedAmountNew = (userLockedAmount + lockAmount)
719685 let userStakedAmountNew = (userStakedAmount - lockAmount)
720686 let userLockedHeigtNew = (height + lockPeriod)
721687 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmountNew)
722- let $t03571035804 = claimCalc(pool, user)
723- let farmInterest = $t03571035804._1
724- let boostInterest = $t03571035804._2
725- let claimAmount = $t03571035804._3
726- let toTreasure = $t03571035804._4
727- let teamReward = $t03571035804._5
688+ let $t03305733151 = claimCalc(pool, user)
689+ let farmInterest = $t03305733151._1
690+ let boostInterest = $t03305733151._2
691+ let claimAmount = $t03305733151._3
692+ let toTreasure = $t03305733151._4
693+ let teamReward = $t03305733151._5
728694 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
729695 [IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew)), IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, (toTreasure + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP)]
730696 }
731697 }))
732698
733699
734700
735701 @Callable(i)
736702 func unlockUserLock (pool,user) = valueOrElse(isActive(), {
737703 let userLockedHeigt = valueOrErrorMessage(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), (((("There is no pool " + pool) + " or user ") + user) + "with lock"))
738704 if ((userLockedHeigt > height))
739705 then throw(("You can't unlock sharetokens till " + toString(userLockedHeigt)))
740706 else (unlockUserLockCalc(i, pool, user) ++ [ScriptTransfer(i.caller, getIntegerValue(this, kLockWavesFee), unit)])
741707 })
742708
743709
744710
745711 @Callable(i)
746712 func unlockUserLockDeprecated (pool,user) = valueOrElse(isActive(), valueOrElse(isSelfCall(i), if (!(getDeprecatedPool(pool)))
747713 then throw("Pool must be deprecated")
748714 else if (isDefined(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight))))
749715 then (unlockUserLockCalc(i, pool, user) ++ [ScriptTransfer(moneyBoxAddress, getIntegerValue(this, kLockWavesFee), unit)])
750716 else nil))
751717
752718
753719
754720 @Callable(i)
755721 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), calcWithdrawShareTokens(i, i.caller, pool, shareTokensWithdrawAmount))
756722
757723
758724
759725 @Callable(i)
760726 func withdrawShareTokensFromPool (callerBytes,pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), valueOrElse(isPoolCall(i, pool), calcWithdrawShareTokens(i, Address(callerBytes), pool, shareTokensWithdrawAmount)))
761727
762728
763729
764730 @Callable(i)
765731 func claim (pool) = valueOrElse(isActive(), {
766732 let r = calcClaim(i, pool, i.caller)
767733 if ((r._2 == 0))
768734 then throw("You have 0 available SWOP")
769735 else r
770736 })
771737
772738
773739
774740 @Callable(i)
775741 func claimInternal (pool,caller) = valueOrElse(isActive(), valueOrElse(isSelfCall(i), calcClaim(i, pool, Address(caller))))
776742
777743
778744
779745 @Callable(i)
780746 func claimAndStake (pool) = valueOrElse(isActive(), {
781747 let claimAmount = {
782748 let @ = invoke(this, "claimInternal", [pool, i.caller.bytes], nil)
783749 if ($isInstanceOf(@, "Int"))
784750 then @
785751 else throw(($getType(@) + " couldn't be cast to Int"))
786752 }
787753 if ((claimAmount == claimAmount))
788754 then if ((claimAmount == 0))
789755 then throw("You have 0 available SWOP")
790756 else {
791757 let stakeToGov = invoke(govAddress, "lockSWOPFromFarming", nil, [AttachedPayment(SWOP, claimAmount)])
792758 if ((stakeToGov == stakeToGov))
793759 then nil
794760 else throw("Strict value is not equal to itself.")
795761 }
796762 else throw("Strict value is not equal to itself.")
797763 })
798764
799765
800766
801767 @Callable(i)
802768 func claimAll (pools) = valueOrElse(isActive(), {
803769 func claimInv (claimTotal,pool) = {
804770 let claimAmount = {
805771 let @ = invoke(this, "claimInternal", [pool, i.caller.bytes], nil)
806772 if ($isInstanceOf(@, "Int"))
807773 then @
808774 else throw(($getType(@) + " couldn't be cast to Int"))
809775 }
810776 if ((claimAmount == claimAmount))
811777 then (claimTotal + claimAmount)
812778 else throw("Strict value is not equal to itself.")
813779 }
814780
815781 let claimTotal = {
816782 let $l = pools
817783 let $s = size($l)
818784 let $acc0 = 0
819785 func $f0_1 ($a,$i) = if (($i >= $s))
820786 then $a
821787 else claimInv($a, $l[$i])
822788
823789 func $f0_2 ($a,$i) = if (($i >= $s))
824790 then $a
825791 else throw("List size exceeds 60")
826792
827793 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60)
828794 }
829795 if ((claimTotal == 0))
830796 then throw("You have 0 available SWOP")
831797 else [ScriptTransfer(i.caller, claimTotal, SWOP)]
832798 })
833799
834800
835801
836802 @Callable(i)
837803 func claimAllAndStake (pools) = valueOrElse(isActive(), {
838804 func claimInv (claimTotal,pool) = {
839805 let claimAmount = {
840806 let @ = invoke(this, "claimInternal", [pool, i.caller.bytes], nil)
841807 if ($isInstanceOf(@, "Int"))
842808 then @
843809 else throw(($getType(@) + " couldn't be cast to Int"))
844810 }
845811 if ((claimAmount == claimAmount))
846812 then (claimTotal + claimAmount)
847813 else throw("Strict value is not equal to itself.")
848814 }
849815
850816 let claimTotal = {
851817 let $l = pools
852818 let $s = size($l)
853819 let $acc0 = 0
854820 func $f0_1 ($a,$i) = if (($i >= $s))
855821 then $a
856822 else claimInv($a, $l[$i])
857823
858824 func $f0_2 ($a,$i) = if (($i >= $s))
859825 then $a
860826 else throw("List size exceeds 60")
861827
862828 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60)
863829 }
864830 if ((claimTotal == 0))
865831 then throw("You have 0 available SWOP")
866832 else {
867833 let stakeToGov = invoke(govAddress, "lockSWOPFromFarming", nil, [AttachedPayment(SWOP, claimTotal)])
868834 if ((stakeToGov == stakeToGov))
869835 then nil
870836 else throw("Strict value is not equal to itself.")
871837 }
872838 })
873839
874840
875841
876842 @Callable(i)
877843 func updateUserBoostInterest (pool,user) = valueOrElse(isActive(), if ((i.caller != votingAddress))
878844 then throw("Only voiting can call this function")
879845 else {
880- let $t04062840722 = claimCalc(pool, user)
881- let farmInterest = $t04062840722._1
882- let boostInterest = $t04062840722._2
883- let claimAmount = $t04062840722._3
884- let toTreasure = $t04062840722._4
885- let teamReward = $t04062840722._5
846+ let $t03797538069 = claimCalc(pool, user)
847+ let farmInterest = $t03797538069._1
848+ let boostInterest = $t03797538069._2
849+ let claimAmount = $t03797538069._3
850+ let toTreasure = $t03797538069._4
851+ let teamReward = $t03797538069._5
886852 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
887853 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, (toTreasure + teamReward), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(teamBoxAddress, teamReward, SWOP)]
888854 })
889855
890856
891857
892858 @Callable(i)
893859 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
894860 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
895861 else suspend("Paused by admin"))
896862
897863
898864
899865 @Callable(i)
900866 func activate () = valueOrElse(isAdminCall(i), if (active)
901867 then throw("DApp is already active")
902868 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
903-
904-
905-
906-@Callable(i)
907-func withdrawShareTokensAdmin (pool,shareTokensWithdrawAmount,user) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), calcWithdrawShareTokensAdmin(i, Address(fromBase58String(user)), pool, shareTokensWithdrawAmount)))
908869
909870
910871 @Verifier(tx)
911872 func verify () = match tx {
912873 case _ =>
913874 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
914875 then 1
915876 else 0
916877 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
917878 then 1
918879 else 0
919880 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
920881 then 1
921882 else 0
922883 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
923884 }
924885

github/deemru/w8io/3ef1775 
186.73 ms