tx · CJCqnd2oqcuRURtrirJd3wExyzCauSTqZ9WuFDxSgxGy

3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP:  -0.03300000 Waves

2023.08.08 17:28 [2701735] smart account 3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP > SELF 0.00000000 Waves

{ "type": 13, "id": "CJCqnd2oqcuRURtrirJd3wExyzCauSTqZ9WuFDxSgxGy", "fee": 3300000, "feeAssetId": null, "timestamp": 1691504986410, "version": 2, "chainId": 84, "sender": "3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP", "senderPublicKey": "AoKo4segKHU4DeJnxXQYJj2u7J6XJeux6r8KLW52cd2Q", "proofs": [ "kuDGunigPQFRzNsceN4DDodP6pQBK4M12NLeHcAVgiX1YNQ53Gi5QWxhAVa4y5A6Lby6B5ypRo7kimCwChqGYAF" ], "script": "base64:BwJDCAISAwoBAhIGCgQCAQEBEgUKAwEBARIDCgECEgMKAQISBAoCAgISBAoCAggSBAoCAhgSBAoCAggSBAoCAhgSAwoBAjUAA1NFUAICX18ADUNPTlRSQUNUX05BTUUCD2NhbGN1bGF0b3IucmlkZQAGU0NBTEU4AIDC1y8AB1BFTkRJTkcCB1BFTkRJTkcABVdBVkVTAgVXQVZFUwEHd3JhcEVycgEBcwkArAICCQCsAgIFDUNPTlRSQUNUX05BTUUCAjogBQFzAQh0aHJvd0VycgEBcwkAAgEJAQd3cmFwRXJyAQUBcwEPYXNzZXRJZFRvU3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgMJAAECBQckbWF0Y2gwAgRVbml0BQVXQVZFUwkAAgECC01hdGNoIGVycm9yAQ9zdHJpbmdUb0Fzc2V0SWQBAXMDCQAAAgUBcwUFV0FWRVMFBHVuaXQJANkEAQUBcwEDYWJzAQFuAwkAZgIAAAUBbgkBAS0BBQFuBQFuARFrZXlGYWN0b3J5QWRkcmVzcwAJALkJAgkAzAgCAgIlcwkAzAgCAgdmYWN0b3J5BQNuaWwFA1NFUAETa2V5TWFuYWdlclB1YmxpY0tleQAJALkJAgkAzAgCAgIlcwkAzAgCAhBtYW5hZ2VyUHVibGljS2V5BQNuaWwFA1NFUAEMa2V5THBBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICCWxwQXNzZXRJZAUDbmlsBQNTRVABF2tleVByb3h5VHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDXByb3h5VHJlYXN1cnkFA25pbAUDU0VQARZrZXlNYWluVHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDG1haW5UcmVhc3VyeQUDbmlsBQNTRVABGmtleUJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICEGJ1c2luZXNzVHJlYXN1cnkFA25pbAUDU0VQARdrZXlCdXNpbmVzc1RyZWFzdXJ5UGFydAAJALkJAgkAzAgCAgIlcwkAzAgCAhRidXNpbmVzc1RyZWFzdXJ5UGFydAUDbmlsBQNTRVABC2tleUludmVzdGVkAQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghpbnZlc3RlZAkAzAgCCQEPYXNzZXRJZFRvU3RyaW5nAQUHYXNzZXRJZAUDbmlsBQNTRVABCmtleURvbmF0ZWQBB2Fzc2V0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAICB2RvbmF0ZWQJAMwIAgkBD2Fzc2V0SWRUb1N0cmluZwEFB2Fzc2V0SWQFA25pbAUDU0VQAQxrZXlBdmFpbGFibGUBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAglhdmFpbGFibGUJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABCmtleUNsYWltZWQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgdjbGFpbWVkCQDMCAIJAKUIAQULdXNlckFkZHJlc3MFA25pbAUDU0VQARBrZXlDdXJyZW50UGVyaW9kAAkAuQkCCQDMCAICAiVzCQDMCAICDWN1cnJlbnRQZXJpb2QFA25pbAUDU0VQARFrZXlQcmljZUZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgVwcmljZQkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABDmtleVN0YXJ0SGVpZ2h0AQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICC3N0YXJ0SGVpZ2h0CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEUa2V5UG93ZXJNYW5hZ2VyQm9udXMBBnBlcmlvZAkAuQkCCQDMCAICBCVzJWQJAMwIAgIRcG93ZXJNYW5hZ2VyQm9udXMJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQAQ9rZXlQZXJpb2RMZW5ndGgAAhAlc19fcGVyaW9kTGVuZ3RoARhrZXlCbG9ja1Byb2Nlc3NpbmdSZXdhcmQAAhklc19fYmxvY2tQcm9jZXNzaW5nUmV3YXJkARVrZXlOZXh0QmxvY2tUb1Byb2Nlc3MAAhYlc19fbmV4dEJsb2NrVG9Qcm9jZXNzARFrZXlCbG9ja1Byb2Nlc3NlZAEGaGVpZ2h0CQC5CQIJAMwIAgIEJXMlZAkAzAgCAg5ibG9ja1Byb2Nlc3NlZAkAzAgCCQCkAwEFBmhlaWdodAUDbmlsBQNTRVABDWtleVdpdGhkcmF3YWwAAg4lc19fd2l0aGRyYXdhbAEUa2V5V2l0aGRyYXdhbFJlcXVlc3QCC3VzZXJBZGRyZXNzBHR4SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIKd2l0aGRyYXdhbAkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAIJANgEAQUEdHhJZAUDbmlsBQNTRVABFnZhbHVlV2l0aGRyYXdhbFJlcXVlc3QEBnN0YXR1cw1scEFzc2V0QW1vdW50DHRhcmdldFBlcmlvZAljbGFpbVR4SWQEDGNsYWltVHhJZFN0cgQHJG1hdGNoMAUJY2xhaW1UeElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgMJAAECBQckbWF0Y2gwAgRVbml0AgRTT09OCQACAQILTWF0Y2ggZXJyb3IJALkJAgkAzAgCAgglcyVkJWQlcwkAzAgCBQZzdGF0dXMJAMwIAgkApAMBBQ1scEFzc2V0QW1vdW50CQDMCAIJAKQDAQUMdGFyZ2V0UGVyaW9kCQDMCAIFDGNsYWltVHhJZFN0cgUDbmlsBQNTRVABFGtleVdpdGhkcmF3YWxIaXN0b3J5Agt1c2VyQWRkcmVzcwR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXdpdGhkcmF3YWxIaXN0b3J5CQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgkA2AQBBQR0eElkBQNuaWwFA1NFUAEba2V5UGVyaW9kV2l0aGRyYXdhbEFzc2V0SWRzAQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICDHBlcmlvZFJld2FyZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABGmtleVBlcmlvZFdpdGhkcmF3YWxBbW91bnRzAQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICEnBlcmlvZFJld2FyZEFtb3VudAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABIXBhcnNlV2l0aGRyYXdhbFJlcXVlc3RWYWx1ZU9yRmFpbAEBcwQFcGFydHMJALUJAgUBcwUDU0VQAwkAAAIJAJADAQUFcGFydHMABQQGc3RhdHVzCQCRAwIFBXBhcnRzAAEEDWxwQXNzZXRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFBXBhcnRzAAIJAQd3cmFwRXJyAQIVaW52YWxpZCBscEFzc2V0QW1vdW50BAx0YXJnZXRQZXJpb2QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFBXBhcnRzAAMJAQd3cmFwRXJyAQIUaW52YWxpZCB0YXJnZXRQZXJpb2QECWNsYWltVHhJZAkAkQMCBQVwYXJ0cwAECQCWCgQFBnN0YXR1cwUNbHBBc3NldEFtb3VudAUMdGFyZ2V0UGVyaW9kBQljbGFpbVR4SWQJAQh0aHJvd0VycgECIGludmFsaWQgd2l0aGRyYXdhbCByZXF1ZXN0IHZhbHVlABRmYWN0b3J5QWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQR0aGlzCQERa2V5RmFjdG9yeUFkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAUZmFjdG9yeUFkZHJlc3NPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUUZmFjdG9yeUFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIXaW52YWxpZCBmYWN0b3J5IGFkZHJlc3MAD2xwQXNzZXRJZE9wdGlvbgQHJG1hdGNoMAUUZmFjdG9yeUFkZHJlc3NPcHRpb24DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQFhCQEMa2V5THBBc3NldElkAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJANkEAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAA9scEFzc2V0SWRPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUPbHBBc3NldElkT3B0aW9uCQEHd3JhcEVycgECEWludmFsaWQgbHBBc3NldElkABpwcm94eVRyZWFzdXJ5QWRkcmVzc09wdGlvbgQHJG1hdGNoMAUUZmFjdG9yeUFkZHJlc3NPcHRpb24DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQFhCQEXa2V5UHJveHlUcmVhc3VyeUFkZHJlc3MAAwkAAQIFByRtYXRjaDECBlN0cmluZwQBcwUHJG1hdGNoMQkApggBBQFzAwkAAQIFByRtYXRjaDECBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAGnByb3h5VHJlYXN1cnlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFGnByb3h5VHJlYXN1cnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECHmludmFsaWQgcHJveHkgdHJlYXN1cnkgYWRkcmVzcwAZbWFpblRyZWFzdXJ5QWRkcmVzc09wdGlvbgQHJG1hdGNoMAUUZmFjdG9yeUFkZHJlc3NPcHRpb24DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQFhCQEWa2V5TWFpblRyZWFzdXJ5QWRkcmVzcwADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQCmCAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAdYnVzaW5lc3NUcmVhc3VyeUFkZHJlc3NPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBGmtleUJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJAKYIAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABltYWluVHJlYXN1cnlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFGW1haW5UcmVhc3VyeUFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIdaW52YWxpZCBtYWluIHRyZWFzdXJ5IGFkZHJlc3MAHWJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFHWJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECIWludmFsaWQgYnVzaW5lc3MgdHJlYXN1cnkgYWRkcmVzcwEZZ2V0TWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAmZhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAmZhCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMQIGU3RyaW5nBANwdWIFByRtYXRjaDEJANkEAQUDcHViBQR1bml0BQR1bml0AQtvbmx5QWRkcmVzcwIBaQdhZGRyZXNzAwkAAAIIBQFpBmNhbGxlcgUHYWRkcmVzcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAQtvbmx5RmFjdG9yeQEBaQkBC29ubHlBZGRyZXNzAgUBaQUUZmFjdG9yeUFkZHJlc3NPckZhaWwBD3Jld2FyZEZvck9wdGlvbgIHcmV3YXJkcwZ0YXJnZXQEAXMJAJADAQUHcmV3YXJkcwQLJHQwNTcyOTU3NTQJAJEDAgUHcmV3YXJkcwAABAJhMAgFCyR0MDU3Mjk1NzU0Al8xBAJyMAgFCyR0MDU3Mjk1NzU0Al8yBAskdDA1NzU3NTc4MgkAkQMCBQdyZXdhcmRzAAEEAmExCAULJHQwNTc1NzU3ODICXzEEAnIxCAULJHQwNTc1NzU3ODICXzIECyR0MDU3ODU1ODEwCQCRAwIFB3Jld2FyZHMAAgQCYTIIBQskdDA1Nzg1NTgxMAJfMQQCcjIIBQskdDA1Nzg1NTgxMAJfMgMDCQBmAgUBcwAACQAAAgUCYTAFBnRhcmdldAcFAnIwAwMJAGYCBQFzAAEJAAACBQJhMQUGdGFyZ2V0BwUCcjEDAwkAZgIFAXMAAgkAAAIFAmEyBQZ0YXJnZXQHBQJyMgUEdW5pdAEQZmluYWxpemVJTlRFUk5BTAMYbmV3VHJlYXN1cnlWb2x1bWVJbldhdmVzF3B3ck1hbmFnZXJzQm9udXNJbldhdmVzIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmBBJkb25hdGVkV2F2ZXNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQprZXlEb25hdGVkAQUEdW5pdAAABBNpbnZlc3RlZFdhdmVzQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQELa2V5SW52ZXN0ZWQBBQR1bml0AAAEHGN1cnJlbnRUcmVhc3VyeVZvbHVtZUluV2F2ZXMJAGQCBRJkb25hdGVkV2F2ZXNBbW91bnQFE2ludmVzdGVkV2F2ZXNBbW91bnQECXByb2ZpdFJhdwkAZQIFGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcwUcY3VycmVudFRyZWFzdXJ5Vm9sdW1lSW5XYXZlcwQWcHdyTWFuYWdlcnNCb251c0Ftb3VudAMDCQBnAgUJcHJvZml0UmF3BRdwd3JNYW5hZ2Vyc0JvbnVzSW5XYXZlcwYJAAACBRdwd3JNYW5hZ2Vyc0JvbnVzSW5XYXZlcwAABRdwd3JNYW5hZ2Vyc0JvbnVzSW5XYXZlcwkBCHRocm93RXJyAQIfcG93ZXIgYm9udXMgaXMgbW9yZSB0aGFuIHByb2ZpdAQGcHJvZml0CQBlAgUJcHJvZml0UmF3BRZwd3JNYW5hZ2Vyc0JvbnVzQW1vdW50BAxkb25hdGlvblBhcnQDCQBmAgUcY3VycmVudFRyZWFzdXJ5Vm9sdW1lSW5XYXZlcwAACQBrAwUSZG9uYXRlZFdhdmVzQW1vdW50BQZTQ0FMRTgFHGN1cnJlbnRUcmVhc3VyeVZvbHVtZUluV2F2ZXMAAAQVZG9uYXRpb25Qcm9maXRQYXJ0UmF3CQBrAwUGcHJvZml0BQxkb25hdGlvblBhcnQFBlNDQUxFOAQXaW52ZXN0bWVudFByb2ZpdFBhcnRSYXcJAGUCBQZwcm9maXQFFWRvbmF0aW9uUHJvZml0UGFydFJhdwQjdHJlYXN1cnlWb2x1bWVEaWZmQWxsb2NhdGlvbkNvZWZBYnMJAQNhYnMBBSB0cmVhc3VyeVZvbHVtZURpZmZBbGxvY2F0aW9uQ29lZgQQYW1vdW50VG9Eb25hdGlvbgkAawMFF2ludmVzdG1lbnRQcm9maXRQYXJ0UmF3AwkAZgIAAAUgdHJlYXN1cnlWb2x1bWVEaWZmQWxsb2NhdGlvbkNvZWYFI3RyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmQWJzAAAFBlNDQUxFOAQSYW1vdW50VG9JbnZlc3RtZW50CQBrAwUVZG9uYXRpb25Qcm9maXRQYXJ0UmF3AwkAZgIFIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmAAAFI3RyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmQWJzAAAFBlNDQUxFOAQSZG9uYXRpb25Qcm9maXRQYXJ0CQBkAgkAZQIFFWRvbmF0aW9uUHJvZml0UGFydFJhdwUSYW1vdW50VG9JbnZlc3RtZW50BRBhbW91bnRUb0RvbmF0aW9uBBRpbnZlc3RtZW50UHJvZml0UGFydAkAZAIJAGUCBRdpbnZlc3RtZW50UHJvZml0UGFydFJhdwUQYW1vdW50VG9Eb25hdGlvbgUSYW1vdW50VG9JbnZlc3RtZW50BBhkb25hdGVkV2F2ZXNBbW91bnROZXdSYXcJAGQCBRJkb25hdGVkV2F2ZXNBbW91bnQFEmRvbmF0aW9uUHJvZml0UGFydAQZaW52ZXN0ZWRXYXZlc0Ftb3VudE5ld1JhdwkAZAIFE2ludmVzdGVkV2F2ZXNBbW91bnQFFGludmVzdG1lbnRQcm9maXRQYXJ0BA9kb25hdGVkUGFydERlYnQJAJcDAQkAzAgCAAAJAMwIAgUYZG9uYXRlZFdhdmVzQW1vdW50TmV3UmF3BQNuaWwEEGludmVzdGVkUGFydERlYnQJAJcDAQkAzAgCAAAJAMwIAgUZaW52ZXN0ZWRXYXZlc0Ftb3VudE5ld1JhdwUDbmlsBBVkb25hdGVkV2F2ZXNBbW91bnROZXcJAGQCCQCWAwEJAMwIAgAACQDMCAIFGGRvbmF0ZWRXYXZlc0Ftb3VudE5ld1JhdwUDbmlsBRBpbnZlc3RlZFBhcnREZWJ0BBZpbnZlc3RlZFdhdmVzQW1vdW50TmV3CQBkAgkAlgMBCQDMCAIAAAkAzAgCBRlpbnZlc3RlZFdhdmVzQW1vdW50TmV3UmF3BQNuaWwFD2RvbmF0ZWRQYXJ0RGVidAQPbHBBc3NldFF1YW50aXR5CAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFD2xwQXNzZXRJZE9yRmFpbAkBB3dyYXBFcnIBAhRpbnZhbGlkIGxwQXNzZXQgaW5mbwhxdWFudGl0eQQIbmV3UHJpY2UJAGsDBRZpbnZlc3RlZFdhdmVzQW1vdW50TmV3BQZTQ0FMRTgFD2xwQXNzZXRRdWFudGl0eQQTY2hlY2tJZlByaWNlTm90WmVybwMJAQIhPQIFCG5ld1ByaWNlAAAGCQEIdGhyb3dFcnIBAhRMUCBwcmljZSBjYW5ub3QgYmUgMAMJAAACBRNjaGVja0lmUHJpY2VOb3RaZXJvBRNjaGVja0lmUHJpY2VOb3RaZXJvBBNscEFzc2V0QW1vdW50VG9CdXJuCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQENa2V5V2l0aGRyYXdhbAAAAAQQcGF5bWVudEFtb3VudE1pbgkAlgMBCQDMCAIAAAkAzAgCCQBrAwUTbHBBc3NldEFtb3VudFRvQnVybgUIbmV3UHJpY2UFBlNDQUxFOAUDbmlsBBhmaW5hbEludmVzdGVkV2F2ZXNBbW91bnQJAGUCBRZpbnZlc3RlZFdhdmVzQW1vdW50TmV3BRBwYXltZW50QW1vdW50TWluBBRscEFzc2V0RmluYWxRdWFudGl0eQkAZQIFD2xwQXNzZXRRdWFudGl0eQUTbHBBc3NldEFtb3VudFRvQnVybgkAmAoGBRBwYXltZW50QW1vdW50TWluBRhmaW5hbEludmVzdGVkV2F2ZXNBbW91bnQFFWRvbmF0ZWRXYXZlc0Ftb3VudE5ldwUIbmV3UHJpY2UFE2xwQXNzZXRBbW91bnRUb0J1cm4FFGxwQXNzZXRGaW5hbFF1YW50aXR5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdjbGFpbUNvbGxhdGVyYWxJTlRFUk5BTAMQdXNlckFkZHJlc3NCeXRlcwR0eElkDXRyYW5zYWN0aW9uSWQEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBBd3aXRoZHJhd2FsUmVxdWVzdE9wdGlvbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEUa2V5V2l0aGRyYXdhbFJlcXVlc3QCBQt1c2VyQWRkcmVzcwUEdHhJZAkBB3dyYXBFcnIBAhppbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdAQLJHQwOTI1MjkzNjUJASFwYXJzZVdpdGhkcmF3YWxSZXF1ZXN0VmFsdWVPckZhaWwBBRd3aXRoZHJhd2FsUmVxdWVzdE9wdGlvbgQGc3RhdHVzCAULJHQwOTI1MjkzNjUCXzEEDWxwQXNzZXRBbW91bnQIBQskdDA5MjUyOTM2NQJfMgQMdGFyZ2V0UGVyaW9kCAULJHQwOTI1MjkzNjUCXzMECWNsYWltVHhJZAgFCyR0MDkyNTI5MzY1Al80AwkAZgIFDHRhcmdldFBlcmlvZAUTY3VycmVudFBlcmlvZE9yRmFpbAkBCHRocm93RXJyAQIhaW52YWxpZCB3aXRoZHJhd2FsIHJlcXVlc3QgcGVyaW9kBAtwcmljZU9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQERa2V5UHJpY2VGb3JQZXJpb2QBBQx0YXJnZXRQZXJpb2QJAQd3cmFwRXJyAQINaW52YWxpZCBwcmljZQQLd2F2ZXNBbW91bnQDCQBmAgULcHJpY2VPckZhaWwAAAkAawMFDWxwQXNzZXRBbW91bnQFC3ByaWNlT3JGYWlsBQZTQ0FMRTgAAAQMYXNzZXRzU3RyaW5nCQERQGV4dHJOYXRpdmUoMTA1MykCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBG2tleVBlcmlvZFdpdGhkcmF3YWxBc3NldElkcwEFE2N1cnJlbnRQZXJpb2RPckZhaWwEDWFtb3VudHNTdHJpbmcJARFAZXh0ck5hdGl2ZSgxMDUzKQIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEaa2V5UGVyaW9kV2l0aGRyYXdhbEFtb3VudHMBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQCYCgYFC3VzZXJBZGRyZXNzBQ1scEFzc2V0QW1vdW50BQx0YXJnZXRQZXJpb2QFC3dhdmVzQW1vdW50BQxhc3NldHNTdHJpbmcFDWFtb3VudHNTdHJpbmcBJWNsYWltQ29sbGF0ZXJhbFJFQURPTkxZU3RyaW5nUmVzcG9uc2UDEHVzZXJBZGRyZXNzQnl0ZXMEdHhJZA10cmFuc2FjdGlvbklkBA0kdDAxMDE3OTEwMzYwCQEXY2xhaW1Db2xsYXRlcmFsSU5URVJOQUwDBRB1c2VyQWRkcmVzc0J5dGVzBQR0eElkBQ10cmFuc2FjdGlvbklkBAt1c2VyQWRkcmVzcwgFDSR0MDEwMTc5MTAzNjACXzEEDWxwQXNzZXRBbW91bnQIBQ0kdDAxMDE3OTEwMzYwAl8yBAx0YXJnZXRQZXJpb2QIBQ0kdDAxMDE3OTEwMzYwAl8zBAt3YXZlc0Ftb3VudAgFDSR0MDEwMTc5MTAzNjACXzQEDGFzc2V0c1N0cmluZwgFDSR0MDEwMTc5MTAzNjACXzUEDWFtb3VudHNTdHJpbmcIBQ0kdDAxMDE3OTEwMzYwAl82BAZhc3NldHMJALkJAgkA0QgCCQC9CQIFDGFzc2V0c1N0cmluZwUDU0VQAAACAToEB2Ftb3VudHMJALkJAgkA0QgCCQC9CQIFDWFtb3VudHNTdHJpbmcFA1NFUAAAAgE6CQC5CQIJAMwIAgIGJWQlcyVzCQDMCAIJAKQDAQULd2F2ZXNBbW91bnQJAMwIAgUGYXNzZXRzCQDMCAIFB2Ftb3VudHMFA25pbAUDU0VQCwFpAQdjbGFpbUxQARB1c2VyQWRkcmVzc0J5dGVzBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMECWF2YWlsYWJsZQkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDGtleUF2YWlsYWJsZQEFC3VzZXJBZGRyZXNzAAAEB2NsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQprZXlDbGFpbWVkAQULdXNlckFkZHJlc3MAAAQOZmFjdG9yeUFjdGlvbnMDCQBmAgUJYXZhaWxhYmxlAAAJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAINdHJhbnNmZXJBc3NldAkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFCWF2YWlsYWJsZQkAzAgCBQ9scEFzc2V0SWRPckZhaWwFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEMa2V5QXZhaWxhYmxlAQULdXNlckFkZHJlc3MJAMwIAgAABQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBCmtleUNsYWltZWQBBQt1c2VyQWRkcmVzcwkAzAgCCQBkAgUHY2xhaW1lZAUJYXZhaWxhYmxlBQNuaWwFA25pbAUDbmlsCQEIdGhyb3dFcnIBAhBub3RoaW5nIHRvIGNsYWltCQCUCgIFA25pbAUOZmFjdG9yeUFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZmluYWxpemUEEHVzZXJBZGRyZXNzQnl0ZXMYbmV3VHJlYXN1cnlWb2x1bWVJbldhdmVzF3B3ck1hbmFnZXJzQm9udXNJbldhdmVzIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBD2tleVBlcmlvZExlbmd0aAAJAQd3cmFwRXJyAQIVaW52YWxpZCBwZXJpb2QgbGVuZ3RoBBJjdXJyZW50U3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDmtleVN0YXJ0SGVpZ2h0AQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAhRpbnZhbGlkIHN0YXJ0IGhlaWdodAQSY3VycmVudFByaWNlT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARFrZXlQcmljZUZvclBlcmlvZAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQd3cmFwRXJyAQINaW52YWxpZCBwcmljZQQSbmV4dEJsb2NrVG9Qcm9jZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARVrZXlOZXh0QmxvY2tUb1Byb2Nlc3MACQEHd3JhcEVycgECHWludmFsaWQgbmV4dCBibG9jayB0byBwcm9jZXNzBA9wZXJpb2RFbmRIZWlnaHQJAGUCCQBkAgUSY3VycmVudFN0YXJ0SGVpZ2h0BQxwZXJpb2RMZW5ndGgAAQQGY2hlY2tzCQDMCAIDCQAAAggFAWkMb3JpZ2luQ2FsbGVyBRltYWluVHJlYXN1cnlBZGRyZXNzT3JGYWlsBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQJAMwIAgMJAGYCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFD3BlcmlvZEVuZEhlaWdodAYJAQh0aHJvd0VycgECEnVucHJvY2Vzc2VkIGJsb2NrcwkAzAgCAwkAZwIFGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcwAABgkBCHRocm93RXJyAQIbaW52YWxpZCBuZXcgdHJlYXN1cnkgdm9sdW1lCQDMCAIDCQBnAgUXcHdyTWFuYWdlcnNCb251c0luV2F2ZXMAAAYJAQh0aHJvd0VycgECGmludmFsaWQgUFdSIG1hbmFnZXJzIGJvbnVzCQDMCAIDAwkAZwIFIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmCQEBLQEFBlNDQUxFOAkAZwIFBlNDQUxFOAUgdHJlYXN1cnlWb2x1bWVEaWZmQWxsb2NhdGlvbkNvZWYHBgkBCHRocm93RXJyAQIzaW52YWxpZCB0cmVhc3VyeSB2b2x1bWUgZGlmZiBhbGxvY2F0aW9uIGNvZWZmaWNpZW50BQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDSR0MDEzMTIyMTMzODIJARBmaW5hbGl6ZUlOVEVSTkFMAwUYbmV3VHJlYXN1cnlWb2x1bWVJbldhdmVzBRdwd3JNYW5hZ2Vyc0JvbnVzSW5XYXZlcwUgdHJlYXN1cnlWb2x1bWVEaWZmQWxsb2NhdGlvbkNvZWYEEHBheW1lbnRBbW91bnRNaW4IBQ0kdDAxMzEyMjEzMzgyAl8xBBhmaW5hbEludmVzdGVkV2F2ZXNBbW91bnQIBQ0kdDAxMzEyMjEzMzgyAl8yBBVkb25hdGVkV2F2ZXNBbW91bnROZXcIBQ0kdDAxMzEyMjEzMzgyAl8zBAhuZXdQcmljZQgFDSR0MDEzMTIyMTMzODICXzQEE2xwQXNzZXRBbW91bnRUb0J1cm4IBQ0kdDAxMzEyMjEzMzgyAl81BBRscEFzc2V0RmluYWxRdWFudGl0eQgFDSR0MDEzMTIyMTMzODICXzYECW5ld1BlcmlvZAkAZAIFE2N1cnJlbnRQZXJpb2RPckZhaWwAAQoBDGFkZE5ld0FjdGlvbgIHYWN0aW9ucwdwYXltZW50BA0kdDAxMzUzMDEzNTkyBQdhY3Rpb25zBA9zY3JpcHRUcmFuc2ZlcnMIBQ0kdDAxMzUzMDEzNTkyAl8xBA5hc3NldElkc1N0cmluZwgFDSR0MDEzNTMwMTM1OTICXzIEDWFtb3VudHNTdHJpbmcIBQ0kdDAxMzUzMDEzNTkyAl8zBA1wYXltZW50QW1vdW50CAUHcGF5bWVudAZhbW91bnQEDnBheW1lbnRBc3NldElkCAUHcGF5bWVudAdhc3NldElkBBFuZXdBc3NldElkc1N0cmluZwkArAICAgIlcwkAuQkCCQDMCAIFDmFzc2V0SWRzU3RyaW5nCQDMCAIJAQ9hc3NldElkVG9TdHJpbmcBBQ5wYXltZW50QXNzZXRJZAUDbmlsBQNTRVAEEG5ld0Ftb3VudHNTdHJpbmcJAKwCAgICJWQJALkJAgkAzAgCBQ1hbW91bnRzU3RyaW5nCQDMCAIJAKQDAQUNcGF5bWVudEFtb3VudAUDbmlsBQNTRVAEEW5ld1NjcmlwdFRyYW5zZmVyCQEOU2NyaXB0VHJhbnNmZXIDBRRmYWN0b3J5QWRkcmVzc09yRmFpbAUNcGF5bWVudEFtb3VudAUOcGF5bWVudEFzc2V0SWQJAJUKAwkAzQgCBQ9zY3JpcHRUcmFuc2ZlcnMFEW5ld1NjcmlwdFRyYW5zZmVyBRFuZXdBc3NldElkc1N0cmluZwUQbmV3QW1vdW50c1N0cmluZwQNJHQwMTQwNTIxNDE0MwoAAiRsCAUBaQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsAgACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMYWRkTmV3QWN0aW9uAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA9zY3JpcHRUcmFuc2ZlcnMIBQ0kdDAxNDA1MjE0MTQzAl8xBAhBc3NldElkcwgFDSR0MDE0MDUyMTQxNDMCXzIEB0Ftb3VudHMIBQ0kdDAxNDA1MjE0MTQzAl8zBA5mYWN0b3J5QWN0aW9ucwkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBFGtleVBvd2VyTWFuYWdlckJvbnVzAQUTY3VycmVudFBlcmlvZE9yRmFpbAkAzAgCBRdwd3JNYW5hZ2Vyc0JvbnVzSW5XYXZlcwUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJARBrZXlDdXJyZW50UGVyaW9kAAkAzAgCBQluZXdQZXJpb2QFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQERa2V5UHJpY2VGb3JQZXJpb2QBBQluZXdQZXJpb2QJAMwIAgUIbmV3UHJpY2UFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEOa2V5U3RhcnRIZWlnaHQBBQluZXdQZXJpb2QJAMwIAgkAZAIFD3BlcmlvZEVuZEhlaWdodAABBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgRidXJuCQDMCAIFE2xwQXNzZXRBbW91bnRUb0J1cm4FA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQENa2V5V2l0aGRyYXdhbAAJAMwIAgAABQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBC2tleUludmVzdGVkAQUEdW5pdAkAzAgCBRhmaW5hbEludmVzdGVkV2F2ZXNBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEKa2V5RG9uYXRlZAEFBHVuaXQJAMwIAgUVZG9uYXRlZFdhdmVzQW1vdW50TmV3BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtzdHJpbmdFbnRyeQkAzAgCCQEba2V5UGVyaW9kV2l0aGRyYXdhbEFzc2V0SWRzAQUJbmV3UGVyaW9kCQDMCAIFCEFzc2V0SWRzBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtzdHJpbmdFbnRyeQkAzAgCCQEaa2V5UGVyaW9kV2l0aGRyYXdhbEFtb3VudHMBBQluZXdQZXJpb2QJAMwIAgUHQW1vdW50cwUDbmlsBQNuaWwFA25pbAkAlAoCBQ9zY3JpcHRUcmFuc2ZlcnMFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGZpbmFsaXplUkVBRE9OTFkDGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcxdwd3JNYW5hZ2Vyc0JvbnVzSW5XYXZlcyB0cmVhc3VyeVZvbHVtZURpZmZBbGxvY2F0aW9uQ29lZgQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEDHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEPa2V5UGVyaW9kTGVuZ3RoAAkBB3dyYXBFcnIBAhVpbnZhbGlkIHBlcmlvZCBsZW5ndGgEEmN1cnJlbnRTdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEOa2V5U3RhcnRIZWlnaHQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgc3RhcnQgaGVpZ2h0BBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBBJuZXh0QmxvY2tUb1Byb2Nlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAQd3cmFwRXJyAQIdaW52YWxpZCBuZXh0IGJsb2NrIHRvIHByb2Nlc3MED3BlcmlvZEVuZEhlaWdodAkAZQIJAGQCBRJjdXJyZW50U3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBAZjaGVja3MJAMwIAgMJAGYCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFD3BlcmlvZEVuZEhlaWdodAYJAQh0aHJvd0VycgECEnVucHJvY2Vzc2VkIGJsb2NrcwkAzAgCAwkAZwIFGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcwAABgkBCHRocm93RXJyAQIbaW52YWxpZCBuZXcgdHJlYXN1cnkgdm9sdW1lCQDMCAIDCQBnAgUXcHdyTWFuYWdlcnNCb251c0luV2F2ZXMAAAYJAQh0aHJvd0VycgECGmludmFsaWQgUFdSIG1hbmFnZXJzIGJvbnVzCQDMCAIDAwkAZwIFIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmCQEBLQEFBlNDQUxFOAkAZwIFBlNDQUxFOAUgdHJlYXN1cnlWb2x1bWVEaWZmQWxsb2NhdGlvbkNvZWYHBgkBCHRocm93RXJyAQIzaW52YWxpZCB0cmVhc3VyeSB2b2x1bWUgZGlmZiBhbGxvY2F0aW9uIGNvZWZmaWNpZW50BQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJAJQKAgUDbmlsCQEQZmluYWxpemVJTlRFUk5BTAMFGG5ld1RyZWFzdXJ5Vm9sdW1lSW5XYXZlcwUXcHdyTWFuYWdlcnNCb251c0luV2F2ZXMFIHRyZWFzdXJ5Vm9sdW1lRGlmZkFsbG9jYXRpb25Db2VmCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBmludmVzdAEQdXNlckFkZHJlc3NCeXRlcwQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAt1c2VyQWRkcmVzcwkBB0FkZHJlc3MBBRB1c2VyQWRkcmVzc0J5dGVzBBNjdXJyZW50UGVyaW9kT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARBrZXlDdXJyZW50UGVyaW9kAAkBB3dyYXBFcnIBAg5pbnZhbGlkIHBlcmlvZAQSY3VycmVudFByaWNlT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARFrZXlQcmljZUZvclBlcmlvZAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQd3cmFwRXJyAQINaW52YWxpZCBwcmljZQQHcGF5bWVudAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkBCHRocm93RXJyAQIQaW52YWxpZCBwYXltZW50cwQNJHQwMTc2MjQxNzgwMQMDCQAAAggFB3BheW1lbnQHYXNzZXRJZAUEdW5pdAkAZgIIBQdwYXltZW50BmFtb3VudAAABwkAlAoCCAUHcGF5bWVudAZhbW91bnQIBQdwYXltZW50B2Fzc2V0SWQJAQh0aHJvd0VycgECFmludmFsaWQgcGF5bWVudCBhbW91bnQEDXBheW1lbnRBbW91bnQIBQ0kdDAxNzYyNDE3ODAxAl8xBA5wYXltZW50QXNzZXRJZAgFDSR0MDE3NjI0MTc4MDECXzIEDHRyZWFzdXJ5UGFydAkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBF2tleUJ1c2luZXNzVHJlYXN1cnlQYXJ0AAAABBtwYXltZW50c1dpdGhvdXRUcmVhc3VyeVBhcnQJAGsDBQ1wYXltZW50QW1vdW50CQBlAgUGU0NBTEU4BQx0cmVhc3VyeVBhcnQFBlNDQUxFOAQNbHBBc3NldEFtb3VudAMJAGYCBRJjdXJyZW50UHJpY2VPckZhaWwAAAkAawMFG3BheW1lbnRzV2l0aG91dFRyZWFzdXJ5UGFydAUGU0NBTEU4BRJjdXJyZW50UHJpY2VPckZhaWwAAAQIaW52ZXN0ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQtrZXlJbnZlc3RlZAEFBHVuaXQAAAQHYWN0aW9ucwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRltYWluVHJlYXN1cnlBZGRyZXNzT3JGYWlsBRtwYXltZW50c1dpdGhvdXRUcmVhc3VyeVBhcnQFDnBheW1lbnRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFHWJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzT3JGYWlsBQx0cmVhc3VyeVBhcnQFDnBheW1lbnRBc3NldElkBQNuaWwEDmZhY3RvcnlBY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQELa2V5SW52ZXN0ZWQBBQR1bml0CQDMCAIJAGQCBQhpbnZlc3RlZAUbcGF5bWVudHNXaXRob3V0VHJlYXN1cnlQYXJ0BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgdyZWlzc3VlCQDMCAIFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDXRyYW5zZmVyQXNzZXQJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBQ1scEFzc2V0QW1vdW50CQDMCAIFD2xwQXNzZXRJZE9yRmFpbAUDbmlsBQNuaWwFA25pbAkAlAoCBQdhY3Rpb25zBQ5mYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwEQdXNlckFkZHJlc3NCeXRlcwQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAt1c2VyQWRkcmVzcwkBB0FkZHJlc3MBBRB1c2VyQWRkcmVzc0J5dGVzBBNjdXJyZW50UGVyaW9kT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARBrZXlDdXJyZW50UGVyaW9kAAkBB3dyYXBFcnIBAg5pbnZhbGlkIHBlcmlvZAQHcGF5bWVudAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkBCHRocm93RXJyAQkBB3dyYXBFcnIBAhBpbnZhbGlkIHBheW1lbnRzBA5wYXltZW50QXNzZXRJZAMJAAACCAUHcGF5bWVudAdhc3NldElkBQ9scEFzc2V0SWRPckZhaWwFD2xwQXNzZXRJZE9yRmFpbAkBCHRocm93RXJyAQIVaW52YWxpZCBwYXltZW50IGFzc2V0BA1wYXltZW50QW1vdW50AwkAZgIIBQdwYXltZW50BmFtb3VudAAACAUHcGF5bWVudAZhbW91bnQJAQh0aHJvd0VycgECFmludmFsaWQgcGF5bWVudCBhbW91bnQECndpdGhkcmF3YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQ1rZXlXaXRoZHJhd2FsAAAABAdhY3Rpb25zCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFFGZhY3RvcnlBZGRyZXNzT3JGYWlsBQ1wYXltZW50QW1vdW50BQ5wYXltZW50QXNzZXRJZAUDbmlsBA5mYWN0b3J5QWN0aW9ucwkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBDWtleVdpdGhkcmF3YWwACQDMCAIJAGQCBQp3aXRoZHJhd2FsBQ1wYXltZW50QW1vdW50BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtzdHJpbmdFbnRyeQkAzAgCCQEUa2V5V2l0aGRyYXdhbFJlcXVlc3QCBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAkAzAgCCQEWdmFsdWVXaXRoZHJhd2FsUmVxdWVzdAQFB1BFTkRJTkcFDXBheW1lbnRBbW91bnQJAGQCBRNjdXJyZW50UGVyaW9kT3JGYWlsAAEFBHVuaXQFA25pbAUDbmlsBQNuaWwDCQAAAgUOZmFjdG9yeUFjdGlvbnMFDmZhY3RvcnlBY3Rpb25zCQCUCgIFB2FjdGlvbnMFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNhbmNlbFdpdGhkcmF3AhB1c2VyQWRkcmVzc0J5dGVzBHR4SWQEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQLdXNlckFkZHJlc3MJAQdBZGRyZXNzAQUQdXNlckFkZHJlc3NCeXRlcwQXd2l0aGRyYXdhbFJlcXVlc3RPcHRpb24JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFGtleVdpdGhkcmF3YWxSZXF1ZXN0AgULdXNlckFkZHJlc3MFBHR4SWQJAQd3cmFwRXJyAQIaaW52YWxpZCB3aXRoZHJhd2FsIHJlcXVlc3QEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBA0kdDAyMDUzNTIwNjQ4CQEhcGFyc2VXaXRoZHJhd2FsUmVxdWVzdFZhbHVlT3JGYWlsAQUXd2l0aGRyYXdhbFJlcXVlc3RPcHRpb24EBnN0YXR1cwgFDSR0MDIwNTM1MjA2NDgCXzEEDWxwQXNzZXRBbW91bnQIBQ0kdDAyMDUzNTIwNjQ4Al8yBAx0YXJnZXRQZXJpb2QIBQ0kdDAyMDUzNTIwNjQ4Al8zBAljbGFpbVR4SWQIBQ0kdDAyMDUzNTIwNjQ4Al80BAZjaGVja3MJAMwIAgMJAAACBQZzdGF0dXMFB1BFTkRJTkcGCQEIdGhyb3dFcnIBAiFpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCBzdGF0dXMJAMwIAgMJAGYCBQx0YXJnZXRQZXJpb2QFE2N1cnJlbnRQZXJpb2RPckZhaWwGCQEIdGhyb3dFcnIBAiFpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCBwZXJpb2QFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKd2l0aGRyYXdhbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQENa2V5V2l0aGRyYXdhbAAJAQd3cmFwRXJyAQIfaW52YWxpZCB0b3RhbCB3aXRoZHJhd2FsIGFtb3VudAQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQ1rZXlXaXRoZHJhd2FsAAkAzAgCAwkAZwIFCndpdGhkcmF3YWwFDWxwQXNzZXRBbW91bnQJAGUCBQp3aXRoZHJhd2FsBQ1scEFzc2V0QW1vdW50CQEIdGhyb3dFcnIBAhlpbnZhbGlkIHdpdGhkcmF3YWwgYW1vdW50BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtkZWxldGVFbnRyeQkAzAgCCQEUa2V5V2l0aGRyYXdhbFJlcXVlc3QCBQt1c2VyQWRkcmVzcwUEdHhJZAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAINdHJhbnNmZXJBc3NldAkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFDWxwQXNzZXRBbW91bnQJAMwIAgUPbHBBc3NldElkT3JGYWlsBQNuaWwFA25pbAUDbmlsAwkAAAIFDmZhY3RvcnlBY3Rpb25zBQ5mYWN0b3J5QWN0aW9ucwkAlAoCBQNuaWwFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD2NsYWltQ29sbGF0ZXJhbAIQdXNlckFkZHJlc3NCeXRlcwR0eElkBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEDSR0MDIxNjM0MjE4MzYJARdjbGFpbUNvbGxhdGVyYWxJTlRFUk5BTAMFEHVzZXJBZGRyZXNzQnl0ZXMJANkEAQUEdHhJZAgFAWkNdHJhbnNhY3Rpb25JZAQLdXNlckFkZHJlc3MIBQ0kdDAyMTYzNDIxODM2Al8xBA1scEFzc2V0QW1vdW50CAUNJHQwMjE2MzQyMTgzNgJfMgQMdGFyZ2V0UGVyaW9kCAUNJHQwMjE2MzQyMTgzNgJfMwQLd2F2ZXNBbW91bnQIBQ0kdDAyMTYzNDIxODM2Al80BAxhc3NldHNTdHJpbmcIBQ0kdDAyMTYzNDIxODM2Al81BA1hbW91bnRzU3RyaW5nCAUNJHQwMjE2MzQyMTgzNgJfNgQKYXNzZXRzTGlzdAkA0QgCCQC9CQIFDGFzc2V0c1N0cmluZwUDU0VQAAAEC2Ftb3VudHNMaXN0CQDRCAIJAL0JAgUNYW1vdW50c1N0cmluZwUDU0VQAAAEDmZhY3RvcnlBY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC2RlbGV0ZUVudHJ5CQDMCAIJARRrZXlXaXRoZHJhd2FsUmVxdWVzdAIFC3VzZXJBZGRyZXNzCQDZBAEFBHR4SWQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEUa2V5V2l0aGRyYXdhbEhpc3RvcnkCBQt1c2VyQWRkcmVzcwkA2QQBBQR0eElkCQDMCAIFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDnRyYW5zZmVyQXNzZXRzCQDMCAIFEHVzZXJBZGRyZXNzQnl0ZXMJAMwIAgUKYXNzZXRzTGlzdAkAzAgCBQthbW91bnRzTGlzdAUDbmlsBQNuaWwFA25pbAkAlAoCBQNuaWwFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2NsYWltQ29sbGF0ZXJhbEJ1bGsCEHVzZXJBZGRyZXNzQnl0ZXMFdHhJZHMEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgoBDGFkZE5ld0FjdGlvbgIFc3RhdGUEdHhJZAQNJHQwMjI1OTQyMjgxMAkBF2NsYWltQ29sbGF0ZXJhbElOVEVSTkFMAwUQdXNlckFkZHJlc3NCeXRlcwkA2QQBBQR0eElkCAUBaQ10cmFuc2FjdGlvbklkBAt1c2VyQWRkcmVzcwgFDSR0MDIyNTk0MjI4MTACXzEEDWxwQXNzZXRBbW91bnQIBQ0kdDAyMjU5NDIyODEwAl8yBAx0YXJnZXRQZXJpb2QIBQ0kdDAyMjU5NDIyODEwAl8zBAt3YXZlc0Ftb3VudAgFDSR0MDIyNTk0MjI4MTACXzQEDGFzc2V0c1N0cmluZwgFDSR0MDIyNTk0MjI4MTACXzUEDWFtb3VudHNTdHJpbmcIBQ0kdDAyMjU5NDIyODEwAl82BAphc3NldHNMaXN0CQDRCAIJAL0JAgUMYXNzZXRzU3RyaW5nBQNTRVAAAAQLYW1vdW50c0xpc3QJANEIAgkAvQkCBQ1hbW91bnRzU3RyaW5nBQNTRVAAAAQKbmV3QWN0aW9ucwkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgtkZWxldGVFbnRyeQkAzAgCCQEUa2V5V2l0aGRyYXdhbFJlcXVlc3QCBQt1c2VyQWRkcmVzcwkA2QQBBQR0eElkBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBFGtleVdpdGhkcmF3YWxIaXN0b3J5AgULdXNlckFkZHJlc3MJANkEAQUEdHhJZAkAzAgCBQ1scEFzc2V0QW1vdW50BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAg50cmFuc2ZlckFzc2V0cwkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFCmFzc2V0c0xpc3QJAMwIAgULYW1vdW50c0xpc3QFA25pbAUDbmlsBQNuaWwJAM4IAgUFc3RhdGUFCm5ld0FjdGlvbnMEEWFsbEZhY3RvcnlBY3Rpb25zCgACJGwFBXR4SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxhZGROZXdBY3Rpb24CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAgUDbmlsBRFhbGxGYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARdjbGFpbUNvbGxhdGVyYWxSRUFET05MWQIQdXNlckFkZHJlc3NCeXRlcwR0eElkBAhyZXNwb25zZQkBJWNsYWltQ29sbGF0ZXJhbFJFQURPTkxZU3RyaW5nUmVzcG9uc2UDBRB1c2VyQWRkcmVzc0J5dGVzCQDZBAEFBHR4SWQIBQFpDXRyYW5zYWN0aW9uSWQJAJQKAgUDbmlsBQhyZXNwb25zZQFpARtjbGFpbUNvbGxhdGVyYWxCdWxrUkVBRE9OTFkCEHVzZXJBZGRyZXNzQnl0ZXMFdHhJZHMKAQtwcm9jZXNzVHhJZAIFc3RhdGUEdHhJZAQIcmVzcG9uc2UJASVjbGFpbUNvbGxhdGVyYWxSRUFET05MWVN0cmluZ1Jlc3BvbnNlAwUQdXNlckFkZHJlc3NCeXRlcwkA2QQBBQR0eElkCAUBaQ10cmFuc2FjdGlvbklkCQDNCAIFBXN0YXRlBQhyZXNwb25zZQQMYWxsUmVzcG9uc2VzCgACJGwFBXR4SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQtwcm9jZXNzVHhJZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCBQNuaWwFDGFsbFJlc3BvbnNlcwFpAQ1wcm9jZXNzQmxvY2tzARB1c2VyQWRkcmVzc0J5dGVzBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBD2tleVBlcmlvZExlbmd0aAAJAQd3cmFwRXJyAQIVaW52YWxpZCBwZXJpb2QgbGVuZ3RoBBJjdXJyZW50U3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDmtleVN0YXJ0SGVpZ2h0AQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAhRpbnZhbGlkIHN0YXJ0IGhlaWdodAQSY3VycmVudFByaWNlT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARFrZXlQcmljZUZvclBlcmlvZAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAQd3cmFwRXJyAQINaW52YWxpZCBwcmljZQQSbmV4dEJsb2NrVG9Qcm9jZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARVrZXlOZXh0QmxvY2tUb1Byb2Nlc3MACQEHd3JhcEVycgECHWludmFsaWQgbmV4dCBibG9jayB0byBwcm9jZXNzBA9wZXJpb2RFbmRIZWlnaHQJAGUCCQBkAgUSY3VycmVudFN0YXJ0SGVpZ2h0BQxwZXJpb2RMZW5ndGgAAQQcYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZU1heAAoBBlibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplAwMDCQBnAgUGaGVpZ2h0BRJuZXh0QmxvY2tUb1Byb2Nlc3MDCQBnAgUSbmV4dEJsb2NrVG9Qcm9jZXNzBRJjdXJyZW50U3RhcnRIZWlnaHQGCQAAAgUTY3VycmVudFBlcmlvZE9yRmFpbAAABwkAZwIFD3BlcmlvZEVuZEhlaWdodAUSbmV4dEJsb2NrVG9Qcm9jZXNzBwkAlwMBCQDMCAIJAGQCCQBlAgUPcGVyaW9kRW5kSGVpZ2h0BRJuZXh0QmxvY2tUb1Byb2Nlc3MAAQkAzAgCBRxibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplTWF4BQNuaWwJAQh0aHJvd0VycgEJAQd3cmFwRXJyAQIUaW52YWxpZCB0YXJnZXQgYmxvY2sEFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEYa2V5QmxvY2tQcm9jZXNzaW5nUmV3YXJkAAkBB3dyYXBFcnIBAh9pbnZhbGlkIGJsb2NrIHByb2Nlc3NpbmcgcmV3YXJkBCBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgkAaQIFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQQpYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3JSZW1haW5kZXIJAGUCBRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQJAGgCBSBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQoBA21hcAIDYWNjA2luYwMJAGcCBQNpbmMFGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUFA2FjYwQRdGFyZ2V0QmxvY2tIZWlnaHQJAGQCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFA2luYwQPdGFyZ2V0QmxvY2tJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAO0HAQURdGFyZ2V0QmxvY2tIZWlnaHQJAQd3cmFwRXJyAQISaW52YWxpZCBibG9jayBpbmZvBBR0cmVhc3VyeVJld2FyZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEPcmV3YXJkRm9yT3B0aW9uAggFD3RhcmdldEJsb2NrSW5mbwdyZXdhcmRzBRpwcm94eVRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBB3dyYXBFcnIBCQCsAgICI2ludmFsaWQgdHJlYXN1cnkgcmV3YXJkIGZvciBoZWlnaHQgCQCkAwEFEXRhcmdldEJsb2NrSGVpZ2h0BAlnZW5lcmF0b3IIBQ90YXJnZXRCbG9ja0luZm8JZ2VuZXJhdG9yBAlhdmFpbGFibGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQxrZXlBdmFpbGFibGUBBQlnZW5lcmF0b3IAAAQMY2FsbGVyUmV3YXJkAwkAAAIFA2luYwkAZQIFGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUAAQkAZAIFIGJsb2NrUHJvY2Vzc2luZ1Jld2FyZEJ5R2VuZXJhdG9yBSlibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvclJlbWFpbmRlcgUgYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3IEDWxwQXNzZXRBbW91bnQDCQBmAgUSY3VycmVudFByaWNlT3JGYWlsAAAJAGsDCQBlAgUUdHJlYXN1cnlSZXdhcmRPckZhaWwFDGNhbGxlclJld2FyZAUGU0NBTEU4BRJjdXJyZW50UHJpY2VPckZhaWwAAAQUZmFjdG9yeUFjdGlvbnNTaW5nbGUJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAILc3RyaW5nRW50cnkJAMwIAgkBEWtleUJsb2NrUHJvY2Vzc2VkAQURdGFyZ2V0QmxvY2tIZWlnaHQJAMwIAgkAuQkCCQDMCAIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkAzAgCCQCkAwEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAMwIAgkApQgBBQlnZW5lcmF0b3IJAMwIAgkA2AQBBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIJAKQDAQUUdHJlYXN1cnlSZXdhcmRPckZhaWwJAMwIAgkApAMBBQxjYWxsZXJSZXdhcmQJAMwIAgkApAMBBQ1scEFzc2V0QW1vdW50BQNuaWwFA1NFUAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQxrZXlBdmFpbGFibGUBBQlnZW5lcmF0b3IJAMwIAgkAZAIFCWF2YWlsYWJsZQUNbHBBc3NldEFtb3VudAUDbmlsBQNuaWwFA25pbAMJAAACBRRmYWN0b3J5QWN0aW9uc1NpbmdsZQUUZmFjdG9yeUFjdGlvbnNTaW5nbGUEDSR0MDI3NTQ4Mjc1ODEFA2FjYwQKbHBBc3NldEFjYwgFDSR0MDI3NTQ4Mjc1ODECXzEECXJld2FyZEFjYwgFDSR0MDI3NTQ4Mjc1ODECXzIJAJQKAgkAZAIFCmxwQXNzZXRBY2MFDWxwQXNzZXRBbW91bnQJAGQCBQlyZXdhcmRBY2MFFHRyZWFzdXJ5UmV3YXJkT3JGYWlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBARsaXN0CQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOCQDMCAIADwkAzAgCABAJAMwIAgARCQDMCAIAEgkAzAgCABMJAMwIAgAUCQDMCAIAFQkAzAgCABYJAMwIAgAXCQDMCAIAGAkAzAgCABkJAMwIAgAaCQDMCAIAGwkAzAgCABwJAMwIAgAdCQDMCAIAHgkAzAgCAB8JAMwIAgAgCQDMCAIAIQkAzAgCACIJAMwIAgAjCQDMCAIAJAkAzAgCACUJAMwIAgAmCQDMCAIAJwUDbmlsBA0kdDAyNzg0ODI3OTI0CgACJGwFBGxpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNtYXACBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDQwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgDCQAAAgUNJHQwMjc4NDgyNzkyNAUNJHQwMjc4NDgyNzkyNAQRcmV3YXJkQW1vdW50VG90YWwIBQ0kdDAyNzg0ODI3OTI0Al8yBBJscEFzc2V0QW1vdW50VG90YWwIBQ0kdDAyNzg0ODI3OTI0Al8xBBRidXNpbmVzc1RyZWFzdXJ5UGFydAkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBF2tleUJ1c2luZXNzVHJlYXN1cnlQYXJ0AAAABB5yZXdhcmRUb0J1c2luZXNzVHJlYXN1cnlBbW91bnQJAGsDBRFyZXdhcmRBbW91bnRUb3RhbAUUYnVzaW5lc3NUcmVhc3VyeVBhcnQFBlNDQUxFOAQacmV3YXJkVG9NYWluVHJlYXN1cnlBbW91bnQJAGUCCQBlAgURcmV3YXJkQW1vdW50VG90YWwFHnJld2FyZFRvQnVzaW5lc3NUcmVhc3VyeUFtb3VudAUVYmxvY2tQcm9jZXNzaW5nUmV3YXJkBAhpbnZlc3RlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBC2tleUludmVzdGVkAQUEdW5pdAAABAdhY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCB3JlaXNzdWUJAMwIAgUSbHBBc3NldEFtb3VudFRvdGFsBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAMwIAgkAZAIFEm5leHRCbG9ja1RvUHJvY2VzcwUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIZdHJhbnNmZXJGcm9tUHJveHlUcmVhc3VyeQkAzAgCCAUZbWFpblRyZWFzdXJ5QWRkcmVzc09yRmFpbAVieXRlcwkAzAgCBRpyZXdhcmRUb01haW5UcmVhc3VyeUFtb3VudAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIZdHJhbnNmZXJGcm9tUHJveHlUcmVhc3VyeQkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIZdHJhbnNmZXJGcm9tUHJveHlUcmVhc3VyeQkAzAgCCAUdYnVzaW5lc3NUcmVhc3VyeUFkZHJlc3NPckZhaWwFYnl0ZXMJAMwIAgUecmV3YXJkVG9CdXNpbmVzc1RyZWFzdXJ5QW1vdW50BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBC2tleUludmVzdGVkAQUEdW5pdAkAzAgCCQBkAgUIaW52ZXN0ZWQFGnJld2FyZFRvTWFpblRyZWFzdXJ5QW1vdW50BQNuaWwFA25pbAUDbmlsAwkAAAIFB2FjdGlvbnMFB2FjdGlvbnMJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQJcHVibGljS2V5BAckbWF0Y2gwCQEZZ2V0TWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDcHViBQckbWF0Y2gwBQNwdWIIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCXB1YmxpY0tleXCir9g=", "height": 2701735, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5Ckarhp8XofjGwC1C3A8iQ5HomdERTtzi2SvuwSa8tEb Next: GEimRHwKJoyZKiLey5tfCVDAAY4FPbAPPUxrTsbRktnA Diff:
OldNewDifferences
571571 let checkCaller = onlyFactory(i)
572572 if ((checkCaller == checkCaller))
573573 then {
574- let $t02163821821 = claimCollateralINTERNAL(userAddressBytes, txId, i.transactionId)
575- let userAddress = $t02163821821._1
576- let lpAssetAmount = $t02163821821._2
577- let targetPeriod = $t02163821821._3
578- let wavesAmount = $t02163821821._4
579- let assetsString = $t02163821821._5
580- let amountsString = $t02163821821._6
574+ let $t02163421836 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId), i.transactionId)
575+ let userAddress = $t02163421836._1
576+ let lpAssetAmount = $t02163421836._2
577+ let targetPeriod = $t02163421836._3
578+ let wavesAmount = $t02163421836._4
579+ let assetsString = $t02163421836._5
580+ let amountsString = $t02163421836._6
581581 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
582582 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
583- let factoryActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, txId)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, txId), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
583+ let factoryActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
584584 $Tuple2(nil, factoryActions)
585585 }
586586 else throw("Strict value is not equal to itself.")
594594 if ((checkCaller == checkCaller))
595595 then {
596596 func addNewAction (state,txId) = {
597- let $t02254922746 = claimCollateralINTERNAL(userAddressBytes, txId, i.transactionId)
598- let userAddress = $t02254922746._1
599- let lpAssetAmount = $t02254922746._2
600- let targetPeriod = $t02254922746._3
601- let wavesAmount = $t02254922746._4
602- let assetsString = $t02254922746._5
603- let amountsString = $t02254922746._6
597+ let $t02259422810 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId), i.transactionId)
598+ let userAddress = $t02259422810._1
599+ let lpAssetAmount = $t02259422810._2
600+ let targetPeriod = $t02259422810._3
601+ let wavesAmount = $t02259422810._4
602+ let assetsString = $t02259422810._5
603+ let amountsString = $t02259422810._6
604604 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
605605 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
606- let newActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, txId)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, txId), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
606+ let newActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
607607 (state ++ newActions)
608608 }
609609
630630
631631 @Callable(i)
632632 func claimCollateralREADONLY (userAddressBytes,txId) = {
633- let response = claimCollateralREADONLYStringResponse(userAddressBytes, txId, i.transactionId)
633+ let response = claimCollateralREADONLYStringResponse(userAddressBytes, fromBase58String(txId), i.transactionId)
634634 $Tuple2(nil, response)
635635 }
636636
639639 @Callable(i)
640640 func claimCollateralBulkREADONLY (userAddressBytes,txIds) = {
641641 func processTxId (state,txId) = {
642- let response = claimCollateralREADONLYStringResponse(userAddressBytes, txId, i.transactionId)
642+ let response = claimCollateralREADONLYStringResponse(userAddressBytes, fromBase58String(txId), i.transactionId)
643643 (state :+ response)
644644 }
645645
704704 let factoryActionsSingle = [invoke(factoryAddressOrFail, "stringEntry", [keyBlockProcessed(targetBlockHeight), makeString([toBase58String(i.transactionId), toString(currentPeriodOrFail), toString(generator), toBase58String(userAddressBytes), toString(treasuryRewardOrFail), toString(callerReward), toString(lpAssetAmount)], SEP)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(generator), (available + lpAssetAmount)], nil)]
705705 if ((factoryActionsSingle == factoryActionsSingle))
706706 then {
707- let $t02742027453 = acc
708- let lpAssetAcc = $t02742027453._1
709- let rewardAcc = $t02742027453._2
707+ let $t02754827581 = acc
708+ let lpAssetAcc = $t02754827581._1
709+ let rewardAcc = $t02754827581._2
710710 $Tuple2((lpAssetAcc + lpAssetAmount), (rewardAcc + treasuryRewardOrFail))
711711 }
712712 else throw("Strict value is not equal to itself.")
713713 }
714714
715715 let list = [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]
716- let $t02772027796 = {
716+ let $t02784827924 = {
717717 let $l = list
718718 let $s = size($l)
719719 let $acc0 = $Tuple2(0, 0)
727727
728728 $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($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)
729729 }
730- if (($t02772027796 == $t02772027796))
730+ if (($t02784827924 == $t02784827924))
731731 then {
732- let rewardAmountTotal = $t02772027796._2
733- let lpAssetAmountTotal = $t02772027796._1
732+ let rewardAmountTotal = $t02784827924._2
733+ let lpAssetAmountTotal = $t02784827924._1
734734 let businessTreasuryPart = valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0)
735735 let rewardToBusinessTreasuryAmount = fraction(rewardAmountTotal, businessTreasuryPart, SCALE8)
736736 let rewardToMainTreasuryAmount = ((rewardAmountTotal - rewardToBusinessTreasuryAmount) - blockProcessingReward)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let CONTRACT_NAME = "calculator.ride"
77
88 let SCALE8 = 100000000
99
1010 let PENDING = "PENDING"
1111
1212 let WAVES = "WAVES"
1313
1414 func wrapErr (s) = ((CONTRACT_NAME + ": ") + s)
1515
1616
1717 func throwErr (s) = throw(wrapErr(s))
1818
1919
2020 func assetIdToString (assetId) = match assetId {
2121 case b: ByteVector =>
2222 toBase58String(b)
2323 case _: Unit =>
2424 WAVES
2525 case _ =>
2626 throw("Match error")
2727 }
2828
2929
3030 func stringToAssetId (s) = if ((s == WAVES))
3131 then unit
3232 else fromBase58String(s)
3333
3434
3535 func abs (n) = if ((0 > n))
3636 then -(n)
3737 else n
3838
3939
4040 func keyFactoryAddress () = makeString(["%s", "factory"], SEP)
4141
4242
4343 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
4444
4545
4646 func keyLpAssetId () = makeString(["%s", "lpAssetId"], SEP)
4747
4848
4949 func keyProxyTreasuryAddress () = makeString(["%s", "proxyTreasury"], SEP)
5050
5151
5252 func keyMainTreasuryAddress () = makeString(["%s", "mainTreasury"], SEP)
5353
5454
5555 func keyBusinessTreasuryAddress () = makeString(["%s", "businessTreasury"], SEP)
5656
5757
5858 func keyBusinessTreasuryPart () = makeString(["%s", "businessTreasuryPart"], SEP)
5959
6060
6161 func keyInvested (assetId) = makeString(["%s%s", "invested", assetIdToString(assetId)], SEP)
6262
6363
6464 func keyDonated (assetId) = makeString(["%s%s", "donated", assetIdToString(assetId)], SEP)
6565
6666
6767 func keyAvailable (userAddress) = makeString(["%s%s", "available", toString(userAddress)], SEP)
6868
6969
7070 func keyClaimed (userAddress) = makeString(["%s%s", "claimed", toString(userAddress)], SEP)
7171
7272
7373 func keyCurrentPeriod () = makeString(["%s", "currentPeriod"], SEP)
7474
7575
7676 func keyPriceForPeriod (period) = makeString(["%s%d", "price", toString(period)], SEP)
7777
7878
7979 func keyStartHeight (period) = makeString(["%s%d", "startHeight", toString(period)], SEP)
8080
8181
8282 func keyPowerManagerBonus (period) = makeString(["%s%d", "powerManagerBonus", toString(period)], SEP)
8383
8484
8585 func keyPeriodLength () = "%s__periodLength"
8686
8787
8888 func keyBlockProcessingReward () = "%s__blockProcessingReward"
8989
9090
9191 func keyNextBlockToProcess () = "%s__nextBlockToProcess"
9292
9393
9494 func keyBlockProcessed (height) = makeString(["%s%d", "blockProcessed", toString(height)], SEP)
9595
9696
9797 func keyWithdrawal () = "%s__withdrawal"
9898
9999
100100 func keyWithdrawalRequest (userAddress,txId) = makeString(["%s%s%s", "withdrawal", toString(userAddress), toBase58String(txId)], SEP)
101101
102102
103103 func valueWithdrawalRequest (status,lpAssetAmount,targetPeriod,claimTxId) = {
104104 let claimTxIdStr = match claimTxId {
105105 case b: ByteVector =>
106106 toBase58String(b)
107107 case _: Unit =>
108108 "SOON"
109109 case _ =>
110110 throw("Match error")
111111 }
112112 makeString(["%s%d%d%s", status, toString(lpAssetAmount), toString(targetPeriod), claimTxIdStr], SEP)
113113 }
114114
115115
116116 func keyWithdrawalHistory (userAddress,txId) = makeString(["%s%s%s", "withdrawalHistory", toString(userAddress), toBase58String(txId)], SEP)
117117
118118
119119 func keyPeriodWithdrawalAssetIds (period) = makeString(["%s%d", "periodReward", toString(period)], SEP)
120120
121121
122122 func keyPeriodWithdrawalAmounts (period) = makeString(["%s%d", "periodRewardAmount", toString(period)], SEP)
123123
124124
125125 func parseWithdrawalRequestValueOrFail (s) = {
126126 let parts = split(s, SEP)
127127 if ((size(parts) == 5))
128128 then {
129129 let status = parts[1]
130130 let lpAssetAmount = valueOrErrorMessage(parseInt(parts[2]), wrapErr("invalid lpAssetAmount"))
131131 let targetPeriod = valueOrErrorMessage(parseInt(parts[3]), wrapErr("invalid targetPeriod"))
132132 let claimTxId = parts[4]
133133 $Tuple4(status, lpAssetAmount, targetPeriod, claimTxId)
134134 }
135135 else throwErr("invalid withdrawal request value")
136136 }
137137
138138
139139 let factoryAddressOption = match getString(this, keyFactoryAddress()) {
140140 case s: String =>
141141 addressFromString(s)
142142 case _: Unit =>
143143 unit
144144 case _ =>
145145 throw("Match error")
146146 }
147147
148148 let factoryAddressOrFail = valueOrErrorMessage(factoryAddressOption, wrapErr("invalid factory address"))
149149
150150 let lpAssetIdOption = match factoryAddressOption {
151151 case a: Address =>
152152 match getString(a, keyLpAssetId()) {
153153 case s: String =>
154154 fromBase58String(s)
155155 case _: Unit =>
156156 unit
157157 case _ =>
158158 throw("Match error")
159159 }
160160 case _: Unit =>
161161 unit
162162 case _ =>
163163 throw("Match error")
164164 }
165165
166166 let lpAssetIdOrFail = valueOrErrorMessage(lpAssetIdOption, wrapErr("invalid lpAssetId"))
167167
168168 let proxyTreasuryAddressOption = match factoryAddressOption {
169169 case a: Address =>
170170 match getString(a, keyProxyTreasuryAddress()) {
171171 case s: String =>
172172 addressFromString(s)
173173 case _: Unit =>
174174 unit
175175 case _ =>
176176 throw("Match error")
177177 }
178178 case _: Unit =>
179179 unit
180180 case _ =>
181181 throw("Match error")
182182 }
183183
184184 let proxyTreasuryAddressOrFail = valueOrErrorMessage(proxyTreasuryAddressOption, wrapErr("invalid proxy treasury address"))
185185
186186 let mainTreasuryAddressOption = match factoryAddressOption {
187187 case a: Address =>
188188 match getString(a, keyMainTreasuryAddress()) {
189189 case s: String =>
190190 addressFromString(s)
191191 case _: Unit =>
192192 unit
193193 case _ =>
194194 throw("Match error")
195195 }
196196 case _: Unit =>
197197 unit
198198 case _ =>
199199 throw("Match error")
200200 }
201201
202202 let businessTreasuryAddressOption = match factoryAddressOption {
203203 case a: Address =>
204204 match getString(a, keyBusinessTreasuryAddress()) {
205205 case s: String =>
206206 addressFromString(s)
207207 case _: Unit =>
208208 unit
209209 case _ =>
210210 throw("Match error")
211211 }
212212 case _: Unit =>
213213 unit
214214 case _ =>
215215 throw("Match error")
216216 }
217217
218218 let mainTreasuryAddressOrFail = valueOrErrorMessage(mainTreasuryAddressOption, wrapErr("invalid main treasury address"))
219219
220220 let businessTreasuryAddressOrFail = valueOrErrorMessage(businessTreasuryAddressOption, wrapErr("invalid business treasury address"))
221221
222222 func getManagerPublicKeyOrUnit () = match factoryAddressOption {
223223 case fa: Address =>
224224 match getString(fa, keyManagerPublicKey()) {
225225 case pub: String =>
226226 fromBase58String(pub)
227227 case _ =>
228228 unit
229229 }
230230 case _ =>
231231 unit
232232 }
233233
234234
235235 func onlyAddress (i,address) = if ((i.caller == address))
236236 then true
237237 else throwErr("permission denied")
238238
239239
240240 func onlyFactory (i) = onlyAddress(i, factoryAddressOrFail)
241241
242242
243243 func rewardForOption (rewards,target) = {
244244 let s = size(rewards)
245245 let $t057295754 = rewards[0]
246246 let a0 = $t057295754._1
247247 let r0 = $t057295754._2
248248 let $t057575782 = rewards[1]
249249 let a1 = $t057575782._1
250250 let r1 = $t057575782._2
251251 let $t057855810 = rewards[2]
252252 let a2 = $t057855810._1
253253 let r2 = $t057855810._2
254254 if (if ((s > 0))
255255 then (a0 == target)
256256 else false)
257257 then r0
258258 else if (if ((s > 1))
259259 then (a1 == target)
260260 else false)
261261 then r1
262262 else if (if ((s > 2))
263263 then (a2 == target)
264264 else false)
265265 then r2
266266 else unit
267267 }
268268
269269
270270 func finalizeINTERNAL (newTreasuryVolumeInWaves,pwrManagersBonusInWaves,treasuryVolumeDiffAllocationCoef) = {
271271 let donatedWavesAmount = valueOrElse(getInteger(factoryAddressOrFail, keyDonated(unit)), 0)
272272 let investedWavesAmount = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
273273 let currentTreasuryVolumeInWaves = (donatedWavesAmount + investedWavesAmount)
274274 let profitRaw = (newTreasuryVolumeInWaves - currentTreasuryVolumeInWaves)
275275 let pwrManagersBonusAmount = if (if ((profitRaw >= pwrManagersBonusInWaves))
276276 then true
277277 else (pwrManagersBonusInWaves == 0))
278278 then pwrManagersBonusInWaves
279279 else throwErr("power bonus is more than profit")
280280 let profit = (profitRaw - pwrManagersBonusAmount)
281281 let donationPart = if ((currentTreasuryVolumeInWaves > 0))
282282 then fraction(donatedWavesAmount, SCALE8, currentTreasuryVolumeInWaves)
283283 else 0
284284 let donationProfitPartRaw = fraction(profit, donationPart, SCALE8)
285285 let investmentProfitPartRaw = (profit - donationProfitPartRaw)
286286 let treasuryVolumeDiffAllocationCoefAbs = abs(treasuryVolumeDiffAllocationCoef)
287287 let amountToDonation = fraction(investmentProfitPartRaw, if ((0 > treasuryVolumeDiffAllocationCoef))
288288 then treasuryVolumeDiffAllocationCoefAbs
289289 else 0, SCALE8)
290290 let amountToInvestment = fraction(donationProfitPartRaw, if ((treasuryVolumeDiffAllocationCoef > 0))
291291 then treasuryVolumeDiffAllocationCoefAbs
292292 else 0, SCALE8)
293293 let donationProfitPart = ((donationProfitPartRaw - amountToInvestment) + amountToDonation)
294294 let investmentProfitPart = ((investmentProfitPartRaw - amountToDonation) + amountToInvestment)
295295 let donatedWavesAmountNewRaw = (donatedWavesAmount + donationProfitPart)
296296 let investedWavesAmountNewRaw = (investedWavesAmount + investmentProfitPart)
297297 let donatedPartDebt = min([0, donatedWavesAmountNewRaw])
298298 let investedPartDebt = min([0, investedWavesAmountNewRaw])
299299 let donatedWavesAmountNew = (max([0, donatedWavesAmountNewRaw]) + investedPartDebt)
300300 let investedWavesAmountNew = (max([0, investedWavesAmountNewRaw]) + donatedPartDebt)
301301 let lpAssetQuantity = valueOrErrorMessage(assetInfo(lpAssetIdOrFail), wrapErr("invalid lpAsset info")).quantity
302302 let newPrice = fraction(investedWavesAmountNew, SCALE8, lpAssetQuantity)
303303 let checkIfPriceNotZero = if ((newPrice != 0))
304304 then true
305305 else throwErr("LP price cannot be 0")
306306 if ((checkIfPriceNotZero == checkIfPriceNotZero))
307307 then {
308308 let lpAssetAmountToBurn = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
309309 let paymentAmountMin = max([0, fraction(lpAssetAmountToBurn, newPrice, SCALE8)])
310310 let finalInvestedWavesAmount = (investedWavesAmountNew - paymentAmountMin)
311311 let lpAssetFinalQuantity = (lpAssetQuantity - lpAssetAmountToBurn)
312312 $Tuple6(paymentAmountMin, finalInvestedWavesAmount, donatedWavesAmountNew, newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity)
313313 }
314314 else throw("Strict value is not equal to itself.")
315315 }
316316
317317
318318 func claimCollateralINTERNAL (userAddressBytes,txId,transactionId) = {
319319 let userAddress = Address(userAddressBytes)
320320 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
321321 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
322322 let $t092529365 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
323323 let status = $t092529365._1
324324 let lpAssetAmount = $t092529365._2
325325 let targetPeriod = $t092529365._3
326326 let claimTxId = $t092529365._4
327327 if ((targetPeriod > currentPeriodOrFail))
328328 then throwErr("invalid withdrawal request period")
329329 else {
330330 let priceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(targetPeriod)), wrapErr("invalid price"))
331331 let wavesAmount = if ((priceOrFail > 0))
332332 then fraction(lpAssetAmount, priceOrFail, SCALE8)
333333 else 0
334334 let assetsString = getStringValue(factoryAddressOrFail, keyPeriodWithdrawalAssetIds(currentPeriodOrFail))
335335 let amountsString = getStringValue(factoryAddressOrFail, keyPeriodWithdrawalAmounts(currentPeriodOrFail))
336336 $Tuple6(userAddress, lpAssetAmount, targetPeriod, wavesAmount, assetsString, amountsString)
337337 }
338338 }
339339
340340
341341 func claimCollateralREADONLYStringResponse (userAddressBytes,txId,transactionId) = {
342342 let $t01017910360 = claimCollateralINTERNAL(userAddressBytes, txId, transactionId)
343343 let userAddress = $t01017910360._1
344344 let lpAssetAmount = $t01017910360._2
345345 let targetPeriod = $t01017910360._3
346346 let wavesAmount = $t01017910360._4
347347 let assetsString = $t01017910360._5
348348 let amountsString = $t01017910360._6
349349 let assets = makeString(removeByIndex(split_51C(assetsString, SEP), 0), ":")
350350 let amounts = makeString(removeByIndex(split_51C(amountsString, SEP), 0), ":")
351351 makeString(["%d%s%s", toString(wavesAmount), assets, amounts], SEP)
352352 }
353353
354354
355355 @Callable(i)
356356 func claimLP (userAddressBytes) = {
357357 let checkCaller = onlyFactory(i)
358358 if ((checkCaller == checkCaller))
359359 then {
360360 let userAddress = Address(userAddressBytes)
361361 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(userAddress)), 0)
362362 let claimed = valueOrElse(getInteger(factoryAddressOrFail, keyClaimed(userAddress)), 0)
363363 let factoryActions = if ((available > 0))
364364 then [invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, available, lpAssetIdOrFail], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(userAddress), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimed(userAddress), (claimed + available)], nil)]
365365 else throwErr("nothing to claim")
366366 $Tuple2(nil, factoryActions)
367367 }
368368 else throw("Strict value is not equal to itself.")
369369 }
370370
371371
372372
373373 @Callable(i)
374374 func finalize (userAddressBytes,newTreasuryVolumeInWaves,pwrManagersBonusInWaves,treasuryVolumeDiffAllocationCoef) = {
375375 let checkCaller = onlyFactory(i)
376376 if ((checkCaller == checkCaller))
377377 then {
378378 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
379379 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
380380 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
381381 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
382382 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
383383 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
384384 let checks = [if ((i.originCaller == mainTreasuryAddressOrFail))
385385 then true
386386 else throwErr("permission denied"), if ((nextBlockToProcess > periodEndHeight))
387387 then true
388388 else throwErr("unprocessed blocks"), if ((newTreasuryVolumeInWaves >= 0))
389389 then true
390390 else throwErr("invalid new treasury volume"), if ((pwrManagersBonusInWaves >= 0))
391391 then true
392392 else throwErr("invalid PWR managers bonus"), if (if ((treasuryVolumeDiffAllocationCoef >= -(SCALE8)))
393393 then (SCALE8 >= treasuryVolumeDiffAllocationCoef)
394394 else false)
395395 then true
396396 else throwErr("invalid treasury volume diff allocation coefficient")]
397397 if ((checks == checks))
398398 then {
399399 let $t01312213382 = finalizeINTERNAL(newTreasuryVolumeInWaves, pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef)
400400 let paymentAmountMin = $t01312213382._1
401401 let finalInvestedWavesAmount = $t01312213382._2
402402 let donatedWavesAmountNew = $t01312213382._3
403403 let newPrice = $t01312213382._4
404404 let lpAssetAmountToBurn = $t01312213382._5
405405 let lpAssetFinalQuantity = $t01312213382._6
406406 let newPeriod = (currentPeriodOrFail + 1)
407407 func addNewAction (actions,payment) = {
408408 let $t01353013592 = actions
409409 let scriptTransfers = $t01353013592._1
410410 let assetIdsString = $t01353013592._2
411411 let amountsString = $t01353013592._3
412412 let paymentAmount = payment.amount
413413 let paymentAssetId = payment.assetId
414414 let newAssetIdsString = ("%s" + makeString([assetIdsString, assetIdToString(paymentAssetId)], SEP))
415415 let newAmountsString = ("%d" + makeString([amountsString, toString(paymentAmount)], SEP))
416416 let newScriptTransfer = ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)
417417 $Tuple3((scriptTransfers :+ newScriptTransfer), newAssetIdsString, newAmountsString)
418418 }
419419
420420 let $t01405214143 = {
421421 let $l = i.payments
422422 let $s = size($l)
423423 let $acc0 = $Tuple3(nil, "", "")
424424 func $f0_1 ($a,$i) = if (($i >= $s))
425425 then $a
426426 else addNewAction($a, $l[$i])
427427
428428 func $f0_2 ($a,$i) = if (($i >= $s))
429429 then $a
430430 else throw("List size exceeds 10")
431431
432432 $f0_2($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)
433433 }
434434 let scriptTransfers = $t01405214143._1
435435 let AssetIds = $t01405214143._2
436436 let Amounts = $t01405214143._3
437437 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), pwrManagersBonusInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyCurrentPeriod(), newPeriod], nil), invoke(factoryAddressOrFail, "integerEntry", [keyPriceForPeriod(newPeriod), newPrice], nil), invoke(factoryAddressOrFail, "integerEntry", [keyStartHeight(newPeriod), (periodEndHeight + 1)], nil), invoke(factoryAddressOrFail, "burn", [lpAssetAmountToBurn], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), finalInvestedWavesAmount], nil), invoke(factoryAddressOrFail, "integerEntry", [keyDonated(unit), donatedWavesAmountNew], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAssetIds(newPeriod), AssetIds], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAmounts(newPeriod), Amounts], nil)]
438438 $Tuple2(scriptTransfers, factoryActions)
439439 }
440440 else throw("Strict value is not equal to itself.")
441441 }
442442 else throw("Strict value is not equal to itself.")
443443 }
444444
445445
446446
447447 @Callable(i)
448448 func finalizeREADONLY (newTreasuryVolumeInWaves,pwrManagersBonusInWaves,treasuryVolumeDiffAllocationCoef) = {
449449 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
450450 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
451451 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
452452 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
453453 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
454454 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
455455 let checks = [if ((nextBlockToProcess > periodEndHeight))
456456 then true
457457 else throwErr("unprocessed blocks"), if ((newTreasuryVolumeInWaves >= 0))
458458 then true
459459 else throwErr("invalid new treasury volume"), if ((pwrManagersBonusInWaves >= 0))
460460 then true
461461 else throwErr("invalid PWR managers bonus"), if (if ((treasuryVolumeDiffAllocationCoef >= -(SCALE8)))
462462 then (SCALE8 >= treasuryVolumeDiffAllocationCoef)
463463 else false)
464464 then true
465465 else throwErr("invalid treasury volume diff allocation coefficient")]
466466 if ((checks == checks))
467467 then $Tuple2(nil, finalizeINTERNAL(newTreasuryVolumeInWaves, pwrManagersBonusInWaves, treasuryVolumeDiffAllocationCoef))
468468 else throw("Strict value is not equal to itself.")
469469 }
470470
471471
472472
473473 @Callable(i)
474474 func invest (userAddressBytes) = {
475475 let checkCaller = onlyFactory(i)
476476 if ((checkCaller == checkCaller))
477477 then {
478478 let userAddress = Address(userAddressBytes)
479479 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
480480 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
481481 let payment = if ((size(i.payments) == 1))
482482 then i.payments[0]
483483 else throwErr("invalid payments")
484484 let $t01762417801 = if (if ((payment.assetId == unit))
485485 then (payment.amount > 0)
486486 else false)
487487 then $Tuple2(payment.amount, payment.assetId)
488488 else throwErr("invalid payment amount")
489489 let paymentAmount = $t01762417801._1
490490 let paymentAssetId = $t01762417801._2
491491 let treasuryPart = valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0)
492492 let paymentsWithoutTreasuryPart = fraction(paymentAmount, (SCALE8 - treasuryPart), SCALE8)
493493 let lpAssetAmount = if ((currentPriceOrFail > 0))
494494 then fraction(paymentsWithoutTreasuryPart, SCALE8, currentPriceOrFail)
495495 else 0
496496 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
497497 let actions = [ScriptTransfer(mainTreasuryAddressOrFail, paymentsWithoutTreasuryPart, paymentAssetId), ScriptTransfer(businessTreasuryAddressOrFail, treasuryPart, paymentAssetId)]
498498 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + paymentsWithoutTreasuryPart)], nil), invoke(factoryAddressOrFail, "reissue", [lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
499499 $Tuple2(actions, factoryActions)
500500 }
501501 else throw("Strict value is not equal to itself.")
502502 }
503503
504504
505505
506506 @Callable(i)
507507 func withdraw (userAddressBytes) = {
508508 let checkCaller = onlyFactory(i)
509509 if ((checkCaller == checkCaller))
510510 then {
511511 let userAddress = Address(userAddressBytes)
512512 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
513513 let payment = if ((size(i.payments) == 1))
514514 then i.payments[0]
515515 else throwErr(wrapErr("invalid payments"))
516516 let paymentAssetId = if ((payment.assetId == lpAssetIdOrFail))
517517 then lpAssetIdOrFail
518518 else throwErr("invalid payment asset")
519519 let paymentAmount = if ((payment.amount > 0))
520520 then payment.amount
521521 else throwErr("invalid payment amount")
522522 let withdrawal = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
523523 let actions = [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
524524 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), (withdrawal + paymentAmount)], nil), invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, (currentPeriodOrFail + 1), unit)], nil)]
525525 if ((factoryActions == factoryActions))
526526 then $Tuple2(actions, factoryActions)
527527 else throw("Strict value is not equal to itself.")
528528 }
529529 else throw("Strict value is not equal to itself.")
530530 }
531531
532532
533533
534534 @Callable(i)
535535 func cancelWithdraw (userAddressBytes,txId) = {
536536 let checkCaller = onlyFactory(i)
537537 if ((checkCaller == checkCaller))
538538 then {
539539 let userAddress = Address(userAddressBytes)
540540 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
541541 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
542542 let $t02053520648 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
543543 let status = $t02053520648._1
544544 let lpAssetAmount = $t02053520648._2
545545 let targetPeriod = $t02053520648._3
546546 let claimTxId = $t02053520648._4
547547 let checks = [if ((status == PENDING))
548548 then true
549549 else throwErr("invalid withdrawal request status"), if ((targetPeriod > currentPeriodOrFail))
550550 then true
551551 else throwErr("invalid withdrawal request period")]
552552 if ((checks == checks))
553553 then {
554554 let withdrawal = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyWithdrawal()), wrapErr("invalid total withdrawal amount"))
555555 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), if ((withdrawal >= lpAssetAmount))
556556 then (withdrawal - lpAssetAmount)
557557 else throwErr("invalid withdrawal amount")], nil), invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, txId)], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
558558 if ((factoryActions == factoryActions))
559559 then $Tuple2(nil, factoryActions)
560560 else throw("Strict value is not equal to itself.")
561561 }
562562 else throw("Strict value is not equal to itself.")
563563 }
564564 else throw("Strict value is not equal to itself.")
565565 }
566566
567567
568568
569569 @Callable(i)
570570 func claimCollateral (userAddressBytes,txId) = {
571571 let checkCaller = onlyFactory(i)
572572 if ((checkCaller == checkCaller))
573573 then {
574- let $t02163821821 = claimCollateralINTERNAL(userAddressBytes, txId, i.transactionId)
575- let userAddress = $t02163821821._1
576- let lpAssetAmount = $t02163821821._2
577- let targetPeriod = $t02163821821._3
578- let wavesAmount = $t02163821821._4
579- let assetsString = $t02163821821._5
580- let amountsString = $t02163821821._6
574+ let $t02163421836 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId), i.transactionId)
575+ let userAddress = $t02163421836._1
576+ let lpAssetAmount = $t02163421836._2
577+ let targetPeriod = $t02163421836._3
578+ let wavesAmount = $t02163421836._4
579+ let assetsString = $t02163421836._5
580+ let amountsString = $t02163421836._6
581581 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
582582 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
583- let factoryActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, txId)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, txId), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
583+ let factoryActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
584584 $Tuple2(nil, factoryActions)
585585 }
586586 else throw("Strict value is not equal to itself.")
587587 }
588588
589589
590590
591591 @Callable(i)
592592 func claimCollateralBulk (userAddressBytes,txIds) = {
593593 let checkCaller = onlyFactory(i)
594594 if ((checkCaller == checkCaller))
595595 then {
596596 func addNewAction (state,txId) = {
597- let $t02254922746 = claimCollateralINTERNAL(userAddressBytes, txId, i.transactionId)
598- let userAddress = $t02254922746._1
599- let lpAssetAmount = $t02254922746._2
600- let targetPeriod = $t02254922746._3
601- let wavesAmount = $t02254922746._4
602- let assetsString = $t02254922746._5
603- let amountsString = $t02254922746._6
597+ let $t02259422810 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId), i.transactionId)
598+ let userAddress = $t02259422810._1
599+ let lpAssetAmount = $t02259422810._2
600+ let targetPeriod = $t02259422810._3
601+ let wavesAmount = $t02259422810._4
602+ let assetsString = $t02259422810._5
603+ let amountsString = $t02259422810._6
604604 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
605605 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
606- let newActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, txId)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, txId), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
606+ let newActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
607607 (state ++ newActions)
608608 }
609609
610610 let allFactoryActions = {
611611 let $l = txIds
612612 let $s = size($l)
613613 let $acc0 = nil
614614 func $f0_1 ($a,$i) = if (($i >= $s))
615615 then $a
616616 else addNewAction($a, $l[$i])
617617
618618 func $f0_2 ($a,$i) = if (($i >= $s))
619619 then $a
620620 else throw("List size exceeds 10")
621621
622622 $f0_2($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)
623623 }
624624 $Tuple2(nil, allFactoryActions)
625625 }
626626 else throw("Strict value is not equal to itself.")
627627 }
628628
629629
630630
631631 @Callable(i)
632632 func claimCollateralREADONLY (userAddressBytes,txId) = {
633- let response = claimCollateralREADONLYStringResponse(userAddressBytes, txId, i.transactionId)
633+ let response = claimCollateralREADONLYStringResponse(userAddressBytes, fromBase58String(txId), i.transactionId)
634634 $Tuple2(nil, response)
635635 }
636636
637637
638638
639639 @Callable(i)
640640 func claimCollateralBulkREADONLY (userAddressBytes,txIds) = {
641641 func processTxId (state,txId) = {
642- let response = claimCollateralREADONLYStringResponse(userAddressBytes, txId, i.transactionId)
642+ let response = claimCollateralREADONLYStringResponse(userAddressBytes, fromBase58String(txId), i.transactionId)
643643 (state :+ response)
644644 }
645645
646646 let allResponses = {
647647 let $l = txIds
648648 let $s = size($l)
649649 let $acc0 = nil
650650 func $f0_1 ($a,$i) = if (($i >= $s))
651651 then $a
652652 else processTxId($a, $l[$i])
653653
654654 func $f0_2 ($a,$i) = if (($i >= $s))
655655 then $a
656656 else throw("List size exceeds 10")
657657
658658 $f0_2($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)
659659 }
660660 $Tuple2(nil, allResponses)
661661 }
662662
663663
664664
665665 @Callable(i)
666666 func processBlocks (userAddressBytes) = {
667667 let checkCaller = onlyFactory(i)
668668 if ((checkCaller == checkCaller))
669669 then {
670670 let userAddress = Address(userAddressBytes)
671671 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
672672 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
673673 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
674674 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
675675 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
676676 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
677677 let blocksProcessingBatchSizeMax = 40
678678 let blocksProcessingBatchSize = if (if (if ((height >= nextBlockToProcess))
679679 then if ((nextBlockToProcess >= currentStartHeight))
680680 then true
681681 else (currentPeriodOrFail == 0)
682682 else false)
683683 then (periodEndHeight >= nextBlockToProcess)
684684 else false)
685685 then min([((periodEndHeight - nextBlockToProcess) + 1), blocksProcessingBatchSizeMax])
686686 else throwErr(wrapErr("invalid target block"))
687687 let blockProcessingReward = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyBlockProcessingReward()), wrapErr("invalid block processing reward"))
688688 let blockProcessingRewardByGenerator = (blockProcessingReward / blocksProcessingBatchSize)
689689 let blockProcessingRewardByGeneratorRemainder = (blockProcessingReward - (blockProcessingRewardByGenerator * blocksProcessingBatchSize))
690690 func map (acc,inc) = if ((inc >= blocksProcessingBatchSize))
691691 then acc
692692 else {
693693 let targetBlockHeight = (nextBlockToProcess + inc)
694694 let targetBlockInfo = valueOrErrorMessage(blockInfoByHeight(targetBlockHeight), wrapErr("invalid block info"))
695695 let treasuryRewardOrFail = valueOrErrorMessage(rewardForOption(targetBlockInfo.rewards, proxyTreasuryAddressOrFail), wrapErr(("invalid treasury reward for height " + toString(targetBlockHeight))))
696696 let generator = targetBlockInfo.generator
697697 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(generator)), 0)
698698 let callerReward = if ((inc == (blocksProcessingBatchSize - 1)))
699699 then (blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder)
700700 else blockProcessingRewardByGenerator
701701 let lpAssetAmount = if ((currentPriceOrFail > 0))
702702 then fraction((treasuryRewardOrFail - callerReward), SCALE8, currentPriceOrFail)
703703 else 0
704704 let factoryActionsSingle = [invoke(factoryAddressOrFail, "stringEntry", [keyBlockProcessed(targetBlockHeight), makeString([toBase58String(i.transactionId), toString(currentPeriodOrFail), toString(generator), toBase58String(userAddressBytes), toString(treasuryRewardOrFail), toString(callerReward), toString(lpAssetAmount)], SEP)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(generator), (available + lpAssetAmount)], nil)]
705705 if ((factoryActionsSingle == factoryActionsSingle))
706706 then {
707- let $t02742027453 = acc
708- let lpAssetAcc = $t02742027453._1
709- let rewardAcc = $t02742027453._2
707+ let $t02754827581 = acc
708+ let lpAssetAcc = $t02754827581._1
709+ let rewardAcc = $t02754827581._2
710710 $Tuple2((lpAssetAcc + lpAssetAmount), (rewardAcc + treasuryRewardOrFail))
711711 }
712712 else throw("Strict value is not equal to itself.")
713713 }
714714
715715 let list = [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]
716- let $t02772027796 = {
716+ let $t02784827924 = {
717717 let $l = list
718718 let $s = size($l)
719719 let $acc0 = $Tuple2(0, 0)
720720 func $f0_1 ($a,$i) = if (($i >= $s))
721721 then $a
722722 else map($a, $l[$i])
723723
724724 func $f0_2 ($a,$i) = if (($i >= $s))
725725 then $a
726726 else throw("List size exceeds 40")
727727
728728 $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($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)
729729 }
730- if (($t02772027796 == $t02772027796))
730+ if (($t02784827924 == $t02784827924))
731731 then {
732- let rewardAmountTotal = $t02772027796._2
733- let lpAssetAmountTotal = $t02772027796._1
732+ let rewardAmountTotal = $t02784827924._2
733+ let lpAssetAmountTotal = $t02784827924._1
734734 let businessTreasuryPart = valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0)
735735 let rewardToBusinessTreasuryAmount = fraction(rewardAmountTotal, businessTreasuryPart, SCALE8)
736736 let rewardToMainTreasuryAmount = ((rewardAmountTotal - rewardToBusinessTreasuryAmount) - blockProcessingReward)
737737 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
738738 let actions = [invoke(factoryAddressOrFail, "reissue", [lpAssetAmountTotal], nil), invoke(factoryAddressOrFail, "integerEntry", [keyNextBlockToProcess(), (nextBlockToProcess + blocksProcessingBatchSize)], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [mainTreasuryAddressOrFail.bytes, rewardToMainTreasuryAmount], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [userAddressBytes, blockProcessingReward], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [businessTreasuryAddressOrFail.bytes, rewardToBusinessTreasuryAmount], nil), invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + rewardToMainTreasuryAmount)], nil)]
739739 if ((actions == actions))
740740 then $Tuple2(nil, unit)
741741 else throw("Strict value is not equal to itself.")
742742 }
743743 else throw("Strict value is not equal to itself.")
744744 }
745745 else throw("Strict value is not equal to itself.")
746746 }
747747
748748
749749 @Verifier(tx)
750750 func verify () = {
751751 let publicKey = match getManagerPublicKeyOrUnit() {
752752 case pub: ByteVector =>
753753 pub
754754 case _ =>
755755 tx.senderPublicKey
756756 }
757757 sigVerify(tx.bodyBytes, tx.proofs[0], publicKey)
758758 }
759759

github/deemru/w8io/169f3d6 
88.75 ms