tx · 3UQnLqrBchZC76HhS4SbtxPmnZ95bUevxUgaVLZdgM7r 3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk: -0.04200000 Waves 2024.01.04 16:34 [3982638] smart account 3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk > SELF 0.00000000 Waves
{ "type": 13, "id": "3UQnLqrBchZC76HhS4SbtxPmnZ95bUevxUgaVLZdgM7r", "fee": 4200000, "feeAssetId": null, "timestamp": 1704375243095, "version": 2, "chainId": 87, "sender": "3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk", "senderPublicKey": "46pxd1r6gmScNqdp82uEJMs2AZ1F9q2z1VtXZPFAtHYy", "proofs": [ "2irKhta7oRdu1CQFBzVN4EZUfuWEw2DVnDVJspsdt1XbwVrSzSpemZaaRVU6KA8QNVW7okPdMA8ZUAsoAXVqksDG" ], "script": "base64:BgICCAI2AAVXYXZlcwIFV0FWRVMABlNjYWxlNgDAhD0ABlNjYWxlOACAwtcvAAlTY2FsZThCaWcJALYCAQCAwtcvAAdTY2FsZTEwAIDIr6AlAAdTY2FsZTE2AICAhP6m3uERAApTY2FsZTE2QmlnCQC2AgEAgICE/qbe4REACWRheUJsb2NrcwCgCwAKeWVhckJsb2NrcwCgiiAADXllYXJCbG9ja3NCaWcJALYCAQCgiiAAC3Jlc2VydmVGdW5kABQABWFycjEyCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALBQNuaWwACXVzZHRJZFN0cgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kACXVzZGNJZFN0cgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cACXJvbWVJZFN0cgIsQVA0Q2I1eExZR0g2WmlnSHJlQ1pIb1hwUVRXRGtQc0cyQkhxZkRVeDZ0YUoAEG9yYWNsZUFkZHJlc3NTdHICIzNQOGQxRTFCTEtvRDUyeTNiUUoxYkRUZDJURDFncGFMbjl0AAtheGx5QWRkcmVzcwkBB0FkZHJlc3MBARoBV8/Idd4LdvyJm/d7rwlIRGcJKlBHPw9CLQAHYXhseUxQcwkAzAgCAiw3S1piSnJWb3B3SmhrZHdiZTFlRkRCYmV4NGRrWTYzTXhqVE5qcVh0cnpqMQkAzAgCAixCdHczRzFqNHdRZ2RwNDlQVHhhRmtOdm43NWRRdHFHRE03ZWpRcHBIbldDMQkAzAgCAixCaVN6RmU4blNMNzhvWmFlYmZvaW41dkJaNVB6ZTZkN2thZWlqTHFyNXhaZQkAzAgCAixGMkFLa0E1MTNrNXlIRUprTHNVNnZXeENZWWs4MTFHcGpMaHdFdjJXR3daOQkAzAgCAiw0Q1E1Q1BHTFhMYldCVXMySkJqS1VhUnFGNDlDbUtIa3d6dlBnU3ZRcEFRVgkAzAgCAiw2aU1CNkxLU3Jndjl3YUV2RW5ONllkeXg3ZGZ4UG5HY1R3ODMxOFdWbTViUgUDbmlsAQxnZXRSYXRlQ3VydmUCCmFzc2V0SWRTdHIJbWFya2V0U3RyBA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQltYXJrZXRTdHIEDnNldHVwUmF0ZUN1cnZlCQCdCAIFDW1hcmtldEFkZHJlc3MJAKwCAgIQc2V0dXBfcmF0ZUN1cnZlXwUKYXNzZXRJZFN0cgMJAQlpc0RlZmluZWQBBQ5zZXR1cFJhdGVDdXJ2ZQQIY3VydmVBcnIJALUJAgkBBXZhbHVlAQUOc2V0dXBSYXRlQ3VydmUCASwJAJYKBAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGN1cnZlQXJyAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhjdXJ2ZUFycgABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIY3VydmVBcnIAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGN1cnZlQXJyAAMEByRtYXRjaDAFCW1hcmtldFN0cgMJAAACAiMzUDR1QTVldG5aaTRBbUJhYktpbnEyYk1pV1U4S2NuSFpkSAUHJG1hdGNoMAQHJG1hdGNoMQUKYXNzZXRJZFN0cgMJAAACAiw5d2MzTFhOQTRURUJzWHlLdG9MRTltcmJERDdXTUhYdlhyQ2padmFiTEFzaQUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixIR2dhYlRxVVM4V3RWRlVKemZtclRETWdFY2NKdVpMQlBoRmdRRnh2bnNvVwUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiwzNE45WWNFRVRMV245M3FZUTY0RXNQMXg4OXRTcnVKVTQ0UnJFTVNYWEVQSgUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiw2WHRIanBYYnM5UlJKUDJTcjlHVXlWcXpBQ2NieTlUa1RoSFhualZDNUNESgUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixBanNvNm5UVGpwdHUyVUhMeDZoZlNYVnRIRnRSQkpDa0tZZDVTQXlqN3pmNQUHJG1hdGNoMQkAlgoEAICJegCAtIkTAIDokiYAgKPDRwMJAAACAixIRUI4UWF3OXhyV3BXczh0SHNpQVRZR0JXREJ0UDJTN2tjUEFMck11NDNBUwUHJG1hdGNoMQkAlgoEAAAAgMLXLwCA6JImAICI3r4BAwkAAAICBVdBVkVTBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCAlfUqAwkAAAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uBQckbWF0Y2gxCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAixEU2JiaExzU1RlRGc1THNpdWZrMkFuZWgzRGpWcUp1UHIyTTl1VTFnd3k1cAUHJG1hdGNoMQkAlgoEAAAAgNrECQCA6JImAIDC1y8DCQAAAgIsOHQ0RFBXVHdQenBhdEhBOUFrVHhXQUI0N1RIbll6QnNEbm9ZN2ZRcWJHOTEFByRtYXRjaDEJAJYKBAAAAICHpw4AgOiSJgCAtIkTAwkAAAICLEF0OEQ2TkZGcGhlQ2J2S1ZualZvZUxMODRFbzhOWm42b3ZNYW54ZkxhRldMBQckbWF0Y2gxCQCWCgQAAADA8PULAIDokiYAgLSJEwMJAAACAiw4TFFXOGY3UDVkNVBaTTdHdFpFQmdhcVJQR1N6UzNEZlB1aVhyVVJKNEFKUwUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw0NzRqVGVZeDJyMlZhMzU3OTR0Q1NjQVhXSkc5aFUySGNneHpNb3dhWlVudQUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw1VVlCUHBxNFdvVTVuNE13cEZrZ0puVzNGcTRCMXUzdWtwSzMzaWs0UWVyUgUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiwydGhzQUN1SG16RE11TmV6UE0zMndnOWEzQndVekJXRGVTS2FrZ3ozY3cyMQUHJG1hdGNoMQkAlgoEAICJegCAtIkTAIDokiYAgMLXLwMJAAACAitZaU5ib2ZGekMxN2pFSEhDTXdyUmNweTlNcnJqYWJNTUxaeGc4ZzV4bWY3BQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA6JImAwkAAAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpBQckbWF0Y2gxCQCWCgQAAACA4esXAIDokiYAgISvXwMJAAACAiwzVnVWNVdUbUR6NDdEbWRuM1FwY1lqemJTZGlwalFFNEpNZE5lMXhacFgxMwUHJG1hdGNoMQkAlgoEAAAAgMLXLwCA6JImAICI3r4BCQCWCgQAAACA2sQJAIDokiYAgOiSJgMJAAACAiMzUDhEZjJiN3l3SHRMQkhCZThQQlZRWWQzQTVNZEVFSkFvdQUHJG1hdGNoMAkAlgoEAIDaxAkAgMLXLwCAjs4cAICI3r4BAwkAAAICIzNQNERLNVZ6RHdMM3ZmYzVhaFVFaHRvZTVCeVpOeWFjSjNYBQckbWF0Y2gwBAckbWF0Y2gxBQphc3NldElkU3RyAwkAAAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLEhHZ2FiVHFVUzhXdFZGVUp6Zm1yVERNZ0VjY0p1WkxCUGhGZ1FGeHZuc29XBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLDM0TjlZY0VFVExXbjkzcVlRNjRFc1AxeDg5dFNydUpVNDRSckVNU1hYRVBKBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLDZYdEhqcFhiczlSUkpQMlNyOUdVeVZxekFDY2J5OVRrVGhIWG5qVkM1Q0RKBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLERHMnhGa1BkRHdLVW9Ca3pHQWhRdExwU0d6ZlhMaUNZUEV6ZUtIMkFkMjRwBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLEFqc282blRUanB0dTJVSEx4NmhmU1hWdEhGdFJCSkNrS1lkNVNBeWo3emY1BQckbWF0Y2gxCQCWCgQAgIl6AIC0iRMAgOiSJgCAo8NHAwkAAAICLEhFQjhRYXc5eHJXcFdzOHRIc2lBVFlHQldEQnRQMlM3a2NQQUxyTXU0M0FTBQckbWF0Y2gxCQCWCgQAAACA4esXAIDokiYAgIjevgEDCQAAAgIFV0FWRVMFByRtYXRjaDEJAJYKBACAiXoAgIenDgCA6JImAIDokiYDCQAAAgIsQXRxdjU5RVl6akZHdWl0S1ZuTVJrNkg4RnVram9WM2t0UG9yYkV5czI1b24FByRtYXRjaDEJAJYKBAAAAIDaxAkAgOiSJgCAtIkTAwkAAAICLERTYmJoTHNTVGVEZzVMc2l1ZmsyQW5laDNEalZxSnVQcjJNOXVVMWd3eTVwBQckbWF0Y2gxCQCWCgQAAACA2sQJAIDokiYAgMLXLwMJAAACAiw4dDREUFdUd1B6cGF0SEE5QWtUeFdBQjQ3VEhuWXpCc0Rub1k3ZlFxYkc5MQUHJG1hdGNoMQkAlgoEAAAAgIenDgCA6JImAIC0iRMDCQAAAgIsQXQ4RDZORkZwaGVDYnZLVm5qVm9lTEw4NEVvOE5abjZvdk1hbnhmTGFGV0wFByRtYXRjaDEJAJYKBAAAAMDw9QsAgOiSJgCAtIkTAwkAAAICLDhMUVc4ZjdQNWQ1UFpNN0d0WkVCZ2FxUlBHU3pTM0RmUHVpWHJVUko0QUpTBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDQ3NGpUZVl4MnIyVmEzNTc5NHRDU2NBWFdKRzloVTJIY2d4ek1vd2FaVW51BQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDVVWUJQcHE0V29VNW40TXdwRmtnSm5XM0ZxNEIxdTN1a3BLMzNpazRRZXJSBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDJ0aHNBQ3VIbXpETXVOZXpQTTMyd2c5YTNCd1V6QldEZVNLYWtnejNjdzIxBQckbWF0Y2gxCQCWCgQAgIl6AIC0iRMAgOiSJgCAwtcvAwkAAAICK1lpTmJvZkZ6QzE3akVISENNd3JSY3B5OU1ycmphYk1NTFp4ZzhnNXhtZjcFByRtYXRjaDEJAJYKBACAiXoAgIenDgCA6JImAIDokiYDCQAAAgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kFByRtYXRjaDEJAJYKBAAAAIDh6xcAgOiSJgCAhK9fAwkAAAICLDNWdVY1V1RtRHo0N0RtZG4zUXBjWWp6YlNkaXBqUUU0Sk1kTmUxeFpwWDEzBQckbWF0Y2gxCQCWCgQAAACAwtcvAIDokiYAgIjevgEJAJYKBAAAAIDaxAkAgOiSJgCA6JImAwkAAAICIzNQSHB1UVVQVlVvUjNBWXpGZUp6ZVdKZllMc0xUbVdzc1ZIBQckbWF0Y2gwCQCWCgQAgNrECQCAwtcvAICOzhwAgIjevgEDCQAAAgIjM1BBZDlBcWczY1FTenUyNk1GWVdRWWNqU1hQVkNKdHVmNVYFByRtYXRjaDAEByRtYXRjaDEFCmFzc2V0SWRTdHIDCQAAAgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsMzROOVljRUVUTFduOTNxWVE2NEVzUDF4ODl0U3J1SlU0NFJyRU1TWFhFUEoFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsNlh0SGpwWGJzOVJSSlAyU3I5R1V5VnF6QUNjYnk5VGtUaEhYbmpWQzVDREoFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsQWpzbzZuVFRqcHR1MlVITHg2aGZTWFZ0SEZ0UkJKQ2tLWWQ1U0F5ajd6ZjUFByRtYXRjaDEJAJYKBACAiXoAgLSJEwCA6JImAICjw0cDCQAAAgIsSEVCOFFhdzl4cldwV3M4dEhzaUFUWUdCV0RCdFAyUzdrY1BBTHJNdTQzQVMFByRtYXRjaDEJAJYKBAAAAIDaxAkAgOiSJgCAtIkTAwkAAAICBVdBVkVTBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uBQckbWF0Y2gxCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAixEU2JiaExzU1RlRGc1THNpdWZrMkFuZWgzRGpWcUp1UHIyTTl1VTFnd3k1cAUHJG1hdGNoMQkAlgoEAAAAgNrECQCA6JImAIDC1y8DCQAAAgIsOHQ0RFBXVHdQenBhdEhBOUFrVHhXQUI0N1RIbll6QnNEbm9ZN2ZRcWJHOTEFByRtYXRjaDEJAJYKBAAAAICHpw4AgOiSJgCAtIkTAwkAAAICLEF0OEQ2TkZGcGhlQ2J2S1ZualZvZUxMODRFbzhOWm42b3ZNYW54ZkxhRldMBQckbWF0Y2gxCQCWCgQAAADA8PULAIDokiYAgLSJEwMJAAACAiw4TFFXOGY3UDVkNVBaTTdHdFpFQmdhcVJQR1N6UzNEZlB1aVhyVVJKNEFKUwUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw0NzRqVGVZeDJyMlZhMzU3OTR0Q1NjQVhXSkc5aFUySGNneHpNb3dhWlVudQUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw1VVlCUHBxNFdvVTVuNE13cEZrZ0puVzNGcTRCMXUzdWtwSzMzaWs0UWVyUgUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiwydGhzQUN1SG16RE11TmV6UE0zMndnOWEzQndVekJXRGVTS2FrZ3ozY3cyMQUHJG1hdGNoMQkAlgoEAICJegCAtIkTAIDokiYAgMLXLwMJAAACAitZaU5ib2ZGekMxN2pFSEhDTXdyUmNweTlNcnJqYWJNTUxaeGc4ZzV4bWY3BQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA6JImCQCWCgQAAACA2sQJAIDokiYAgOiSJgkAAgECDlVua25vd24gbWFya2V0AQNzdW0CBHNpemUEZGF0YQoBBGZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAUEc2l6ZQUFYWNjdW0JAGQCBQVhY2N1bQkAkQMCBQRkYXRhBQRuZXh0CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAEOZ2V0U2V0dXBUb2tlbnMBDW1hcmtldEFkZHJlc3MJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIMc2V0dXBfdG9rZW5zAgEsAQ1nZXRUb2tlblByaWNlAg1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIECW9yYWNsZVN0cgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1tYXJrZXRBZGRyZXNzAgZvcmFjbGUFEG9yYWNsZUFkZHJlc3NTdHIEDW9yYWNsZUFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW9yYWNsZVN0cgQHc3RhYmxlcwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFDW1hcmtldEFkZHJlc3MCEHNldHVwX3N0YWJsZXNJZHMCWTl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpLEhHZ2FiVHFVUzhXdFZGVUp6Zm1yVERNZ0VjY0p1WkxCUGhGZ1FGeHZuc29XAgEsAwkBAiE9AgkAzwgCBQdzdGFibGVzBQphc3NldElkU3RyBQR1bml0AMCEPQMDAwkAAAIFCmFzc2V0SWRTdHIFCXVzZHRJZFN0cgYJAAACBQphc3NldElkU3RyBQl1c2RjSWRTdHIGCQAAAgUKYXNzZXRJZFN0cgUJcm9tZUlkU3RyAMCEPQMJAQ9jb250YWluc0VsZW1lbnQCBQdheGx5TFBzBQphc3NldElkU3RyCgABQAkA/AcEBQtheGx5QWRkcmVzcwIaZ2V0U2hhcmVBc3NldFByaWNlUkVBRE9OTFkJAMwIAgUKYXNzZXRJZFN0cgUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAVwcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUNb3JhY2xlQWRkcmVzcwkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBQVwcmljZQENZ2V0QXNzZXRTY2FsZQEKYXNzZXRJZFN0cgQIZGVjaW1hbHMDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMACAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQphc3NldElkU3RyCGRlY2ltYWxzCQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgERZ2V0TGFzdFJhdGVIZWlnaHQBDW1hcmtldEFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwIObGFzdFJhdGVIZWlnaHQAAAEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyAAABFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgAAARBnZXRPdXRkYXRlZFNSYXRlAg1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwkArAICBQphc3NldElkU3RyAgZfc1JhdGUAAAEQZ2V0T3V0ZGF0ZWRCUmF0ZQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIGX2JSYXRlAAABDWdldE91dGRhdGVkVXIEE291dGRhdGVkVG90YWxTdXBwbHkTb3V0ZGF0ZWRUb3RhbEJvcnJvdw1vdXRkYXRlZFNSYXRlDW91dGRhdGVkQlJhdGUEBGRvd24JAGsDBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQ1vdXRkYXRlZFNSYXRlBQdTY2FsZTE2AwkAAAIFBGRvd24AAAAACQBrAwUGU2NhbGU4CQBrAwUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRCUmF0ZQUHU2NhbGUxNgUEZG93bgEHZ2V0UmF0ZQMKb3V0ZGF0ZWRVcgphc3NldElkU3RyCW1hcmtldFN0cgQFY3VydmUJAQxnZXRSYXRlQ3VydmUCBQphc3NldElkU3RyBQltYXJrZXRTdHIJAGQCCAUFY3VydmUCXzEDCQBnAggFBWN1cnZlAl8zBQpvdXRkYXRlZFVyCQBrAwUKb3V0ZGF0ZWRVcggFBWN1cnZlAl8yCAUFY3VydmUCXzMJAGQCCAUFY3VydmUCXzIJAGsDCQBlAgUKb3V0ZGF0ZWRVcggFBWN1cnZlAl8zCAUFY3VydmUCXzQJAGUCAIDC1y8IBQVjdXJ2ZQJfMwELZ2V0SW50ZXJlc3QBBHJhdGUJAJYDAQkAzAgCCQBrAwUEcmF0ZQUGU2NhbGU4BQp5ZWFyQmxvY2tzCQDMCAIAAQUDbmlsAQ1nZXRBc3NldEluZGV4AgtzZXR1cFRva2Vucwphc3NldElkU3RyCQEFdmFsdWUBCQDPCAIFC3NldHVwVG9rZW5zBQphc3NldElkU3RyARFnZXRBc3NldFBhcmFtdGVycwIQbWFya2V0UGFyYW1ldGVycwphc3NldEluZGV4CQCVCgMJAJEDAggFEG1hcmtldFBhcmFtZXRlcnMCXzEFCmFzc2V0SW5kZXgJAJEDAggFEG1hcmtldFBhcmFtZXRlcnMCXzIFCmFzc2V0SW5kZXgJAJEDAggFEG1hcmtldFBhcmFtZXRlcnMCXzMFCmFzc2V0SW5kZXgBE2dldE1hcmtldFBhcmFtZXRlcnMCDW1hcmtldEFkZHJlc3MLc2V0dXBUb2tlbnMEB3NldHVwQ2YJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIKc2V0dXBfbHR2cwIBLAQHc2V0dXBMdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAglzZXR1cF9sdHMCASwEDHNldHVwUGVuYWx0eQkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAg9zZXR1cF9wZW5hbHRpZXMCASwECnRva2Vuc1NpemUJAJADAQULc2V0dXBUb2tlbnMKAQRmb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFCnRva2Vuc1NpemUFBWFjY3VtCQCVCgMJAM0IAggFBWFjY3VtAl8xCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBDZgUEbmV4dAkAzQgCCAUFYWNjdW0CXzIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cEx0BQRuZXh0CQDNCAIIBQVhY2N1bQJfMwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHNldHVwUGVuYWx0eQUEbmV4dAoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwBDGdldE1heFN1cHBseQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQENcGFyc2VJbnRWYWx1ZQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNbWFya2V0QWRkcmVzcwkArAICAhBzZXR1cF9tYXhTdXBwbHlfBQphc3NldElkU3RyAgEwAQ5nZXRBY3R1YWxTUmF0ZQQObGFzdFJhdGVIZWlnaHQIaW50ZXJlc3QKb3V0ZGF0ZWRVcg1vdXRkYXRlZFNSYXRlBAlsYXN0U1JhdGUJAJYDAQkAzAgCBQ1vdXRkYXRlZFNSYXRlCQDMCAIFB1NjYWxlMTYFA25pbAQIbmV3U1JhdGUJAGQCBQlsYXN0U1JhdGUJAGkCCQBoAgkAaAIJAGUCBQZoZWlnaHQFDmxhc3RSYXRlSGVpZ2h0CQBrAwUIaW50ZXJlc3QFCm91dGRhdGVkVXIFBlNjYWxlOAkAZQIAZAULcmVzZXJ2ZUZ1bmQAZAUIbmV3U1JhdGUBDmdldEFjdHVhbEJSYXRlAw5sYXN0UmF0ZUhlaWdodAhpbnRlcmVzdA1vdXRkYXRlZEJSYXRlBAlsYXN0QlJhdGUJAJYDAQkAzAgCBQ1vdXRkYXRlZEJSYXRlCQDMCAIFB1NjYWxlMTYFA25pbAQIbmV3QlJhdGUJAGQCBQlsYXN0QlJhdGUJAGgCCQBlAgUGaGVpZ2h0BQ5sYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFCG5ld0JSYXRlAQtnZXRBY3R1YWxVcgIMYWN0dWFsU3VwcGx5DGFjdHVhbEJvcnJvdwkAawMFDGFjdHVhbEJvcnJvdwUGU2NhbGU4BQxhY3R1YWxTdXBwbHkBD2dldEFjdHVhbEFtb3VudAIOb3V0ZGF0ZWRBbW91bnQKYWN0dWFsUmF0ZQkAawMFDm91dGRhdGVkQW1vdW50BQphY3R1YWxSYXRlBQdTY2FsZTE2AQhnZXRJblVzZAMMYWN0dWFsQW1vdW50CmFzc2V0U2NhbGUFcHJpY2UJAGsDBQxhY3R1YWxBbW91bnQFBXByaWNlBQphc3NldFNjYWxlAQxnZXRTdXBwbHlBcHkCBHJhdGUIYWN0dWFsVXIECnN1cHBseVJhdGUJAGsDCQBrAwUEcmF0ZQBQAGQFCGFjdHVhbFVyBQZTY2FsZTgJAGUCCQCgAwEJAHYGCQC3AgIFClNjYWxlMTZCaWcJALwCAwkAtgIBBQpzdXBwbHlSYXRlBQlTY2FsZThCaWcFDXllYXJCbG9ja3NCaWcAEAUNeWVhckJsb2Nrc0JpZwAAAAgFBERPV04FBlNjYWxlOAEMZ2V0Qm9ycm93QXB5AQRyYXRlCQBlAgkAoAMBCQB2BgkAtwICBQpTY2FsZTE2QmlnCQC8AgMJALYCAQUEcmF0ZQUJU2NhbGU4QmlnBQ15ZWFyQmxvY2tzQmlnABAFDXllYXJCbG9ja3NCaWcAAAAIBQRET1dOBQZTY2FsZTgBD2dldFdhbGxldFN1cHBseQQNbWFya2V0QWRkcmVzcwphc3NldElkU3RyBndhbGxldAthY3R1YWxTUmF0ZQQUb3V0ZGF0ZWRXYWxsZXRTdXBwbHkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwkArAICCQCsAgIFBndhbGxldAIKX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgAACQEPZ2V0QWN0dWFsQW1vdW50AgUUb3V0ZGF0ZWRXYWxsZXRTdXBwbHkFC2FjdHVhbFNSYXRlAQ9nZXRXYWxsZXRCb3Jyb3cEDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgZ3YWxsZXQLYWN0dWFsQlJhdGUEFG91dGRhdGVkV2FsbGV0Qm9ycm93CQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgkArAICBQZ3YWxsZXQCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIAAAkBD2dldEFjdHVhbEFtb3VudAIFFG91dGRhdGVkV2FsbGV0Qm9ycm93BQthY3R1YWxCUmF0ZQEQZ2V0RGFpbHlQZXJjZW50cwIDYXB5CHF1YW50aXR5CQBrAwkAawMJAGUCCQCgAwEJAHYGCQC3AgIFCVNjYWxlOEJpZwkAtgIBBQNhcHkACAkAugICBQpTY2FsZTE2QmlnBQ15ZWFyQmxvY2tzQmlnABAAEAUERE9XTgUHU2NhbGUxNgUJZGF5QmxvY2tzBQZTY2FsZTgFCHF1YW50aXR5BQZTY2FsZTgBEGdldEFjY291bnRIZWFsdGgCG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZBt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QDCQAAAgUbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkAAAFBlNjYWxlOAkAZQIFBlNjYWxlOAkAawMFG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAUGU2NhbGU4BRt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QBCWdldE5ldEFweQMWdG90YWxXYWxsZXRTdXBwbHlJblVzZBZ0b3RhbFdhbGxldEJvcnJvd0luVXNkFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QDCQAAAgUWdG90YWxXYWxsZXRNYXJnaW5JblVzZAAAAAADCQBmAgUWdG90YWxXYWxsZXRNYXJnaW5JblVzZAAACQBrAwUWdG90YWxXYWxsZXRNYXJnaW5JblVzZAUGU2NhbGU4BRZ0b3RhbFdhbGxldFN1cHBseUluVXNkCQBrAwUWdG90YWxXYWxsZXRNYXJnaW5JblVzZAUGU2NhbGU4BRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkAQthc3NldFRvSnNvbgIKYXNzZXRJZFN0cghxdWFudGl0eQQNJHQwMTUyOTAxNTQ4NQMJAAACBQphc3NldElkU3RyBQVXYXZlcwkAlAoCAAgCBVdBVkVTBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFCmFzc2V0SWRTdHIJAJQKAggFBWFzc2V0CGRlY2ltYWxzCAUFYXNzZXQEbmFtZQQIZGVjaW1hbHMIBQ0kdDAxNTI5MDE1NDg1Al8xBARuYW1lCAUNJHQwMTUyOTAxNTQ4NQJfMgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDHsicXVhbnRpdHkiOgkApAMBBQhxdWFudGl0eQIMLCJkZWNpbWFscyI6CQCkAwEFCGRlY2ltYWxzAgksIm5hbWUiOiIFBG5hbWUCCCIsImlkIjoiBQphc3NldElkU3RyAgIifQEPYW1vdW50VG9EZWNpbWFsAgZhbW91bnQIZGVjaW1hbHMJAKwCAgkArAICCQCsAgIJAKwCAgIMeyJxdWFudGl0eSI6CQCkAwEFBmFtb3VudAIMLCJkZWNpbWFscyI6CQCkAwEFCGRlY2ltYWxzAhMsIm5hbWUiOiIiLCJpZCI6IiJ9AQ1nZXRNYXJrZXRKc29uAwttYXJrZXRJbmRleAZ3YWxsZXQFZGVidWcECW1hcmtldFN0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFC21hcmtldEluZGV4BA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQltYXJrZXRTdHIECm1hcmtldE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIMbWFya2V0X25hbWVfBQltYXJrZXRTdHIEBmFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1tYXJrZXRBZGRyZXNzAgxzZXR1cF9hY3RpdmUGBAtzZXR1cFRva2VucwkBDmdldFNldHVwVG9rZW5zAQUNbWFya2V0QWRkcmVzcwQLYXNzZXRzQ291bnQJAJADAQULc2V0dXBUb2tlbnMEDmxhc3RSYXRlSGVpZ2h0CQERZ2V0TGFzdFJhdGVIZWlnaHQBBQ1tYXJrZXRBZGRyZXNzCgEKYXNzZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQthc3NldHNDb3VudAUFYWNjdW0ECmFzc2V0SWRTdHIJAJEDAgULc2V0dXBUb2tlbnMFBG5leHQEBXByaWNlCQENZ2V0VG9rZW5QcmljZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECmFzc2V0U2NhbGUJAQ1nZXRBc3NldFNjYWxlAQUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbFN1cHBseQkBFmdldE91dGRhdGVkVG90YWxTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsQm9ycm93CQEWZ2V0T3V0ZGF0ZWRUb3RhbEJvcnJvdwIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkU1JhdGUJARBnZXRPdXRkYXRlZFNSYXRlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRCUmF0ZQkBEGdldE91dGRhdGVkQlJhdGUCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBApvdXRkYXRlZFVyCQENZ2V0T3V0ZGF0ZWRVcgQFE291dGRhdGVkVG90YWxTdXBwbHkFE291dGRhdGVkVG90YWxCb3Jyb3cFDW91dGRhdGVkU1JhdGUFDW91dGRhdGVkQlJhdGUEBHJhdGUJAQdnZXRSYXRlAwUKb3V0ZGF0ZWRVcgUKYXNzZXRJZFN0cgUJbWFya2V0U3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUKb3V0ZGF0ZWRVcgUNb3V0ZGF0ZWRTUmF0ZQQFYlJhdGUJAQ5nZXRBY3R1YWxCUmF0ZQMFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQGc3VwcGx5CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUFc1JhdGUEBmJvcnJvdwkBD2dldEFjdHVhbEFtb3VudAIFE291dGRhdGVkVG90YWxCb3Jyb3cFBWJSYXRlBAtzdXBwbHlJblVzZAkBCGdldEluVXNkAwUGc3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQLYm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFBmJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UECHJlc2VydmVzCQBlAgUGc3VwcGx5BQZib3Jyb3cEDXJlc2VydmVzSW5Vc2QJAQhnZXRJblVzZAMFCHJlc2VydmVzBQphc3NldFNjYWxlBQVwcmljZQQCdXIJAQtnZXRBY3R1YWxVcgIFBnN1cHBseQUGYm9ycm93BAlzdXBwbHlBcHkJAQxnZXRTdXBwbHlBcHkCBQRyYXRlBQJ1cgQJYm9ycm93QXB5CQEMZ2V0Qm9ycm93QXB5AQUEcmF0ZQQPbWFya2V0QXNzZXRKc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCSJzdXBwbHkiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUGc3VwcGx5Ag8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgULc3VwcGx5SW5Vc2QCCiwiYm9ycm93IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFBmJvcnJvdwIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFC2JvcnJvd0luVXNkAgwsInJlc2VydmVzIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFCHJlc2VydmVzAhEsInJlc2VydmVzSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQ1yZXNlcnZlc0luVXNkAgksInByaWNlIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUFcHJpY2UCDSwic3VwcGx5QXB5IjoJAQ9hbW91bnRUb0RlY2ltYWwCBQlzdXBwbHlBcHkACAINLCJib3Jyb3dBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCWJvcnJvd0FweQAIAhQsInV0aWxpemF0aW9uUmF0aW8iOgkBD2Ftb3VudFRvRGVjaW1hbAIFAnVyAAgCCSwic1JhdGUiOgkBD2Ftb3VudFRvRGVjaW1hbAIFBXNSYXRlABACCSwiYlJhdGUiOgkBD2Ftb3VudFRvRGVjaW1hbAIFBWJSYXRlABACAX0JAJYKBAkAZAIIBQVhY2N1bQJfMQULc3VwcGx5SW5Vc2QJAGQCCAUFYWNjdW0CXzIFC2JvcnJvd0luVXNkCQBkAggFBWFjY3VtAl8zBQ1yZXNlcnZlc0luVXNkCQDNCAIIBQVhY2N1bQJfNAUPbWFya2V0QXNzZXRKc29uBA0kdDAxODg5ODE5MDA2CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAAAAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmFzc2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBAtzdXBwbHlJblVzZAgFDSR0MDE4ODk4MTkwMDYCXzEEC2JvcnJvd0luVXNkCAUNJHQwMTg4OTgxOTAwNgJfMgQNcmVzZXJ2ZXNJblVzZAgFDSR0MDE4ODk4MTkwMDYCXzMEEG1hcmtldEFzc2V0c0pzb24IBQ0kdDAxODg5ODE5MDA2Al80BAxtYXJrZXRzQ291bnQJARFAZXh0ck5hdGl2ZSgxMDU1KQECB21hcmtldHMKAQttYXJrZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQxtYXJrZXRzQ291bnQFBWFjY3VtBBdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFBG5leHQEEWN1cnJlbnRNYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUXY3VycmVudE1hcmtldEFkZHJlc3NTdHIECnNpbXBsZUpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIIImluZGV4IjoJAKQDAQUEbmV4dAIJLCJuYW1lIjoiBRFjdXJyZW50TWFya2V0TmFtZQIBIgIPLCJzdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIAAAIRLCJhY2NvdW50SGVhbHRoIjoJAQ9hbW91bnRUb0RlY2ltYWwCAAAACAIBfQMJAAACBQZ3YWxsZXQCAAkAzQgCBQVhY2N1bQUKc2ltcGxlSnNvbgQUY3VycmVudE1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyBBJjdXJyZW50U2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBBJjdXJyZW50QXNzZXRzQ291bnQJAJADAQUSY3VycmVudFNldHVwVG9rZW5zBBZjdXJyZW50TWFya2V0U2hvcnROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICEW1hcmtldF9zaG9ydG5hbWVfBRdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgQHc2V0dXBDZgkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBRRjdXJyZW50TWFya2V0QWRkcmVzcwIKc2V0dXBfbHR2cwIBLAQHc2V0dXBMdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBRRjdXJyZW50TWFya2V0QWRkcmVzcwIJc2V0dXBfbHRzAgEsBBVjdXJyZW50TGFzdFJhdGVIZWlnaHQJARFnZXRMYXN0UmF0ZUhlaWdodAEFFGN1cnJlbnRNYXJrZXRBZGRyZXNzCgEQbWFya2V0QXNzZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BRJjdXJyZW50QXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFEmN1cnJlbnRTZXR1cFRva2VucwUEbmV4dAQCY2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQRuZXh0BAJsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwTHQFBG5leHQEBXByaWNlCQENZ2V0VG9rZW5QcmljZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECmFzc2V0U2NhbGUJAQ1nZXRBc3NldFNjYWxlAQUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbFN1cHBseQkBFmdldE91dGRhdGVkVG90YWxTdXBwbHkCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbEJvcnJvdwkBFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRTUmF0ZQkBEGdldE91dGRhdGVkU1JhdGUCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRCUmF0ZQkBEGdldE91dGRhdGVkQlJhdGUCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKb3V0ZGF0ZWRVcgkBDWdldE91dGRhdGVkVXIEBRNvdXRkYXRlZFRvdGFsU3VwcGx5BRNvdXRkYXRlZFRvdGFsQm9ycm93BQ1vdXRkYXRlZFNSYXRlBQ1vdXRkYXRlZEJSYXRlBARyYXRlCQEHZ2V0UmF0ZQMFCm91dGRhdGVkVXIFCmFzc2V0SWRTdHIFCW1hcmtldFN0cgQIaW50ZXJlc3QJAQtnZXRJbnRlcmVzdAEFBHJhdGUEBXNSYXRlCQEOZ2V0QWN0dWFsU1JhdGUEBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUVY3VycmVudExhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQMd2FsbGV0U3VwcGx5CQEPZ2V0V2FsbGV0U3VwcGx5BAUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFc1JhdGUEEXdhbGxldFN1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRTdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAx3YWxsZXRCb3Jyb3cJAQ9nZXRXYWxsZXRCb3Jyb3cEBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQViUmF0ZQQRd2FsbGV0Qm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldEJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UEFndhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAGsDBRF3YWxsZXRTdXBwbHlJblVzZAUCY2YFBlNjYWxlOAQWd2FsbGV0Qm9ycm93VXNhZ2VJblVzZAkAawMFEXdhbGxldEJvcnJvd0luVXNkBQZTY2FsZTgFAmx0CQCWCgQJAGQCCAUFYWNjdW0CXzEFEXdhbGxldFN1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBRF3YWxsZXRCb3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUWd2FsbGV0Qm9ycm93TGltaXRJblVzZAkAZAIIBQVhY2N1bQJfNAUWd2FsbGV0Qm9ycm93VXNhZ2VJblVzZAQNJHQwMjI1NzcyMjczNwoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAAAAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBtYXJrZXRBc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQWdG90YWxXYWxsZXRTdXBwbHlJblVzZAgFDSR0MDIyNTc3MjI3MzcCXzEEFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QIBQ0kdDAyMjU3NzIyNzM3Al8yBBt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QIBQ0kdDAyMjU3NzIyNzM3Al8zBBt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QIBQ0kdDAyMjU3NzIyNzM3Al80BA1hY2NvdW50SGVhbHRoCQEQZ2V0QWNjb3VudEhlYWx0aAIFG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAUbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkBAhmdWxsSnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIIImluZGV4IjoJAKQDAQUEbmV4dAIJLCJuYW1lIjoiBRZjdXJyZW50TWFya2V0U2hvcnROYW1lAgEiAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QCESwiYWNjb3VudEhlYWx0aCI6CQEPYW1vdW50VG9EZWNpbWFsAgUNYWNjb3VudEhlYWx0aAAIAgF9CQDNCAIFBWFjY3VtBQhmdWxsSnNvbgQLbWFya2V0c0pzb24KAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBC21hcmtldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCCJpbmRleCI6CQCkAwEFC21hcmtldEluZGV4AgksIm5hbWUiOiIFCm1hcmtldE5hbWUCASICDCwiYWRkcmVzcyI6IgUJbWFya2V0U3RyAgEiAgosImFjdGl2ZSI6CQClAwEFBmFjdGl2ZQIPLCJzdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFC3N1cHBseUluVXNkAg8sImJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgULYm9ycm93SW5Vc2QCESwicmVzZXJ2ZXNJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFDXJlc2VydmVzSW5Vc2QCCywiYXNzZXRzIjpbCQC7CQIFEG1hcmtldEFzc2V0c0pzb24CASwCAV0CDCwibWFya2V0cyI6WwkAuwkCBQttYXJrZXRzSnNvbgIBLAIBXQIBfQMFBWRlYnVnCQACAQUEanNvbgUEanNvbgELZ2V0TWVudUpzb24BBWRlYnVnBAxtYXJrZXRzQ291bnQJARFAZXh0ck5hdGl2ZSgxMDU1KQECB21hcmtldHMKAQttYXJrZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQxtYXJrZXRzQ291bnQFBWFjY3VtBAltYXJrZXRTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIHbWFya2V0XwkApAMBBQRuZXh0BA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQltYXJrZXRTdHIEC3NldHVwVG9rZW5zCQEOZ2V0U2V0dXBUb2tlbnMBBQ1tYXJrZXRBZGRyZXNzBAthc3NldHNDb3VudAkAkAMBBQtzZXR1cFRva2VucwQObGFzdFJhdGVIZWlnaHQJARFnZXRMYXN0UmF0ZUhlaWdodAEFDW1hcmtldEFkZHJlc3MKAQphc3NldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFC2Fzc2V0c0NvdW50BQVhY2N1bQQKYXNzZXRJZFN0cgkAkQMCBQtzZXR1cFRva2VucwUEbmV4dAQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRTUmF0ZQkBEGdldE91dGRhdGVkU1JhdGUCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECm91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRTUmF0ZQUNb3V0ZGF0ZWRCUmF0ZQQEcmF0ZQkBB2dldFJhdGUDBQpvdXRkYXRlZFVyBQphc3NldElkU3RyBQltYXJrZXRTdHIECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQRyYXRlBAVzUmF0ZQkBDmdldEFjdHVhbFNSYXRlBAUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEC3N1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQZzdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAtib3Jyb3dJblVzZAkBCGdldEluVXNkAwUGYm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQIcmVzZXJ2ZXMJAGUCBQZzdXBwbHkFBmJvcnJvdwQNcmVzZXJ2ZXNJblVzZAkBCGdldEluVXNkAwUIcmVzZXJ2ZXMFCmFzc2V0U2NhbGUFBXByaWNlBA9tYXJrZXRBc3NldEpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCCJhc3NldCI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyAAACCSwicHJpY2UiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQVwcmljZQIJLCJzUmF0ZSI6CQEPYW1vdW50VG9EZWNpbWFsAgUFc1JhdGUAEAIJLCJiUmF0ZSI6CQEPYW1vdW50VG9EZWNpbWFsAgUFYlJhdGUAEAIBfQkAlgoECQBkAggFBWFjY3VtAl8xBQtzdXBwbHlJblVzZAkAZAIIBQVhY2N1bQJfMgULYm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFDXJlc2VydmVzSW5Vc2QJAM0IAggFBWFjY3VtAl80BQ9tYXJrZXRBc3NldEpzb24EDSR0MDI2NjcxMjY3NzkKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAAAAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKYXNzZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwEC3N1cHBseUluVXNkCAUNJHQwMjY2NzEyNjc3OQJfMQQLYm9ycm93SW5Vc2QIBQ0kdDAyNjY3MTI2Nzc5Al8yBA1yZXNlcnZlc0luVXNkCAUNJHQwMjY2NzEyNjc3OQJfMwQQbWFya2V0QXNzZXRzSnNvbggFDSR0MDI2NjcxMjY3NzkCXzQECm1hcmtldEpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewILImFkZHJlc3MiOiIFCW1hcmtldFN0cgIBIgILLCJhc3NldHMiOlsJALsJAgUQbWFya2V0QXNzZXRzSnNvbgIBLAIBXQIBfQkAlgoECQBkAggFBWFjY3VtAl8xBQtzdXBwbHlJblVzZAkAZAIIBQVhY2N1bQJfMgULYm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFDXJlc2VydmVzSW5Vc2QJAM0IAggFBWFjY3VtAl80BQptYXJrZXRKc29uBA0kdDAyNzE3MDI3Mjg5CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAAAAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBC21hcmtldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQQdG90YWxTdXBwbHlJblVzZAgFDSR0MDI3MTcwMjcyODkCXzEEEHRvdGFsQm9ycm93SW5Vc2QIBQ0kdDAyNzE3MDI3Mjg5Al8yBBJ0b3RhbFJlc2VydmVzSW5Vc2QIBQ0kdDAyNzE3MDI3Mjg5Al8zBAttYXJrZXRzSnNvbggFDSR0MDI3MTcwMjcyODkCXzQEBGpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIOInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUQdG90YWxTdXBwbHlJblVzZAIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEHRvdGFsQm9ycm93SW5Vc2QCESwicmVzZXJ2ZXNJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEnRvdGFsUmVzZXJ2ZXNJblVzZAIMLCJtYXJrZXRzIjpbCQC7CQIFC21hcmtldHNKc29uAgEsAgFdAgF9AwUFZGVidWcJAAIBBQRqc29uBQRqc29uAQ1nZXRXYWxsZXRKc29uAwttYXJrZXRJbmRleAZ3YWxsZXQFZGVidWcECW1hcmtldFN0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFC21hcmtldEluZGV4BA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQltYXJrZXRTdHIECm1hcmtldE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIMbWFya2V0X25hbWVfBQltYXJrZXRTdHIEDG1hcmtldHNDb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQIHbWFya2V0cwoBC21hcmtldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFDG1hcmtldHNDb3VudAUFYWNjdW0EF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICB21hcmtldF8JAKQDAQUEbmV4dAQRY3VycmVudE1hcmtldE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIMbWFya2V0X25hbWVfBRdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgQUY3VycmVudE1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyBBJjdXJyZW50U2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBBJjdXJyZW50QXNzZXRzQ291bnQJAJADAQUSY3VycmVudFNldHVwVG9rZW5zBBZjdXJyZW50TWFya2V0U2hvcnROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICEW1hcmtldF9zaG9ydG5hbWVfBRdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgQHc2V0dXBDZgkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBRRjdXJyZW50TWFya2V0QWRkcmVzcwIKc2V0dXBfbHR2cwIBLAQHc2V0dXBMdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBRRjdXJyZW50TWFya2V0QWRkcmVzcwIJc2V0dXBfbHRzAgEsBBVjdXJyZW50TGFzdFJhdGVIZWlnaHQJARFnZXRMYXN0UmF0ZUhlaWdodAEFFGN1cnJlbnRNYXJrZXRBZGRyZXNzCgEQbWFya2V0QXNzZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BRJjdXJyZW50QXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFEmN1cnJlbnRTZXR1cFRva2VucwUEbmV4dAQCY2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQRuZXh0BAJsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwTHQFBG5leHQEBXByaWNlCQENZ2V0VG9rZW5QcmljZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECmFzc2V0U2NhbGUJAQ1nZXRBc3NldFNjYWxlAQUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbFN1cHBseQkBFmdldE91dGRhdGVkVG90YWxTdXBwbHkCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbEJvcnJvdwkBFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRTUmF0ZQkBEGdldE91dGRhdGVkU1JhdGUCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRCUmF0ZQkBEGdldE91dGRhdGVkQlJhdGUCBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKb3V0ZGF0ZWRVcgkBDWdldE91dGRhdGVkVXIEBRNvdXRkYXRlZFRvdGFsU3VwcGx5BRNvdXRkYXRlZFRvdGFsQm9ycm93BQ1vdXRkYXRlZFNSYXRlBQ1vdXRkYXRlZEJSYXRlBARyYXRlCQEHZ2V0UmF0ZQMFCm91dGRhdGVkVXIFCmFzc2V0SWRTdHIFCW1hcmtldFN0cgQIaW50ZXJlc3QJAQtnZXRJbnRlcmVzdAEFBHJhdGUEBXNSYXRlCQEOZ2V0QWN0dWFsU1JhdGUEBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUVY3VycmVudExhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQGc3VwcGx5CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUFc1JhdGUEBmJvcnJvdwkBD2dldEFjdHVhbEFtb3VudAIFE291dGRhdGVkVG90YWxCb3Jyb3cFBWJSYXRlBAJ1cgkBC2dldEFjdHVhbFVyAgUGc3VwcGx5BQZib3Jyb3cECXN1cHBseUFweQkBDGdldFN1cHBseUFweQIFBHJhdGUFAnVyBAlib3Jyb3dBcHkJAQxnZXRCb3Jyb3dBcHkBBQRyYXRlBAx3YWxsZXRTdXBwbHkJAQ9nZXRXYWxsZXRTdXBwbHkEBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQVzUmF0ZQQRd2FsbGV0U3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldFN1cHBseQUKYXNzZXRTY2FsZQUFcHJpY2UEDHdhbGxldEJvcnJvdwkBD2dldFdhbGxldEJvcnJvdwQFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBQZ3YWxsZXQFBWJSYXRlBBF3YWxsZXRCb3Jyb3dJblVzZAkBCGdldEluVXNkAwUMd2FsbGV0Qm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQWd2FsbGV0Qm9ycm93TGltaXRJblVzZAkAawMFEXdhbGxldFN1cHBseUluVXNkBQJjZgUGU2NhbGU4BBZ3YWxsZXRCb3Jyb3dVc2FnZUluVXNkCQBrAwURd2FsbGV0Qm9ycm93SW5Vc2QFBlNjYWxlOAUCbHQEEXdhbGxldERhaWx5SW5jb21lCQEQZ2V0RGFpbHlQZXJjZW50cwIFCXN1cHBseUFweQUMd2FsbGV0U3VwcGx5BBZ3YWxsZXREYWlseUluY29tZUluVXNkCQEIZ2V0SW5Vc2QDBRF3YWxsZXREYWlseUluY29tZQUKYXNzZXRTY2FsZQUFcHJpY2UEF3dhbGxldERhaWx5TG9hbkludGVyZXN0CQEQZ2V0RGFpbHlQZXJjZW50cwIFCWJvcnJvd0FweQUMd2FsbGV0Qm9ycm93BBx3YWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkCQEIZ2V0SW5Vc2QDBRd3YWxsZXREYWlseUxvYW5JbnRlcmVzdAUKYXNzZXRTY2FsZQUFcHJpY2UEEXdhbGxldE1hcmdpbkluVXNkCQBlAgkAawMFEXdhbGxldFN1cHBseUluVXNkBQlzdXBwbHlBcHkFBlNjYWxlOAkAawMFEXdhbGxldEJvcnJvd0luVXNkBQlib3Jyb3dBcHkFBlNjYWxlOAkAmQoHCQBkAggFBWFjY3VtAl8xBRF3YWxsZXRTdXBwbHlJblVzZAkAZAIIBQVhY2N1bQJfMgURd2FsbGV0Qm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFFndhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAGQCCAUFYWNjdW0CXzQFFndhbGxldEJvcnJvd1VzYWdlSW5Vc2QJAGQCCAUFYWNjdW0CXzUFFndhbGxldERhaWx5SW5jb21lSW5Vc2QJAGQCCAUFYWNjdW0CXzYFHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QJAGQCCAUFYWNjdW0CXzcFEXdhbGxldE1hcmdpbkluVXNkBA0kdDAzMjExMzMyNDY4CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAmQoHAAAAAAAAAAAAAAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEG1hcmtldEFzc2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBBZ0b3RhbFdhbGxldFN1cHBseUluVXNkCAUNJHQwMzIxMTMzMjQ2OAJfMQQWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAgFDSR0MDMyMTEzMzI0NjgCXzIEG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAgFDSR0MDMyMTEzMzI0NjgCXzMEG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAgFDSR0MDMyMTEzMzI0NjgCXzQEG3RvdGFsV2FsbGV0RGFpbHlJbmNvbWVJblVzZAgFDSR0MDMyMTEzMzI0NjgCXzUEIXRvdGFsV2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAgFDSR0MDMyMTEzMzI0NjgCXzYEFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QIBQ0kdDAzMjExMzMyNDY4Al83BBd0b3RhbFdhbGxldEJhZERlYnRJblVzZAMJAGYCBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkCQBlAgUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAAABA1hY2NvdW50SGVhbHRoCQEQZ2V0QWNjb3VudEhlYWx0aAIFG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAUbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkBAZuZXRBcHkJAQlnZXROZXRBcHkDBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkBRZ0b3RhbFdhbGxldE1hcmdpbkluVXNkBAttYXJrZXRzSnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIIImluZGV4IjoJAKQDAQUEbmV4dAIJLCJuYW1lIjoiBRZjdXJyZW50TWFya2V0U2hvcnROYW1lAgEiAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QCESwiYWNjb3VudEhlYWx0aCI6CQEPYW1vdW50VG9EZWNpbWFsAgUNYWNjb3VudEhlYWx0aAAIAgF9CgEQd2FsbGV0QXNzZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BRJjdXJyZW50QXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFEmN1cnJlbnRTZXR1cFRva2VucwUEbmV4dAQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsQm9ycm93CQEWZ2V0T3V0ZGF0ZWRUb3RhbEJvcnJvdwIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBApvdXRkYXRlZFVyCQENZ2V0T3V0ZGF0ZWRVcgQFE291dGRhdGVkVG90YWxTdXBwbHkFE291dGRhdGVkVG90YWxCb3Jyb3cFDW91dGRhdGVkU1JhdGUFDW91dGRhdGVkQlJhdGUEBHJhdGUJAQdnZXRSYXRlAwUKb3V0ZGF0ZWRVcgUKYXNzZXRJZFN0cgUJbWFya2V0U3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFFWN1cnJlbnRMYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFCm91dGRhdGVkVXIFDW91dGRhdGVkU1JhdGUEBWJSYXRlCQEOZ2V0QWN0dWFsQlJhdGUDBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEAnVyCQELZ2V0QWN0dWFsVXICBQZzdXBwbHkFBmJvcnJvdwQJc3VwcGx5QXB5CQEMZ2V0U3VwcGx5QXB5AgUEcmF0ZQUCdXIECWJvcnJvd0FweQkBDGdldEJvcnJvd0FweQEFBHJhdGUEDHdhbGxldFN1cHBseQkBD2dldFdhbGxldFN1cHBseQQFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBQZ3YWxsZXQFBXNSYXRlBBF3YWxsZXRTdXBwbHlJblVzZAkBCGdldEluVXNkAwUMd2FsbGV0U3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQMd2FsbGV0Qm9ycm93CQEPZ2V0V2FsbGV0Qm9ycm93BAUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFYlJhdGUEEXdhbGxldEJvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRCb3Jyb3cFCmFzc2V0U2NhbGUFBXByaWNlBBF3YWxsZXREYWlseUluY29tZQkBEGdldERhaWx5UGVyY2VudHMCBQlzdXBwbHlBcHkFDHdhbGxldFN1cHBseQQWd2FsbGV0RGFpbHlJbmNvbWVJblVzZAkBCGdldEluVXNkAwURd2FsbGV0RGFpbHlJbmNvbWUFCmFzc2V0U2NhbGUFBXByaWNlBBd3YWxsZXREYWlseUxvYW5JbnRlcmVzdAkBEGdldERhaWx5UGVyY2VudHMCBQlib3Jyb3dBcHkFDHdhbGxldEJvcnJvdwQcd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAkBCGdldEluVXNkAwUXd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3QFCmFzc2V0U2NhbGUFBXByaWNlBBBzdXBwbHlBc3NldHNKc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCSJhbW91bnQiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUMd2FsbGV0U3VwcGx5Ag8sImFtb3VudEluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgURd2FsbGV0U3VwcGx5SW5Vc2QCCSwicHJpY2UiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQVwcmljZQIHLCJhcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCXN1cHBseUFweQAIAhEsImRhaWx5UGVyY2VudHMiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgURd2FsbGV0RGFpbHlJbmNvbWUCFiwiZGFpbHlQZXJjZW50c0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWd2FsbGV0RGFpbHlJbmNvbWVJblVzZAIBfQQQYm9ycm93QXNzZXRzSnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AgkiYW1vdW50IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFDHdhbGxldEJvcnJvdwIPLCJhbW91bnRJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEXdhbGxldEJvcnJvd0luVXNkAgksInByaWNlIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUFcHJpY2UCBywiYXB5IjoJAQ9hbW91bnRUb0RlY2ltYWwCBQlib3Jyb3dBcHkACAIRLCJkYWlseVBlcmNlbnRzIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFF3dhbGxldERhaWx5TG9hbkludGVyZXN0AhYsImRhaWx5UGVyY2VudHNJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QCAX0JAJQKAgkAzQgCCAUFYWNjdW0CXzEFEHN1cHBseUFzc2V0c0pzb24JAM0IAggFBWFjY3VtAl8yBRBib3Jyb3dBc3NldHNKc29uBA0kdDAzNjg3MDM2OTU2CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQd2FsbGV0QXNzZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwEEHN1cHBseUFzc2V0c0pzb24IBQ0kdDAzNjg3MDM2OTU2Al8xBBBib3Jyb3dBc3NldHNKc29uCAUNJHQwMzY4NzAzNjk1NgJfMgMJAAACBQttYXJrZXRJbmRleAUEbmV4dAkAoQoPCQBkAggFBWFjY3VtAl8xBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkCQBkAggFBWFjY3VtAl8zBRd0b3RhbFdhbGxldEJhZERlYnRJblVzZAkAZAIIBQVhY2N1bQJfNAUbdG90YWxXYWxsZXREYWlseUluY29tZUluVXNkCQBkAggFBWFjY3VtAl81BSF0b3RhbFdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QFF3RvdGFsV2FsbGV0QmFkRGVidEluVXNkBRt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QFIXRvdGFsV2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAUNYWNjb3VudEhlYWx0aAUGbmV0QXB5CQDNCAIIBQVhY2N1bQNfMTMFC21hcmtldHNKc29uBRBzdXBwbHlBc3NldHNKc29uBRBib3Jyb3dBc3NldHNKc29uCQChCg8JAGQCCAUFYWNjdW0CXzEFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QJAGQCCAUFYWNjdW0CXzIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFF3RvdGFsV2FsbGV0QmFkRGVidEluVXNkCQBkAggFBWFjY3VtAl80BRt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QJAGQCCAUFYWNjdW0CXzUFIXRvdGFsV2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAgFBWFjY3VtAl82CAUFYWNjdW0CXzcIBQVhY2N1bQJfOAgFBWFjY3VtAl85CAUFYWNjdW0DXzEwCAUFYWNjdW0DXzExCAUFYWNjdW0DXzEyCQDNCAIIBQVhY2N1bQNfMTMFC21hcmtldHNKc29uCAUFYWNjdW0DXzE0CAUFYWNjdW0DXzE1BA0kdDAzODQxMzM4ODk3CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAoQoPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQNuaWwFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQttYXJrZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwEFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QIBQ0kdDAzODQxMzM4ODk3Al8xBBZ0b3RhbFdhbGxldEJvcnJvd0luVXNkCAUNJHQwMzg0MTMzODg5NwJfMgQXdG90YWxXYWxsZXRCYWREZWJ0SW5Vc2QIBQ0kdDAzODQxMzM4ODk3Al8zBBt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QIBQ0kdDAzODQxMzM4ODk3Al80BCF0b3RhbFdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QIBQ0kdDAzODQxMzM4ODk3Al81BBF3YWxsZXRTdXBwbHlJblVzZAgFDSR0MDM4NDEzMzg4OTcCXzYEEXdhbGxldEJvcnJvd0luVXNkCAUNJHQwMzg0MTMzODg5NwJfNwQSd2FsbGV0QmFkRGVidEluVXNkCAUNJHQwMzg0MTMzODg5NwJfOAQWd2FsbGV0RGFpbHlJbmNvbWVJblVzZAgFDSR0MDM4NDEzMzg4OTcCXzkEHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QIBQ0kdDAzODQxMzM4ODk3A18xMAQTd2FsbGV0QWNjb3VudEhlYWx0aAgFDSR0MDM4NDEzMzg4OTcDXzExBAx3YWxsZXROZXRBcHkIBQ0kdDAzODQxMzM4ODk3A18xMgQLbWFya2V0c0pzb24IBQ0kdDAzODQxMzM4ODk3A18xMwQQc3VwcGx5QXNzZXRzSnNvbggFDSR0MDM4NDEzMzg4OTcDXzE0BBBib3Jyb3dBc3NldHNKc29uCAUNJHQwMzg0MTMzODg5NwNfMTUEBGpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCDiJtYXJrZXRJbmRleCI6CQCkAwEFC21hcmtldEluZGV4AgksIm5hbWUiOiIFCm1hcmtldE5hbWUCASICFCwidG90YWxTdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QCFCwidG90YWxCb3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QCFSwidG90YWxCYWREZWJ0SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRd0b3RhbFdhbGxldEJhZERlYnRJblVzZAIZLCJ0b3RhbERhaWx5SW5jb21lSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QCHywidG90YWxEYWlseUxvYW5JbnRlcmVzdEluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUhdG90YWxXYWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgURd2FsbGV0U3VwcGx5SW5Vc2QCDywiYm9ycm93SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRF3YWxsZXRCb3Jyb3dJblVzZAIQLCJiYWREZWJ0SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRJ3YWxsZXRCYWREZWJ0SW5Vc2QCFCwiZGFpbHlJbmNvbWVJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFndhbGxldERhaWx5SW5jb21lSW5Vc2QCGiwiZGFpbHlMb2FuSW50ZXJlc3RJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QCESwiYWNjb3VudEhlYWx0aCI6CQEPYW1vdW50VG9EZWNpbWFsAgUTd2FsbGV0QWNjb3VudEhlYWx0aAAIAgosIm5ldEFweSI6CQEPYW1vdW50VG9EZWNpbWFsAgUMd2FsbGV0TmV0QXB5AAgCESwic3VwcGx5QXNzZXRzIjpbCQC7CQIFEHN1cHBseUFzc2V0c0pzb24CASwCAV0CESwiYm9ycm93QXNzZXRzIjpbCQC7CQIFEGJvcnJvd0Fzc2V0c0pzb24CASwCAV0CDCwibWFya2V0cyI6WwkAuwkCBQttYXJrZXRzSnNvbgIBLAIBXQIBfQMFBWRlYnVnCQACAQUEanNvbgUEanNvbgEXZ2V0V2FsbGV0T3BlcmF0aW9uc0pzb24EC21hcmtldEluZGV4CmFzc2V0SWRTdHIGd2FsbGV0BWRlYnVnBAltYXJrZXRTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIHbWFya2V0XwkApAMBBQttYXJrZXRJbmRleAQNbWFya2V0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbWFya2V0U3RyBAptYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUJbWFya2V0U3RyBAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUNbWFya2V0QWRkcmVzcwIMc2V0dXBfYWN0aXZlBgQLc2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFDW1hcmtldEFkZHJlc3MEB3NldHVwQ2YJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIKc2V0dXBfbHR2cwIBLAQHc2V0dXBMdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAglzZXR1cF9sdHMCASwEDHNldHVwUGVuYWx0eQkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAg9zZXR1cF9wZW5hbHRpZXMCASwECmFzc2V0SW5kZXgJAQ1nZXRBc3NldEluZGV4AgULc2V0dXBUb2tlbnMFCmFzc2V0SWRTdHIEAmNmCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBDZgUKYXNzZXRJbmRleAQCbHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cEx0BQphc3NldEluZGV4BAdwZW5hbHR5CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMc2V0dXBQZW5hbHR5BQphc3NldEluZGV4BAthc3NldHNDb3VudAkAkAMBBQtzZXR1cFRva2VucwQObGFzdFJhdGVIZWlnaHQJARFnZXRMYXN0UmF0ZUhlaWdodAEFDW1hcmtldEFkZHJlc3MEBXByaWNlCQENZ2V0VG9rZW5QcmljZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECmFzc2V0U2NhbGUJAQ1nZXRBc3NldFNjYWxlAQUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbFN1cHBseQkBFmdldE91dGRhdGVkVG90YWxTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsQm9ycm93CQEWZ2V0T3V0ZGF0ZWRUb3RhbEJvcnJvdwIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkU1JhdGUJARBnZXRPdXRkYXRlZFNSYXRlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRCUmF0ZQkBEGdldE91dGRhdGVkQlJhdGUCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBApvdXRkYXRlZFVyCQENZ2V0T3V0ZGF0ZWRVcgQFE291dGRhdGVkVG90YWxTdXBwbHkFE291dGRhdGVkVG90YWxCb3Jyb3cFDW91dGRhdGVkU1JhdGUFDW91dGRhdGVkQlJhdGUEBHJhdGUJAQdnZXRSYXRlAwUKb3V0ZGF0ZWRVcgUKYXNzZXRJZFN0cgUJbWFya2V0U3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUKb3V0ZGF0ZWRVcgUNb3V0ZGF0ZWRTUmF0ZQQFYlJhdGUJAQ5nZXRBY3R1YWxCUmF0ZQMFDmxhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUNb3V0ZGF0ZWRCUmF0ZQQGc3VwcGx5CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUFc1JhdGUEBmJvcnJvdwkBD2dldEFjdHVhbEFtb3VudAIFE291dGRhdGVkVG90YWxCb3Jyb3cFBWJSYXRlBAtzdXBwbHlJblVzZAkBCGdldEluVXNkAwUGc3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQLYm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFBmJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UECHJlc2VydmVzCQBlAgUGc3VwcGx5BQZib3Jyb3cEDXJlc2VydmVzSW5Vc2QJAQhnZXRJblVzZAMFCHJlc2VydmVzBQphc3NldFNjYWxlBQVwcmljZQQCdXIJAQtnZXRBY3R1YWxVcgIFBnN1cHBseQUGYm9ycm93BAlzdXBwbHlBcHkJAQxnZXRTdXBwbHlBcHkCBQRyYXRlBQJ1cgQJYm9ycm93QXB5CQEMZ2V0Qm9ycm93QXB5AQUEcmF0ZQQJbWF4U3VwcGx5CQEMZ2V0TWF4U3VwcGx5AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQMd2FsbGV0U3VwcGx5CQEPZ2V0V2FsbGV0U3VwcGx5BAUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQVzUmF0ZQQRd2FsbGV0U3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldFN1cHBseQUKYXNzZXRTY2FsZQUFcHJpY2UEEXdhbGxldERhaWx5SW5jb21lCQEQZ2V0RGFpbHlQZXJjZW50cwIFCXN1cHBseUFweQUMd2FsbGV0U3VwcGx5BBZ3YWxsZXREYWlseUluY29tZUluVXNkCQEIZ2V0SW5Vc2QDBRF3YWxsZXREYWlseUluY29tZQUKYXNzZXRTY2FsZQUFcHJpY2UEDHdhbGxldEJvcnJvdwkBD2dldFdhbGxldEJvcnJvdwQFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFYlJhdGUEEXdhbGxldEJvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRCb3Jyb3cFCmFzc2V0U2NhbGUFBXByaWNlBBd3YWxsZXREYWlseUxvYW5QZXJjZW50cwkBEGdldERhaWx5UGVyY2VudHMCBQlib3Jyb3dBcHkFDHdhbGxldEJvcnJvdwQcd2FsbGV0RGFpbHlMb2FuUGVyY2VudHNJblVzZAkBCGdldEluVXNkAwUXd2FsbGV0RGFpbHlMb2FuUGVyY2VudHMFCmFzc2V0U2NhbGUFBXByaWNlCgEKYXNzZXRzRm9sZAIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0BQthc3NldHNDb3VudAUFYWNjdW0EEWN1cnJlbnRBc3NldElkU3RyCQCRAwIFC3NldHVwVG9rZW5zBQRuZXh0BAljdXJyZW50Q2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQRuZXh0BAljdXJyZW50THQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cEx0BQRuZXh0BAxjdXJyZW50UHJpY2UJAQ1nZXRUb2tlblByaWNlAgUNbWFya2V0QWRkcmVzcwURY3VycmVudEFzc2V0SWRTdHIEEWN1cnJlbnRBc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFEWN1cnJlbnRBc3NldElkU3RyBBpjdXJyZW50T3V0ZGF0ZWRUb3RhbFN1cHBseQkBFmdldE91dGRhdGVkVG90YWxTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBRFjdXJyZW50QXNzZXRJZFN0cgQaY3VycmVudE91dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUNbWFya2V0QWRkcmVzcwURY3VycmVudEFzc2V0SWRTdHIEFGN1cnJlbnRPdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFDW1hcmtldEFkZHJlc3MFEWN1cnJlbnRBc3NldElkU3RyBBRjdXJyZW50T3V0ZGF0ZWRCUmF0ZQkBEGdldE91dGRhdGVkQlJhdGUCBQ1tYXJrZXRBZGRyZXNzBRFjdXJyZW50QXNzZXRJZFN0cgQRY3VycmVudE91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUaY3VycmVudE91dGRhdGVkVG90YWxTdXBwbHkFGmN1cnJlbnRPdXRkYXRlZFRvdGFsQm9ycm93BRRjdXJyZW50T3V0ZGF0ZWRTUmF0ZQUUY3VycmVudE91dGRhdGVkQlJhdGUEC2N1cnJlbnRSYXRlCQEHZ2V0UmF0ZQMFEWN1cnJlbnRPdXRkYXRlZFVyBRFjdXJyZW50QXNzZXRJZFN0cgUJbWFya2V0U3RyBA9jdXJyZW50SW50ZXJlc3QJAQtnZXRJbnRlcmVzdAEFC2N1cnJlbnRSYXRlBAxjdXJyZW50U1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFDmxhc3RSYXRlSGVpZ2h0BQ9jdXJyZW50SW50ZXJlc3QFEWN1cnJlbnRPdXRkYXRlZFVyBRRjdXJyZW50T3V0ZGF0ZWRTUmF0ZQQMY3VycmVudEJSYXRlCQEOZ2V0QWN0dWFsQlJhdGUDBQ5sYXN0UmF0ZUhlaWdodAUPY3VycmVudEludGVyZXN0BRRjdXJyZW50T3V0ZGF0ZWRCUmF0ZQQNY3VycmVudFN1cHBseQkBD2dldEFjdHVhbEFtb3VudAIFGmN1cnJlbnRPdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQNY3VycmVudEJvcnJvdwkBD2dldEFjdHVhbEFtb3VudAIFGmN1cnJlbnRPdXRkYXRlZFRvdGFsQm9ycm93BQViUmF0ZQQJY3VycmVudFVyCQELZ2V0QWN0dWFsVXICBQ1jdXJyZW50U3VwcGx5BQ1jdXJyZW50Qm9ycm93BBBjdXJyZW50U3VwcGx5QXB5CQEMZ2V0U3VwcGx5QXB5AgULY3VycmVudFJhdGUFCWN1cnJlbnRVcgQQY3VycmVudEJvcnJvd0FweQkBDGdldEJvcnJvd0FweQEFC2N1cnJlbnRSYXRlBBNjdXJyZW50V2FsbGV0U3VwcGx5CQEPZ2V0V2FsbGV0U3VwcGx5BAUNbWFya2V0QWRkcmVzcwURY3VycmVudEFzc2V0SWRTdHIFBndhbGxldAUMY3VycmVudFNSYXRlBBhjdXJyZW50V2FsbGV0U3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFE2N1cnJlbnRXYWxsZXRTdXBwbHkFEWN1cnJlbnRBc3NldFNjYWxlBQxjdXJyZW50UHJpY2UEE2N1cnJlbnRXYWxsZXRCb3Jyb3cJAQ9nZXRXYWxsZXRCb3Jyb3cEBQ1tYXJrZXRBZGRyZXNzBRFjdXJyZW50QXNzZXRJZFN0cgUGd2FsbGV0BQxjdXJyZW50QlJhdGUEGGN1cnJlbnRXYWxsZXRCb3Jyb3dJblVzZAkBCGdldEluVXNkAwUTY3VycmVudFdhbGxldEJvcnJvdwURY3VycmVudEFzc2V0U2NhbGUFDGN1cnJlbnRQcmljZQQdY3VycmVudFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAGsDBRhjdXJyZW50V2FsbGV0U3VwcGx5SW5Vc2QFCWN1cnJlbnRDZgUGU2NhbGU4BB1jdXJyZW50V2FsbGV0Qm9ycm93VXNhZ2VJblVzZAkAawMFGGN1cnJlbnRXYWxsZXRCb3Jyb3dJblVzZAUGU2NhbGU4BQljdXJyZW50THQEEXdhbGxldE1hcmdpbkluVXNkCQBlAgkAawMFGGN1cnJlbnRXYWxsZXRTdXBwbHlJblVzZAUQY3VycmVudFN1cHBseUFweQUGU2NhbGU4CQBrAwUYY3VycmVudFdhbGxldEJvcnJvd0luVXNkBRBjdXJyZW50Qm9ycm93QXB5BQZTY2FsZTgJAJcKBQkAZAIIBQVhY2N1bQJfMQUYY3VycmVudFdhbGxldFN1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBRhjdXJyZW50V2FsbGV0Qm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFHWN1cnJlbnRXYWxsZXRCb3Jyb3dMaW1pdEluVXNkCQBkAggFBWFjY3VtAl80BR1jdXJyZW50V2FsbGV0Qm9ycm93VXNhZ2VJblVzZAkAZAIIBQVhY2N1bQJfNQURd2FsbGV0TWFyZ2luSW5Vc2QEDSR0MDQ1ODk5NDYwODAKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUAAAAAAAAAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQphc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQWdG90YWxXYWxsZXRTdXBwbHlJblVzZAgFDSR0MDQ1ODk5NDYwODACXzEEFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QIBQ0kdDA0NTg5OTQ2MDgwAl8yBBt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QIBQ0kdDA0NTg5OTQ2MDgwAl8zBBt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QIBQ0kdDA0NTg5OTQ2MDgwAl80BBZ0b3RhbFdhbGxldE1hcmdpbkluVXNkCAUNJHQwNDU4OTk0NjA4MAJfNQQNYWNjb3VudEhlYWx0aAkBEGdldEFjY291bnRIZWFsdGgCBRt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QFG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAQGbmV0QXB5CQEJZ2V0TmV0QXB5AwUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAUWdG90YWxXYWxsZXRNYXJnaW5JblVzZAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIOIm1hcmtldEluZGV4IjoJAKQDAQULbWFya2V0SW5kZXgCDywibWFya2V0TmFtZSI6IgUKbWFya2V0TmFtZQIBIgIMLCJhZGRyZXNzIjoiBQltYXJrZXRTdHICASICDiwiYXNzZXRQcmljZSI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFBXByaWNlAgosInN1cHBseSI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBQZzdXBwbHkCDywic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQtzdXBwbHlJblVzZAINLCJzdXBwbHlBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCXN1cHBseUFweQAIAgosImJvcnJvdyI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBQZib3Jyb3cCDywiYm9ycm93SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQtib3Jyb3dJblVzZAINLCJib3Jyb3dBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCWJvcnJvd0FweQAIAgwsInJlc2VydmVzIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFCHJlc2VydmVzAhEsInJlc2VydmVzSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQ1yZXNlcnZlc0luVXNkAhQsInV0aWxpemF0aW9uUmF0aW8iOgkBD2Ftb3VudFRvRGVjaW1hbAIFAnVyAAgCFCwiY29sbGF0ZXJhbEZhY3RvciI6CQEPYW1vdW50VG9EZWNpbWFsAgUCY2YACAIYLCJsaXF1aWRhdGlvblRocmVzaG9sZCI6CQEPYW1vdW50VG9EZWNpbWFsAgUCbHQACAIWLCJsaXF1aWRhdGlvblBlbmFsdHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFB3BlbmFsdHkACAINLCJtYXhTdXBwbHkiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQltYXhTdXBwbHkCECwid2FsbGV0U3VwcGx5IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFDHdhbGxldFN1cHBseQIVLCJ3YWxsZXRTdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEXdhbGxldFN1cHBseUluVXNkAhUsIndhbGxldERhaWx5SW5jb21lIjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFEXdhbGxldERhaWx5SW5jb21lAhosIndhbGxldERhaWx5SW5jb21lSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRZ3YWxsZXREYWlseUluY29tZUluVXNkAhAsIndhbGxldEJvcnJvdyI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBQx3YWxsZXRCb3Jyb3cCFSwid2FsbGV0Qm9ycm93SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRF3YWxsZXRCb3Jyb3dJblVzZAIbLCJ3YWxsZXREYWlseUxvYW5JbnRlcmVzdCI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBRd3YWxsZXREYWlseUxvYW5QZXJjZW50cwIgLCJ3YWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUcd2FsbGV0RGFpbHlMb2FuUGVyY2VudHNJblVzZAIRLCJhY2NvdW50SGVhbHRoIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQ1hY2NvdW50SGVhbHRoAAgCCiwibmV0QXB5IjoJAQ9hbW91bnRUb0RlY2ltYWwCBQZuZXRBcHkACAIBfQMFBWRlYnVnCQACAQUEanNvbgUEanNvbgEXZ2V0TWFya2V0UGFyYW1ldGVyc0pzb24CC21hcmtldEluZGV4BWRlYnVnBAltYXJrZXRTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIHbWFya2V0XwkApAMBBQttYXJrZXRJbmRleAQNbWFya2V0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbWFya2V0U3RyBAptYXJrZXROYW1lCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICDG1hcmtldF9uYW1lXwUJbWFya2V0U3RyBAtzZXR1cFRva2VucwkBDmdldFNldHVwVG9rZW5zAQUNbWFya2V0QWRkcmVzcwQHc2V0dXBDZgkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAgpzZXR1cF9sdHZzAgEsBAdzZXR1cEx0CQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCCXNldHVwX2x0cwIBLAQMc2V0dXBQZW5hbHR5CQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCD3NldHVwX3BlbmFsdGllcwIBLAQLYXNzZXRzQ291bnQJAJADAQULc2V0dXBUb2tlbnMKAQphc3NldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFC2Fzc2V0c0NvdW50BQVhY2N1bQQKYXNzZXRJZFN0cgkAkQMCBQtzZXR1cFRva2VucwUEbmV4dAQJbWF4U3VwcGx5CQEMZ2V0TWF4U3VwcGx5AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQCY2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQRuZXh0BAJsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwTHQFBG5leHQEB3BlbmFsdHkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQxzZXR1cFBlbmFsdHkFBG5leHQEBGpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AggiYXNzZXQiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgAAAg0sIm1heFN1cHBseSI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFCW1heFN1cHBseQIULCJjb2xsYXRlcmFsRmFjdG9yIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQJjZgAIAhgsImxpcXVpZGF0aW9uVGhyZXNob2xkIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQJsdAAIAhYsImxpcXVpZGF0aW9uUGVuYWx0eSI6CQEPYW1vdW50VG9EZWNpbWFsAgUHcGVuYWx0eQAIAgF9CQDNCAIFBWFjY3VtBQRqc29uBAphc3NldHNKc29uCgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQphc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AggibmFtZSI6IgUKbWFya2V0TmFtZQIBIgILLCJhc3NldHMiOlsJALsJAgUKYXNzZXRzSnNvbgIBLAIBXQIBfQMFBWRlYnVnCQACAQUEanNvbgUEanNvbgAArsFL6A==", "height": 3982638, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3W85SB1sbD9pkKjuknjtnj3ipsicGGo1psWd6DW8bZko Next: 46WCUsxY7VmzqMVhosH867sMxK7cj8PfsFcyrK9vVE3E Diff:
Old | New | Differences | |
---|---|---|---|
26 | 26 | let arr12 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] | |
27 | 27 | ||
28 | 28 | let usdtIdStr = "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" | |
29 | + | ||
30 | + | let usdcIdStr = "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" | |
31 | + | ||
32 | + | let romeIdStr = "AP4Cb5xLYGH6ZigHreCZHoXpQTWDkPsG2BHqfDUx6taJ" | |
29 | 33 | ||
30 | 34 | let oracleAddressStr = "3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t" | |
31 | 35 | ||
203 | 207 | func getTokenPrice (marketAddress,assetIdStr) = { | |
204 | 208 | let oracleStr = valueOrElse(getString(marketAddress, "oracle"), oracleAddressStr) | |
205 | 209 | let oracleAddress = addressFromStringValue(oracleStr) | |
206 | - | let stables = split(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW | |
210 | + | let stables = split(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"), ",") | |
207 | 211 | if ((indexOf(stables, assetIdStr) != unit)) | |
208 | 212 | then 1000000 | |
209 | - | else if (containsElement(axlyLPs, assetIdStr)) | |
210 | - | then { | |
211 | - | let @ = invoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil) | |
212 | - | if ($isInstanceOf(@, "Int")) | |
213 | - | then @ | |
214 | - | else throw(($getType(@) + " couldn't be cast to Int")) | |
215 | - | } | |
216 | - | else { | |
217 | - | let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B")) | |
218 | - | price | |
219 | - | } | |
213 | + | else if (if (if ((assetIdStr == usdtIdStr)) | |
214 | + | then true | |
215 | + | else (assetIdStr == usdcIdStr)) | |
216 | + | then true | |
217 | + | else (assetIdStr == romeIdStr)) | |
218 | + | then 1000000 | |
219 | + | else if (containsElement(axlyLPs, assetIdStr)) | |
220 | + | then { | |
221 | + | let @ = invoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil) | |
222 | + | if ($isInstanceOf(@, "Int")) | |
223 | + | then @ | |
224 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
225 | + | } | |
226 | + | else { | |
227 | + | let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B")) | |
228 | + | price | |
229 | + | } | |
220 | 230 | } | |
221 | 231 | ||
222 | 232 | ||
355 | 365 | ||
356 | 366 | ||
357 | 367 | func assetToJson (assetIdStr,quantity) = { | |
358 | - | let $ | |
368 | + | let $t01529015485 = if ((assetIdStr == Waves)) | |
359 | 369 | then $Tuple2(8, "WAVES") | |
360 | 370 | else { | |
361 | 371 | let asset = value(assetInfo(fromBase58String(assetIdStr))) | |
362 | 372 | $Tuple2(asset.decimals, asset.name) | |
363 | 373 | } | |
364 | - | let decimals = $ | |
365 | - | let name = $ | |
374 | + | let decimals = $t01529015485._1 | |
375 | + | let name = $t01529015485._2 | |
366 | 376 | (((((((("{\"quantity\":" + toString(quantity)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"") + name) + "\",\"id\":\"") + assetIdStr) + "\"}") | |
367 | 377 | } | |
368 | 378 | ||
406 | 416 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson)) | |
407 | 417 | } | |
408 | 418 | ||
409 | - | let $ | |
419 | + | let $t01889819006 = { | |
410 | 420 | let $l = arr12 | |
411 | 421 | let $s = size($l) | |
412 | 422 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
420 | 430 | ||
421 | 431 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
422 | 432 | } | |
423 | - | let supplyInUsd = $ | |
424 | - | let borrowInUsd = $ | |
425 | - | let reservesInUsd = $ | |
426 | - | let marketAssetsJson = $ | |
433 | + | let supplyInUsd = $t01889819006._1 | |
434 | + | let borrowInUsd = $t01889819006._2 | |
435 | + | let reservesInUsd = $t01889819006._3 | |
436 | + | let marketAssetsJson = $t01889819006._4 | |
427 | 437 | let marketsCount = getIntegerValue("markets") | |
428 | 438 | func marketsFold (accum,next) = if ((next >= marketsCount)) | |
429 | 439 | then accum | |
467 | 477 | $Tuple4((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd)) | |
468 | 478 | } | |
469 | 479 | ||
470 | - | let $ | |
480 | + | let $t02257722737 = { | |
471 | 481 | let $l = arr12 | |
472 | 482 | let $s = size($l) | |
473 | 483 | let $acc0 = $Tuple4(0, 0, 0, 0) | |
481 | 491 | ||
482 | 492 | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
483 | 493 | } | |
484 | - | let totalWalletSupplyInUsd = $ | |
485 | - | let totalWalletBorrowInUsd = $ | |
486 | - | let totalWalletBorrowLimitInUsd = $ | |
487 | - | let totalWalletBorrowUsageInUsd = $ | |
494 | + | let totalWalletSupplyInUsd = $t02257722737._1 | |
495 | + | let totalWalletBorrowInUsd = $t02257722737._2 | |
496 | + | let totalWalletBorrowLimitInUsd = $t02257722737._3 | |
497 | + | let totalWalletBorrowUsageInUsd = $t02257722737._4 | |
488 | 498 | let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd) | |
489 | 499 | let fullJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + "}") | |
490 | 500 | (accum :+ fullJson) | |
547 | 557 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson)) | |
548 | 558 | } | |
549 | 559 | ||
550 | - | let $ | |
560 | + | let $t02667126779 = { | |
551 | 561 | let $l = arr12 | |
552 | 562 | let $s = size($l) | |
553 | 563 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
561 | 571 | ||
562 | 572 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
563 | 573 | } | |
564 | - | let supplyInUsd = $ | |
565 | - | let borrowInUsd = $ | |
566 | - | let reservesInUsd = $ | |
567 | - | let marketAssetsJson = $ | |
574 | + | let supplyInUsd = $t02667126779._1 | |
575 | + | let borrowInUsd = $t02667126779._2 | |
576 | + | let reservesInUsd = $t02667126779._3 | |
577 | + | let marketAssetsJson = $t02667126779._4 | |
568 | 578 | let marketJson = ((((((("{" + "\"address\":\"") + marketStr) + "\"") + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + "}") | |
569 | 579 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketJson)) | |
570 | 580 | } | |
571 | 581 | ||
572 | - | let $ | |
582 | + | let $t02717027289 = { | |
573 | 583 | let $l = arr12 | |
574 | 584 | let $s = size($l) | |
575 | 585 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
583 | 593 | ||
584 | 594 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
585 | 595 | } | |
586 | - | let totalSupplyInUsd = $ | |
587 | - | let totalBorrowInUsd = $ | |
588 | - | let totalReservesInUsd = $ | |
589 | - | let marketsJson = $ | |
596 | + | let totalSupplyInUsd = $t02717027289._1 | |
597 | + | let totalBorrowInUsd = $t02717027289._2 | |
598 | + | let totalReservesInUsd = $t02717027289._3 | |
599 | + | let marketsJson = $t02717027289._4 | |
590 | 600 | let json = (((((((((("{" + "\"supplyInUsd\":") + assetToJson(usdtIdStr, totalSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalBorrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, totalReservesInUsd)) + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}") | |
591 | 601 | if (debug) | |
592 | 602 | then throw(json) | |
647 | 657 | $Tuple7((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd), (accum._5 + walletDailyIncomeInUsd), (accum._6 + walletDailyLoanInterestInUsd), (accum._7 + walletMarginInUsd)) | |
648 | 658 | } | |
649 | 659 | ||
650 | - | let $ | |
660 | + | let $t03211332468 = { | |
651 | 661 | let $l = arr12 | |
652 | 662 | let $s = size($l) | |
653 | 663 | let $acc0 = $Tuple7(0, 0, 0, 0, 0, 0, 0) | |
661 | 671 | ||
662 | 672 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
663 | 673 | } | |
664 | - | let totalWalletSupplyInUsd = $ | |
665 | - | let totalWalletBorrowInUsd = $ | |
666 | - | let totalWalletBorrowLimitInUsd = $ | |
667 | - | let totalWalletBorrowUsageInUsd = $ | |
668 | - | let totalWalletDailyIncomeInUsd = $ | |
669 | - | let totalWalletDailyLoanInterestInUsd = $ | |
670 | - | let totalWalletMarginInUsd = $ | |
674 | + | let totalWalletSupplyInUsd = $t03211332468._1 | |
675 | + | let totalWalletBorrowInUsd = $t03211332468._2 | |
676 | + | let totalWalletBorrowLimitInUsd = $t03211332468._3 | |
677 | + | let totalWalletBorrowUsageInUsd = $t03211332468._4 | |
678 | + | let totalWalletDailyIncomeInUsd = $t03211332468._5 | |
679 | + | let totalWalletDailyLoanInterestInUsd = $t03211332468._6 | |
680 | + | let totalWalletMarginInUsd = $t03211332468._7 | |
671 | 681 | let totalWalletBadDebtInUsd = if ((totalWalletBorrowInUsd > totalWalletSupplyInUsd)) | |
672 | 682 | then (totalWalletBorrowInUsd - totalWalletSupplyInUsd) | |
673 | 683 | else 0 | |
707 | 717 | $Tuple2((accum._1 :+ supplyAssetsJson), (accum._2 :+ borrowAssetsJson)) | |
708 | 718 | } | |
709 | 719 | ||
710 | - | let $ | |
720 | + | let $t03687036956 = { | |
711 | 721 | let $l = arr12 | |
712 | 722 | let $s = size($l) | |
713 | 723 | let $acc0 = $Tuple2(nil, nil) | |
721 | 731 | ||
722 | 732 | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
723 | 733 | } | |
724 | - | let supplyAssetsJson = $ | |
725 | - | let borrowAssetsJson = $ | |
734 | + | let supplyAssetsJson = $t03687036956._1 | |
735 | + | let borrowAssetsJson = $t03687036956._2 | |
726 | 736 | if ((marketIndex == next)) | |
727 | 737 | then $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletBadDebtInUsd, totalWalletDailyIncomeInUsd, totalWalletDailyLoanInterestInUsd, accountHealth, netApy, (accum._13 :+ marketsJson), supplyAssetsJson, borrowAssetsJson) | |
728 | 738 | else $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), accum._6, accum._7, accum._8, accum._9, accum._10, accum._11, accum._12, (accum._13 :+ marketsJson), accum._14, accum._15) | |
729 | 739 | } | |
730 | 740 | ||
731 | - | let $ | |
741 | + | let $t03841338897 = { | |
732 | 742 | let $l = arr12 | |
733 | 743 | let $s = size($l) | |
734 | 744 | let $acc0 = $Tuple15(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil) | |
742 | 752 | ||
743 | 753 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
744 | 754 | } | |
745 | - | let totalWalletSupplyInUsd = $ | |
746 | - | let totalWalletBorrowInUsd = $ | |
747 | - | let totalWalletBadDebtInUsd = $ | |
748 | - | let totalWalletDailyIncomeInUsd = $ | |
749 | - | let totalWalletDailyLoanInterestInUsd = $ | |
750 | - | let walletSupplyInUsd = $ | |
751 | - | let walletBorrowInUsd = $ | |
752 | - | let walletBadDebtInUsd = $ | |
753 | - | let walletDailyIncomeInUsd = $ | |
754 | - | let walletDailyLoanInterestInUsd = $ | |
755 | - | let walletAccountHealth = $ | |
756 | - | let walletNetApy = $ | |
757 | - | let marketsJson = $ | |
758 | - | let supplyAssetsJson = $ | |
759 | - | let borrowAssetsJson = $ | |
755 | + | let totalWalletSupplyInUsd = $t03841338897._1 | |
756 | + | let totalWalletBorrowInUsd = $t03841338897._2 | |
757 | + | let totalWalletBadDebtInUsd = $t03841338897._3 | |
758 | + | let totalWalletDailyIncomeInUsd = $t03841338897._4 | |
759 | + | let totalWalletDailyLoanInterestInUsd = $t03841338897._5 | |
760 | + | let walletSupplyInUsd = $t03841338897._6 | |
761 | + | let walletBorrowInUsd = $t03841338897._7 | |
762 | + | let walletBadDebtInUsd = $t03841338897._8 | |
763 | + | let walletDailyIncomeInUsd = $t03841338897._9 | |
764 | + | let walletDailyLoanInterestInUsd = $t03841338897._10 | |
765 | + | let walletAccountHealth = $t03841338897._11 | |
766 | + | let walletNetApy = $t03841338897._12 | |
767 | + | let marketsJson = $t03841338897._13 | |
768 | + | let supplyAssetsJson = $t03841338897._14 | |
769 | + | let borrowAssetsJson = $t03841338897._15 | |
760 | 770 | let json = ((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"name\":\"") + marketName) + "\"") + ",\"totalSupplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"totalBorrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"totalBadDebtInUsd\":") + assetToJson(usdtIdStr, totalWalletBadDebtInUsd)) + ",\"totalDailyIncomeInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyIncomeInUsd)) + ",\"totalDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyLoanInterestInUsd)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"badDebtInUsd\":") + assetToJson(usdtIdStr, walletBadDebtInUsd)) + ",\"dailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"dailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + ",\"accountHealth\":") + amountToDecimal(walletAccountHealth, 8)) + ",\"netApy\":") + amountToDecimal(walletNetApy, 8)) + ",\"supplyAssets\":[") + makeString_11C(supplyAssetsJson, ",")) + "]") + ",\"borrowAssets\":[") + makeString_11C(borrowAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}") | |
761 | 771 | if (debug) | |
762 | 772 | then throw(json) | |
840 | 850 | $Tuple5((accum._1 + currentWalletSupplyInUsd), (accum._2 + currentWalletBorrowInUsd), (accum._3 + currentWalletBorrowLimitInUsd), (accum._4 + currentWalletBorrowUsageInUsd), (accum._5 + walletMarginInUsd)) | |
841 | 851 | } | |
842 | 852 | ||
843 | - | let $ | |
853 | + | let $t04589946080 = { | |
844 | 854 | let $l = arr12 | |
845 | 855 | let $s = size($l) | |
846 | 856 | let $acc0 = $Tuple5(0, 0, 0, 0, 0) | |
854 | 864 | ||
855 | 865 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
856 | 866 | } | |
857 | - | let totalWalletSupplyInUsd = $ | |
858 | - | let totalWalletBorrowInUsd = $ | |
859 | - | let totalWalletBorrowLimitInUsd = $ | |
860 | - | let totalWalletBorrowUsageInUsd = $ | |
861 | - | let totalWalletMarginInUsd = $ | |
867 | + | let totalWalletSupplyInUsd = $t04589946080._1 | |
868 | + | let totalWalletBorrowInUsd = $t04589946080._2 | |
869 | + | let totalWalletBorrowLimitInUsd = $t04589946080._3 | |
870 | + | let totalWalletBorrowUsageInUsd = $t04589946080._4 | |
871 | + | let totalWalletMarginInUsd = $t04589946080._5 | |
862 | 872 | let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd) | |
863 | 873 | let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd) | |
864 | 874 | let json = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"marketName\":\"") + marketName) + "\"") + ",\"address\":\"") + marketStr) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, price)) + ",\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, 8)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, 8)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"utilizationRatio\":") + amountToDecimal(ur, 8)) + ",\"collateralFactor\":") + amountToDecimal(cf, 8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, 8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, 8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"walletSupply\":") + assetToJson(assetIdStr, walletSupply)) + ",\"walletSupplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"walletDailyIncome\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"walletDailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"walletBorrow\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"walletBorrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"walletDailyLoanInterest\":") + assetToJson(assetIdStr, walletDailyLoanPercents)) + ",\"walletDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanPercentsInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + ",\"netApy\":") + amountToDecimal(netApy, 8)) + "}") |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let Waves = "WAVES" | |
5 | 5 | ||
6 | 6 | let Scale6 = 1000000 | |
7 | 7 | ||
8 | 8 | let Scale8 = 100000000 | |
9 | 9 | ||
10 | 10 | let Scale8Big = toBigInt(100000000) | |
11 | 11 | ||
12 | 12 | let Scale10 = 10000000000 | |
13 | 13 | ||
14 | 14 | let Scale16 = 10000000000000000 | |
15 | 15 | ||
16 | 16 | let Scale16Big = toBigInt(10000000000000000) | |
17 | 17 | ||
18 | 18 | let dayBlocks = 1440 | |
19 | 19 | ||
20 | 20 | let yearBlocks = 525600 | |
21 | 21 | ||
22 | 22 | let yearBlocksBig = toBigInt(525600) | |
23 | 23 | ||
24 | 24 | let reserveFund = 20 | |
25 | 25 | ||
26 | 26 | let arr12 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] | |
27 | 27 | ||
28 | 28 | let usdtIdStr = "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" | |
29 | + | ||
30 | + | let usdcIdStr = "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" | |
31 | + | ||
32 | + | let romeIdStr = "AP4Cb5xLYGH6ZigHreCZHoXpQTWDkPsG2BHqfDUx6taJ" | |
29 | 33 | ||
30 | 34 | let oracleAddressStr = "3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t" | |
31 | 35 | ||
32 | 36 | let axlyAddress = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW') | |
33 | 37 | ||
34 | 38 | let axlyLPs = ["7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1", "Btw3G1j4wQgdp49PTxaFkNvn75dQtqGDM7ejQppHnWC1", "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe", "F2AKkA513k5yHEJkLsU6vWxCYYk811GpjLhwEv2WGwZ9", "4CQ5CPGLXLbWBUs2JBjKUaRqF49CmKHkwzvPgSvQpAQV", "6iMB6LKSrgv9waEvEnN6Ydyx7dfxPnGcTw8318WVm5bR"] | |
35 | 39 | ||
36 | 40 | func getRateCurve (assetIdStr,marketStr) = { | |
37 | 41 | let marketAddress = addressFromStringValue(marketStr) | |
38 | 42 | let setupRateCurve = getString(marketAddress, ("setup_rateCurve_" + assetIdStr)) | |
39 | 43 | if (isDefined(setupRateCurve)) | |
40 | 44 | then { | |
41 | 45 | let curveArr = split(value(setupRateCurve), ",") | |
42 | 46 | $Tuple4(parseIntValue(curveArr[0]), parseIntValue(curveArr[1]), parseIntValue(curveArr[2]), parseIntValue(curveArr[3])) | |
43 | 47 | } | |
44 | 48 | else match marketStr { | |
45 | 49 | case _ => | |
46 | 50 | if (("3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH" == $match0)) | |
47 | 51 | then match assetIdStr { | |
48 | 52 | case _ => | |
49 | 53 | if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1)) | |
50 | 54 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
51 | 55 | else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match1)) | |
52 | 56 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
53 | 57 | else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match1)) | |
54 | 58 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
55 | 59 | else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match1)) | |
56 | 60 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
57 | 61 | else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match1)) | |
58 | 62 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
59 | 63 | else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match1)) | |
60 | 64 | then $Tuple4(2000000, 40000000, 80000000, 150000000) | |
61 | 65 | else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match1)) | |
62 | 66 | then $Tuple4(0, 100000000, 80000000, 400000000) | |
63 | 67 | else if (("WAVES" == $match1)) | |
64 | 68 | then $Tuple4(2000000, 30000000, 80000000, 90000000) | |
65 | 69 | else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match1)) | |
66 | 70 | then $Tuple4(0, 20000000, 80000000, 40000000) | |
67 | 71 | else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match1)) | |
68 | 72 | then $Tuple4(0, 20000000, 80000000, 100000000) | |
69 | 73 | else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match1)) | |
70 | 74 | then $Tuple4(0, 30000000, 80000000, 40000000) | |
71 | 75 | else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match1)) | |
72 | 76 | then $Tuple4(0, 25000000, 80000000, 40000000) | |
73 | 77 | else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match1)) | |
74 | 78 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
75 | 79 | else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match1)) | |
76 | 80 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
77 | 81 | else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match1)) | |
78 | 82 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
79 | 83 | else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match1)) | |
80 | 84 | then $Tuple4(2000000, 40000000, 80000000, 100000000) | |
81 | 85 | else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match1)) | |
82 | 86 | then $Tuple4(2000000, 30000000, 80000000, 80000000) | |
83 | 87 | else if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1)) | |
84 | 88 | then $Tuple4(0, 50000000, 80000000, 200000000) | |
85 | 89 | else if (("3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13" == $match1)) | |
86 | 90 | then $Tuple4(0, 100000000, 80000000, 400000000) | |
87 | 91 | else $Tuple4(0, 20000000, 80000000, 80000000) | |
88 | 92 | } | |
89 | 93 | else if (("3P8Df2b7ywHtLBHBe8PBVQYd3A5MdEEJAou" == $match0)) | |
90 | 94 | then $Tuple4(20000000, 100000000, 60000000, 400000000) | |
91 | 95 | else if (("3P4DK5VzDwL3vfc5ahUEhtoe5ByZNyacJ3X" == $match0)) | |
92 | 96 | then match assetIdStr { | |
93 | 97 | case _ => | |
94 | 98 | if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1)) | |
95 | 99 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
96 | 100 | else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match1)) | |
97 | 101 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
98 | 102 | else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match1)) | |
99 | 103 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
100 | 104 | else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match1)) | |
101 | 105 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
102 | 106 | else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match1)) | |
103 | 107 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
104 | 108 | else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match1)) | |
105 | 109 | then $Tuple4(2000000, 40000000, 80000000, 150000000) | |
106 | 110 | else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match1)) | |
107 | 111 | then $Tuple4(0, 50000000, 80000000, 400000000) | |
108 | 112 | else if (("WAVES" == $match1)) | |
109 | 113 | then $Tuple4(2000000, 30000000, 80000000, 80000000) | |
110 | 114 | else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match1)) | |
111 | 115 | then $Tuple4(0, 20000000, 80000000, 40000000) | |
112 | 116 | else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match1)) | |
113 | 117 | then $Tuple4(0, 20000000, 80000000, 100000000) | |
114 | 118 | else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match1)) | |
115 | 119 | then $Tuple4(0, 30000000, 80000000, 40000000) | |
116 | 120 | else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match1)) | |
117 | 121 | then $Tuple4(0, 25000000, 80000000, 40000000) | |
118 | 122 | else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match1)) | |
119 | 123 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
120 | 124 | else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match1)) | |
121 | 125 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
122 | 126 | else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match1)) | |
123 | 127 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
124 | 128 | else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match1)) | |
125 | 129 | then $Tuple4(2000000, 40000000, 80000000, 100000000) | |
126 | 130 | else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match1)) | |
127 | 131 | then $Tuple4(2000000, 30000000, 80000000, 80000000) | |
128 | 132 | else if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1)) | |
129 | 133 | then $Tuple4(0, 50000000, 80000000, 200000000) | |
130 | 134 | else if (("3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13" == $match1)) | |
131 | 135 | then $Tuple4(0, 100000000, 80000000, 400000000) | |
132 | 136 | else $Tuple4(0, 20000000, 80000000, 80000000) | |
133 | 137 | } | |
134 | 138 | else if (("3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH" == $match0)) | |
135 | 139 | then $Tuple4(20000000, 100000000, 60000000, 400000000) | |
136 | 140 | else if (("3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V" == $match0)) | |
137 | 141 | then match assetIdStr { | |
138 | 142 | case _ => | |
139 | 143 | if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1)) | |
140 | 144 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
141 | 145 | else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match1)) | |
142 | 146 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
143 | 147 | else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match1)) | |
144 | 148 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
145 | 149 | else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match1)) | |
146 | 150 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
147 | 151 | else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match1)) | |
148 | 152 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
149 | 153 | else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match1)) | |
150 | 154 | then $Tuple4(2000000, 40000000, 80000000, 150000000) | |
151 | 155 | else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match1)) | |
152 | 156 | then $Tuple4(0, 20000000, 80000000, 40000000) | |
153 | 157 | else if (("WAVES" == $match1)) | |
154 | 158 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
155 | 159 | else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match1)) | |
156 | 160 | then $Tuple4(0, 20000000, 80000000, 40000000) | |
157 | 161 | else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match1)) | |
158 | 162 | then $Tuple4(0, 20000000, 80000000, 100000000) | |
159 | 163 | else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match1)) | |
160 | 164 | then $Tuple4(0, 30000000, 80000000, 40000000) | |
161 | 165 | else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match1)) | |
162 | 166 | then $Tuple4(0, 25000000, 80000000, 40000000) | |
163 | 167 | else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match1)) | |
164 | 168 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
165 | 169 | else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match1)) | |
166 | 170 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
167 | 171 | else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match1)) | |
168 | 172 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
169 | 173 | else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match1)) | |
170 | 174 | then $Tuple4(2000000, 40000000, 80000000, 100000000) | |
171 | 175 | else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match1)) | |
172 | 176 | then $Tuple4(2000000, 30000000, 80000000, 80000000) | |
173 | 177 | else $Tuple4(0, 20000000, 80000000, 80000000) | |
174 | 178 | } | |
175 | 179 | else throw("Unknown market") | |
176 | 180 | } | |
177 | 181 | } | |
178 | 182 | ||
179 | 183 | ||
180 | 184 | func sum (size,data) = { | |
181 | 185 | func fold (accum,next) = if ((next >= size)) | |
182 | 186 | then accum | |
183 | 187 | else (accum + data[next]) | |
184 | 188 | ||
185 | 189 | let $l = arr12 | |
186 | 190 | let $s = size($l) | |
187 | 191 | let $acc0 = 0 | |
188 | 192 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
189 | 193 | then $a | |
190 | 194 | else fold($a, $l[$i]) | |
191 | 195 | ||
192 | 196 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
193 | 197 | then $a | |
194 | 198 | else throw("List size exceeds 12") | |
195 | 199 | ||
196 | 200 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
197 | 201 | } | |
198 | 202 | ||
199 | 203 | ||
200 | 204 | func getSetupTokens (marketAddress) = split(getStringValue(marketAddress, "setup_tokens"), ",") | |
201 | 205 | ||
202 | 206 | ||
203 | 207 | func getTokenPrice (marketAddress,assetIdStr) = { | |
204 | 208 | let oracleStr = valueOrElse(getString(marketAddress, "oracle"), oracleAddressStr) | |
205 | 209 | let oracleAddress = addressFromStringValue(oracleStr) | |
206 | - | let stables = split(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW | |
210 | + | let stables = split(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"), ",") | |
207 | 211 | if ((indexOf(stables, assetIdStr) != unit)) | |
208 | 212 | then 1000000 | |
209 | - | else if (containsElement(axlyLPs, assetIdStr)) | |
210 | - | then { | |
211 | - | let @ = invoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil) | |
212 | - | if ($isInstanceOf(@, "Int")) | |
213 | - | then @ | |
214 | - | else throw(($getType(@) + " couldn't be cast to Int")) | |
215 | - | } | |
216 | - | else { | |
217 | - | let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B")) | |
218 | - | price | |
219 | - | } | |
213 | + | else if (if (if ((assetIdStr == usdtIdStr)) | |
214 | + | then true | |
215 | + | else (assetIdStr == usdcIdStr)) | |
216 | + | then true | |
217 | + | else (assetIdStr == romeIdStr)) | |
218 | + | then 1000000 | |
219 | + | else if (containsElement(axlyLPs, assetIdStr)) | |
220 | + | then { | |
221 | + | let @ = invoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil) | |
222 | + | if ($isInstanceOf(@, "Int")) | |
223 | + | then @ | |
224 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
225 | + | } | |
226 | + | else { | |
227 | + | let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B")) | |
228 | + | price | |
229 | + | } | |
220 | 230 | } | |
221 | 231 | ||
222 | 232 | ||
223 | 233 | func getAssetScale (assetIdStr) = { | |
224 | 234 | let decimals = if ((assetIdStr == "WAVES")) | |
225 | 235 | then 8 | |
226 | 236 | else value(assetInfo(fromBase58String(assetIdStr))).decimals | |
227 | 237 | pow(10, 0, decimals, 0, 0, DOWN) | |
228 | 238 | } | |
229 | 239 | ||
230 | 240 | ||
231 | 241 | func getLastRateHeight (marketAddress) = valueOrElse(getInteger(marketAddress, "lastRateHeight"), 0) | |
232 | 242 | ||
233 | 243 | ||
234 | 244 | func getOutdatedTotalSupply (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_supplied_" + assetIdStr)), 0) | |
235 | 245 | ||
236 | 246 | ||
237 | 247 | func getOutdatedTotalBorrow (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_borrowed_" + assetIdStr)), 0) | |
238 | 248 | ||
239 | 249 | ||
240 | 250 | func getOutdatedSRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_sRate")), 0) | |
241 | 251 | ||
242 | 252 | ||
243 | 253 | func getOutdatedBRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_bRate")), 0) | |
244 | 254 | ||
245 | 255 | ||
246 | 256 | func getOutdatedUr (outdatedTotalSupply,outdatedTotalBorrow,outdatedSRate,outdatedBRate) = { | |
247 | 257 | let down = fraction(outdatedTotalSupply, outdatedSRate, Scale16) | |
248 | 258 | if ((down == 0)) | |
249 | 259 | then 0 | |
250 | 260 | else fraction(Scale8, fraction(outdatedTotalBorrow, outdatedBRate, Scale16), down) | |
251 | 261 | } | |
252 | 262 | ||
253 | 263 | ||
254 | 264 | func getRate (outdatedUr,assetIdStr,marketStr) = { | |
255 | 265 | let curve = getRateCurve(assetIdStr, marketStr) | |
256 | 266 | (curve._1 + (if ((curve._3 >= outdatedUr)) | |
257 | 267 | then fraction(outdatedUr, curve._2, curve._3) | |
258 | 268 | else (curve._2 + fraction((outdatedUr - curve._3), curve._4, (100000000 - curve._3))))) | |
259 | 269 | } | |
260 | 270 | ||
261 | 271 | ||
262 | 272 | func getInterest (rate) = max([fraction(rate, Scale8, yearBlocks), 1]) | |
263 | 273 | ||
264 | 274 | ||
265 | 275 | func getAssetIndex (setupTokens,assetIdStr) = value(indexOf(setupTokens, assetIdStr)) | |
266 | 276 | ||
267 | 277 | ||
268 | 278 | func getAssetParamters (marketParameters,assetIndex) = $Tuple3(marketParameters._1[assetIndex], marketParameters._2[assetIndex], marketParameters._3[assetIndex]) | |
269 | 279 | ||
270 | 280 | ||
271 | 281 | func getMarketParameters (marketAddress,setupTokens) = { | |
272 | 282 | let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",") | |
273 | 283 | let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",") | |
274 | 284 | let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",") | |
275 | 285 | let tokensSize = size(setupTokens) | |
276 | 286 | func fold (accum,next) = if ((next >= tokensSize)) | |
277 | 287 | then accum | |
278 | 288 | else $Tuple3((accum._1 :+ parseIntValue(setupCf[next])), (accum._2 :+ parseIntValue(setupLt[next])), (accum._3 :+ parseIntValue(setupPenalty[next]))) | |
279 | 289 | ||
280 | 290 | let $l = arr12 | |
281 | 291 | let $s = size($l) | |
282 | 292 | let $acc0 = $Tuple3(nil, nil, nil) | |
283 | 293 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
284 | 294 | then $a | |
285 | 295 | else fold($a, $l[$i]) | |
286 | 296 | ||
287 | 297 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
288 | 298 | then $a | |
289 | 299 | else throw("List size exceeds 12") | |
290 | 300 | ||
291 | 301 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
292 | 302 | } | |
293 | 303 | ||
294 | 304 | ||
295 | 305 | func getMaxSupply (marketAddress,assetIdStr) = parseIntValue(valueOrElse(getString(marketAddress, ("setup_maxSupply_" + assetIdStr)), "0")) | |
296 | 306 | ||
297 | 307 | ||
298 | 308 | func getActualSRate (lastRateHeight,interest,outdatedUr,outdatedSRate) = { | |
299 | 309 | let lastSRate = max([outdatedSRate, Scale16]) | |
300 | 310 | let newSRate = (lastSRate + ((((height - lastRateHeight) * fraction(interest, outdatedUr, Scale8)) * (100 - reserveFund)) / 100)) | |
301 | 311 | newSRate | |
302 | 312 | } | |
303 | 313 | ||
304 | 314 | ||
305 | 315 | func getActualBRate (lastRateHeight,interest,outdatedBRate) = { | |
306 | 316 | let lastBRate = max([outdatedBRate, Scale16]) | |
307 | 317 | let newBRate = (lastBRate + ((height - lastRateHeight) * interest)) | |
308 | 318 | newBRate | |
309 | 319 | } | |
310 | 320 | ||
311 | 321 | ||
312 | 322 | func getActualUr (actualSupply,actualBorrow) = fraction(actualBorrow, Scale8, actualSupply) | |
313 | 323 | ||
314 | 324 | ||
315 | 325 | func getActualAmount (outdatedAmount,actualRate) = fraction(outdatedAmount, actualRate, Scale16) | |
316 | 326 | ||
317 | 327 | ||
318 | 328 | func getInUsd (actualAmount,assetScale,price) = fraction(actualAmount, price, assetScale) | |
319 | 329 | ||
320 | 330 | ||
321 | 331 | func getSupplyApy (rate,actualUr) = { | |
322 | 332 | let supplyRate = fraction(fraction(rate, 80, 100), actualUr, Scale8) | |
323 | 333 | (toInt(pow((Scale16Big + fraction(toBigInt(supplyRate), Scale8Big, yearBlocksBig)), 16, yearBlocksBig, 0, 8, DOWN)) - Scale8) | |
324 | 334 | } | |
325 | 335 | ||
326 | 336 | ||
327 | 337 | func getBorrowApy (rate) = (toInt(pow((Scale16Big + fraction(toBigInt(rate), Scale8Big, yearBlocksBig)), 16, yearBlocksBig, 0, 8, DOWN)) - Scale8) | |
328 | 338 | ||
329 | 339 | ||
330 | 340 | func getWalletSupply (marketAddress,assetIdStr,wallet,actualSRate) = { | |
331 | 341 | let outdatedWalletSupply = valueOrElse(getInteger(marketAddress, ((wallet + "_supplied_") + assetIdStr)), 0) | |
332 | 342 | getActualAmount(outdatedWalletSupply, actualSRate) | |
333 | 343 | } | |
334 | 344 | ||
335 | 345 | ||
336 | 346 | func getWalletBorrow (marketAddress,assetIdStr,wallet,actualBRate) = { | |
337 | 347 | let outdatedWalletBorrow = valueOrElse(getInteger(marketAddress, ((wallet + "_borrowed_") + assetIdStr)), 0) | |
338 | 348 | getActualAmount(outdatedWalletBorrow, actualBRate) | |
339 | 349 | } | |
340 | 350 | ||
341 | 351 | ||
342 | 352 | func getDailyPercents (apy,quantity) = fraction(fraction((toInt(pow((Scale8Big + toBigInt(apy)), 8, (Scale16Big / yearBlocksBig), 16, 16, DOWN)) - Scale16), dayBlocks, Scale8), quantity, Scale8) | |
343 | 353 | ||
344 | 354 | ||
345 | 355 | func getAccountHealth (totalWalletBorrowLimitInUsd,totalWalletBorrowUsageInUsd) = if ((totalWalletBorrowLimitInUsd == 0)) | |
346 | 356 | then Scale8 | |
347 | 357 | else (Scale8 - fraction(totalWalletBorrowUsageInUsd, Scale8, totalWalletBorrowLimitInUsd)) | |
348 | 358 | ||
349 | 359 | ||
350 | 360 | func getNetApy (totalWalletSupplyInUsd,totalWalletBorrowInUsd,totalWalletMarginInUsd) = if ((totalWalletMarginInUsd == 0)) | |
351 | 361 | then 0 | |
352 | 362 | else if ((totalWalletMarginInUsd > 0)) | |
353 | 363 | then fraction(totalWalletMarginInUsd, Scale8, totalWalletSupplyInUsd) | |
354 | 364 | else fraction(totalWalletMarginInUsd, Scale8, totalWalletBorrowInUsd) | |
355 | 365 | ||
356 | 366 | ||
357 | 367 | func assetToJson (assetIdStr,quantity) = { | |
358 | - | let $ | |
368 | + | let $t01529015485 = if ((assetIdStr == Waves)) | |
359 | 369 | then $Tuple2(8, "WAVES") | |
360 | 370 | else { | |
361 | 371 | let asset = value(assetInfo(fromBase58String(assetIdStr))) | |
362 | 372 | $Tuple2(asset.decimals, asset.name) | |
363 | 373 | } | |
364 | - | let decimals = $ | |
365 | - | let name = $ | |
374 | + | let decimals = $t01529015485._1 | |
375 | + | let name = $t01529015485._2 | |
366 | 376 | (((((((("{\"quantity\":" + toString(quantity)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"") + name) + "\",\"id\":\"") + assetIdStr) + "\"}") | |
367 | 377 | } | |
368 | 378 | ||
369 | 379 | ||
370 | 380 | func amountToDecimal (amount,decimals) = (((("{\"quantity\":" + toString(amount)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"\",\"id\":\"\"}") | |
371 | 381 | ||
372 | 382 | ||
373 | 383 | func getMarketJson (marketIndex,wallet,debug) = { | |
374 | 384 | let marketStr = getStringValue(("market_" + toString(marketIndex))) | |
375 | 385 | let marketAddress = addressFromStringValue(marketStr) | |
376 | 386 | let marketName = getStringValue(("market_name_" + marketStr)) | |
377 | 387 | let active = valueOrElse(getBoolean(marketAddress, "setup_active"), true) | |
378 | 388 | let setupTokens = getSetupTokens(marketAddress) | |
379 | 389 | let assetsCount = size(setupTokens) | |
380 | 390 | let lastRateHeight = getLastRateHeight(marketAddress) | |
381 | 391 | func assetsFold (accum,next) = if ((next >= assetsCount)) | |
382 | 392 | then accum | |
383 | 393 | else { | |
384 | 394 | let assetIdStr = setupTokens[next] | |
385 | 395 | let price = getTokenPrice(marketAddress, assetIdStr) | |
386 | 396 | let assetScale = getAssetScale(assetIdStr) | |
387 | 397 | let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr) | |
388 | 398 | let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr) | |
389 | 399 | let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr) | |
390 | 400 | let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr) | |
391 | 401 | let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate) | |
392 | 402 | let rate = getRate(outdatedUr, assetIdStr, marketStr) | |
393 | 403 | let interest = getInterest(rate) | |
394 | 404 | let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate) | |
395 | 405 | let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate) | |
396 | 406 | let supply = getActualAmount(outdatedTotalSupply, sRate) | |
397 | 407 | let borrow = getActualAmount(outdatedTotalBorrow, bRate) | |
398 | 408 | let supplyInUsd = getInUsd(supply, assetScale, price) | |
399 | 409 | let borrowInUsd = getInUsd(borrow, assetScale, price) | |
400 | 410 | let reserves = (supply - borrow) | |
401 | 411 | let reservesInUsd = getInUsd(reserves, assetScale, price) | |
402 | 412 | let ur = getActualUr(supply, borrow) | |
403 | 413 | let supplyApy = getSupplyApy(rate, ur) | |
404 | 414 | let borrowApy = getBorrowApy(rate) | |
405 | 415 | let marketAssetJson = ((((((((((((((((((((((((("{" + "\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, 8)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, 8)) + ",\"utilizationRatio\":") + amountToDecimal(ur, 8)) + ",\"sRate\":") + amountToDecimal(sRate, 16)) + ",\"bRate\":") + amountToDecimal(bRate, 16)) + "}") | |
406 | 416 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson)) | |
407 | 417 | } | |
408 | 418 | ||
409 | - | let $ | |
419 | + | let $t01889819006 = { | |
410 | 420 | let $l = arr12 | |
411 | 421 | let $s = size($l) | |
412 | 422 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
413 | 423 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
414 | 424 | then $a | |
415 | 425 | else assetsFold($a, $l[$i]) | |
416 | 426 | ||
417 | 427 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
418 | 428 | then $a | |
419 | 429 | else throw("List size exceeds 12") | |
420 | 430 | ||
421 | 431 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
422 | 432 | } | |
423 | - | let supplyInUsd = $ | |
424 | - | let borrowInUsd = $ | |
425 | - | let reservesInUsd = $ | |
426 | - | let marketAssetsJson = $ | |
433 | + | let supplyInUsd = $t01889819006._1 | |
434 | + | let borrowInUsd = $t01889819006._2 | |
435 | + | let reservesInUsd = $t01889819006._3 | |
436 | + | let marketAssetsJson = $t01889819006._4 | |
427 | 437 | let marketsCount = getIntegerValue("markets") | |
428 | 438 | func marketsFold (accum,next) = if ((next >= marketsCount)) | |
429 | 439 | then accum | |
430 | 440 | else { | |
431 | 441 | let currentMarketAddressStr = getStringValue(("market_" + toString(next))) | |
432 | 442 | let currentMarketName = getStringValue(("market_name_" + currentMarketAddressStr)) | |
433 | 443 | let simpleJson = (((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, 0)) + ",\"accountHealth\":") + amountToDecimal(0, 8)) + "}") | |
434 | 444 | if ((wallet == "")) | |
435 | 445 | then (accum :+ simpleJson) | |
436 | 446 | else { | |
437 | 447 | let currentMarketAddress = addressFromStringValue(currentMarketAddressStr) | |
438 | 448 | let currentSetupTokens = getSetupTokens(currentMarketAddress) | |
439 | 449 | let currentAssetsCount = size(currentSetupTokens) | |
440 | 450 | let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr)) | |
441 | 451 | let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",") | |
442 | 452 | let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",") | |
443 | 453 | let currentLastRateHeight = getLastRateHeight(currentMarketAddress) | |
444 | 454 | func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount)) | |
445 | 455 | then accum | |
446 | 456 | else { | |
447 | 457 | let assetIdStr = currentSetupTokens[next] | |
448 | 458 | let cf = parseIntValue(setupCf[next]) | |
449 | 459 | let lt = parseIntValue(setupLt[next]) | |
450 | 460 | let price = getTokenPrice(marketAddress, assetIdStr) | |
451 | 461 | let assetScale = getAssetScale(assetIdStr) | |
452 | 462 | let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr) | |
453 | 463 | let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr) | |
454 | 464 | let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr) | |
455 | 465 | let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr) | |
456 | 466 | let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate) | |
457 | 467 | let rate = getRate(outdatedUr, assetIdStr, marketStr) | |
458 | 468 | let interest = getInterest(rate) | |
459 | 469 | let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate) | |
460 | 470 | let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate) | |
461 | 471 | let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate) | |
462 | 472 | let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price) | |
463 | 473 | let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate) | |
464 | 474 | let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price) | |
465 | 475 | let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8) | |
466 | 476 | let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt) | |
467 | 477 | $Tuple4((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd)) | |
468 | 478 | } | |
469 | 479 | ||
470 | - | let $ | |
480 | + | let $t02257722737 = { | |
471 | 481 | let $l = arr12 | |
472 | 482 | let $s = size($l) | |
473 | 483 | let $acc0 = $Tuple4(0, 0, 0, 0) | |
474 | 484 | func $f1_1 ($a,$i) = if (($i >= $s)) | |
475 | 485 | then $a | |
476 | 486 | else marketAssetsFold($a, $l[$i]) | |
477 | 487 | ||
478 | 488 | func $f1_2 ($a,$i) = if (($i >= $s)) | |
479 | 489 | then $a | |
480 | 490 | else throw("List size exceeds 12") | |
481 | 491 | ||
482 | 492 | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
483 | 493 | } | |
484 | - | let totalWalletSupplyInUsd = $ | |
485 | - | let totalWalletBorrowInUsd = $ | |
486 | - | let totalWalletBorrowLimitInUsd = $ | |
487 | - | let totalWalletBorrowUsageInUsd = $ | |
494 | + | let totalWalletSupplyInUsd = $t02257722737._1 | |
495 | + | let totalWalletBorrowInUsd = $t02257722737._2 | |
496 | + | let totalWalletBorrowLimitInUsd = $t02257722737._3 | |
497 | + | let totalWalletBorrowUsageInUsd = $t02257722737._4 | |
488 | 498 | let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd) | |
489 | 499 | let fullJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + "}") | |
490 | 500 | (accum :+ fullJson) | |
491 | 501 | } | |
492 | 502 | } | |
493 | 503 | ||
494 | 504 | let marketsJson = { | |
495 | 505 | let $l = arr12 | |
496 | 506 | let $s = size($l) | |
497 | 507 | let $acc0 = nil | |
498 | 508 | func $f1_1 ($a,$i) = if (($i >= $s)) | |
499 | 509 | then $a | |
500 | 510 | else marketsFold($a, $l[$i]) | |
501 | 511 | ||
502 | 512 | func $f1_2 ($a,$i) = if (($i >= $s)) | |
503 | 513 | then $a | |
504 | 514 | else throw("List size exceeds 12") | |
505 | 515 | ||
506 | 516 | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
507 | 517 | } | |
508 | 518 | let json = ((((((((((((((((((((((("{" + "\"index\":") + toString(marketIndex)) + ",\"name\":\"") + marketName) + "\"") + ",\"address\":\"") + marketStr) + "\"") + ",\"active\":") + toString(active)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}") | |
509 | 519 | if (debug) | |
510 | 520 | then throw(json) | |
511 | 521 | else json | |
512 | 522 | } | |
513 | 523 | ||
514 | 524 | ||
515 | 525 | func getMenuJson (debug) = { | |
516 | 526 | let marketsCount = getIntegerValue("markets") | |
517 | 527 | func marketsFold (accum,next) = if ((next >= marketsCount)) | |
518 | 528 | then accum | |
519 | 529 | else { | |
520 | 530 | let marketStr = getStringValue(("market_" + toString(next))) | |
521 | 531 | let marketAddress = addressFromStringValue(marketStr) | |
522 | 532 | let setupTokens = getSetupTokens(marketAddress) | |
523 | 533 | let assetsCount = size(setupTokens) | |
524 | 534 | let lastRateHeight = getLastRateHeight(marketAddress) | |
525 | 535 | func assetsFold (accum,next) = if ((next >= assetsCount)) | |
526 | 536 | then accum | |
527 | 537 | else { | |
528 | 538 | let assetIdStr = setupTokens[next] | |
529 | 539 | let price = getTokenPrice(marketAddress, assetIdStr) | |
530 | 540 | let assetScale = getAssetScale(assetIdStr) | |
531 | 541 | let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr) | |
532 | 542 | let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr) | |
533 | 543 | let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr) | |
534 | 544 | let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr) | |
535 | 545 | let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate) | |
536 | 546 | let rate = getRate(outdatedUr, assetIdStr, marketStr) | |
537 | 547 | let interest = getInterest(rate) | |
538 | 548 | let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate) | |
539 | 549 | let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate) | |
540 | 550 | let supply = getActualAmount(outdatedTotalSupply, sRate) | |
541 | 551 | let borrow = getActualAmount(outdatedTotalBorrow, bRate) | |
542 | 552 | let supplyInUsd = getInUsd(supply, assetScale, price) | |
543 | 553 | let borrowInUsd = getInUsd(borrow, assetScale, price) | |
544 | 554 | let reserves = (supply - borrow) | |
545 | 555 | let reservesInUsd = getInUsd(reserves, assetScale, price) | |
546 | 556 | let marketAssetJson = ((((((((("{" + "\"asset\":") + assetToJson(assetIdStr, 0)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"sRate\":") + amountToDecimal(sRate, 16)) + ",\"bRate\":") + amountToDecimal(bRate, 16)) + "}") | |
547 | 557 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson)) | |
548 | 558 | } | |
549 | 559 | ||
550 | - | let $ | |
560 | + | let $t02667126779 = { | |
551 | 561 | let $l = arr12 | |
552 | 562 | let $s = size($l) | |
553 | 563 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
554 | 564 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
555 | 565 | then $a | |
556 | 566 | else assetsFold($a, $l[$i]) | |
557 | 567 | ||
558 | 568 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
559 | 569 | then $a | |
560 | 570 | else throw("List size exceeds 12") | |
561 | 571 | ||
562 | 572 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
563 | 573 | } | |
564 | - | let supplyInUsd = $ | |
565 | - | let borrowInUsd = $ | |
566 | - | let reservesInUsd = $ | |
567 | - | let marketAssetsJson = $ | |
574 | + | let supplyInUsd = $t02667126779._1 | |
575 | + | let borrowInUsd = $t02667126779._2 | |
576 | + | let reservesInUsd = $t02667126779._3 | |
577 | + | let marketAssetsJson = $t02667126779._4 | |
568 | 578 | let marketJson = ((((((("{" + "\"address\":\"") + marketStr) + "\"") + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + "}") | |
569 | 579 | $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketJson)) | |
570 | 580 | } | |
571 | 581 | ||
572 | - | let $ | |
582 | + | let $t02717027289 = { | |
573 | 583 | let $l = arr12 | |
574 | 584 | let $s = size($l) | |
575 | 585 | let $acc0 = $Tuple4(0, 0, 0, nil) | |
576 | 586 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
577 | 587 | then $a | |
578 | 588 | else marketsFold($a, $l[$i]) | |
579 | 589 | ||
580 | 590 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
581 | 591 | then $a | |
582 | 592 | else throw("List size exceeds 12") | |
583 | 593 | ||
584 | 594 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
585 | 595 | } | |
586 | - | let totalSupplyInUsd = $ | |
587 | - | let totalBorrowInUsd = $ | |
588 | - | let totalReservesInUsd = $ | |
589 | - | let marketsJson = $ | |
596 | + | let totalSupplyInUsd = $t02717027289._1 | |
597 | + | let totalBorrowInUsd = $t02717027289._2 | |
598 | + | let totalReservesInUsd = $t02717027289._3 | |
599 | + | let marketsJson = $t02717027289._4 | |
590 | 600 | let json = (((((((((("{" + "\"supplyInUsd\":") + assetToJson(usdtIdStr, totalSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalBorrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, totalReservesInUsd)) + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}") | |
591 | 601 | if (debug) | |
592 | 602 | then throw(json) | |
593 | 603 | else json | |
594 | 604 | } | |
595 | 605 | ||
596 | 606 | ||
597 | 607 | func getWalletJson (marketIndex,wallet,debug) = { | |
598 | 608 | let marketStr = getStringValue(("market_" + toString(marketIndex))) | |
599 | 609 | let marketAddress = addressFromStringValue(marketStr) | |
600 | 610 | let marketName = getStringValue(("market_name_" + marketStr)) | |
601 | 611 | let marketsCount = getIntegerValue("markets") | |
602 | 612 | func marketsFold (accum,next) = if ((next >= marketsCount)) | |
603 | 613 | then accum | |
604 | 614 | else { | |
605 | 615 | let currentMarketAddressStr = getStringValue(("market_" + toString(next))) | |
606 | 616 | let currentMarketName = getStringValue(("market_name_" + currentMarketAddressStr)) | |
607 | 617 | let currentMarketAddress = addressFromStringValue(currentMarketAddressStr) | |
608 | 618 | let currentSetupTokens = getSetupTokens(currentMarketAddress) | |
609 | 619 | let currentAssetsCount = size(currentSetupTokens) | |
610 | 620 | let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr)) | |
611 | 621 | let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",") | |
612 | 622 | let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",") | |
613 | 623 | let currentLastRateHeight = getLastRateHeight(currentMarketAddress) | |
614 | 624 | func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount)) | |
615 | 625 | then accum | |
616 | 626 | else { | |
617 | 627 | let assetIdStr = currentSetupTokens[next] | |
618 | 628 | let cf = parseIntValue(setupCf[next]) | |
619 | 629 | let lt = parseIntValue(setupLt[next]) | |
620 | 630 | let price = getTokenPrice(marketAddress, assetIdStr) | |
621 | 631 | let assetScale = getAssetScale(assetIdStr) | |
622 | 632 | let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr) | |
623 | 633 | let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr) | |
624 | 634 | let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr) | |
625 | 635 | let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr) | |
626 | 636 | let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate) | |
627 | 637 | let rate = getRate(outdatedUr, assetIdStr, marketStr) | |
628 | 638 | let interest = getInterest(rate) | |
629 | 639 | let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate) | |
630 | 640 | let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate) | |
631 | 641 | let supply = getActualAmount(outdatedTotalSupply, sRate) | |
632 | 642 | let borrow = getActualAmount(outdatedTotalBorrow, bRate) | |
633 | 643 | let ur = getActualUr(supply, borrow) | |
634 | 644 | let supplyApy = getSupplyApy(rate, ur) | |
635 | 645 | let borrowApy = getBorrowApy(rate) | |
636 | 646 | let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate) | |
637 | 647 | let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price) | |
638 | 648 | let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate) | |
639 | 649 | let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price) | |
640 | 650 | let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8) | |
641 | 651 | let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt) | |
642 | 652 | let walletDailyIncome = getDailyPercents(supplyApy, walletSupply) | |
643 | 653 | let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price) | |
644 | 654 | let walletDailyLoanInterest = getDailyPercents(borrowApy, walletBorrow) | |
645 | 655 | let walletDailyLoanInterestInUsd = getInUsd(walletDailyLoanInterest, assetScale, price) | |
646 | 656 | let walletMarginInUsd = (fraction(walletSupplyInUsd, supplyApy, Scale8) - fraction(walletBorrowInUsd, borrowApy, Scale8)) | |
647 | 657 | $Tuple7((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd), (accum._5 + walletDailyIncomeInUsd), (accum._6 + walletDailyLoanInterestInUsd), (accum._7 + walletMarginInUsd)) | |
648 | 658 | } | |
649 | 659 | ||
650 | - | let $ | |
660 | + | let $t03211332468 = { | |
651 | 661 | let $l = arr12 | |
652 | 662 | let $s = size($l) | |
653 | 663 | let $acc0 = $Tuple7(0, 0, 0, 0, 0, 0, 0) | |
654 | 664 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
655 | 665 | then $a | |
656 | 666 | else marketAssetsFold($a, $l[$i]) | |
657 | 667 | ||
658 | 668 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
659 | 669 | then $a | |
660 | 670 | else throw("List size exceeds 12") | |
661 | 671 | ||
662 | 672 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
663 | 673 | } | |
664 | - | let totalWalletSupplyInUsd = $ | |
665 | - | let totalWalletBorrowInUsd = $ | |
666 | - | let totalWalletBorrowLimitInUsd = $ | |
667 | - | let totalWalletBorrowUsageInUsd = $ | |
668 | - | let totalWalletDailyIncomeInUsd = $ | |
669 | - | let totalWalletDailyLoanInterestInUsd = $ | |
670 | - | let totalWalletMarginInUsd = $ | |
674 | + | let totalWalletSupplyInUsd = $t03211332468._1 | |
675 | + | let totalWalletBorrowInUsd = $t03211332468._2 | |
676 | + | let totalWalletBorrowLimitInUsd = $t03211332468._3 | |
677 | + | let totalWalletBorrowUsageInUsd = $t03211332468._4 | |
678 | + | let totalWalletDailyIncomeInUsd = $t03211332468._5 | |
679 | + | let totalWalletDailyLoanInterestInUsd = $t03211332468._6 | |
680 | + | let totalWalletMarginInUsd = $t03211332468._7 | |
671 | 681 | let totalWalletBadDebtInUsd = if ((totalWalletBorrowInUsd > totalWalletSupplyInUsd)) | |
672 | 682 | then (totalWalletBorrowInUsd - totalWalletSupplyInUsd) | |
673 | 683 | else 0 | |
674 | 684 | let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd) | |
675 | 685 | let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd) | |
676 | 686 | let marketsJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + "}") | |
677 | 687 | func walletAssetsFold (accum,next) = if ((next >= currentAssetsCount)) | |
678 | 688 | then accum | |
679 | 689 | else { | |
680 | 690 | let assetIdStr = currentSetupTokens[next] | |
681 | 691 | let price = getTokenPrice(marketAddress, assetIdStr) | |
682 | 692 | let assetScale = getAssetScale(assetIdStr) | |
683 | 693 | let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr) | |
684 | 694 | let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr) | |
685 | 695 | let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr) | |
686 | 696 | let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr) | |
687 | 697 | let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate) | |
688 | 698 | let rate = getRate(outdatedUr, assetIdStr, marketStr) | |
689 | 699 | let interest = getInterest(rate) | |
690 | 700 | let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate) | |
691 | 701 | let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate) | |
692 | 702 | let supply = getActualAmount(outdatedTotalSupply, sRate) | |
693 | 703 | let borrow = getActualAmount(outdatedTotalBorrow, bRate) | |
694 | 704 | let ur = getActualUr(supply, borrow) | |
695 | 705 | let supplyApy = getSupplyApy(rate, ur) | |
696 | 706 | let borrowApy = getBorrowApy(rate) | |
697 | 707 | let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate) | |
698 | 708 | let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price) | |
699 | 709 | let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate) | |
700 | 710 | let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price) | |
701 | 711 | let walletDailyIncome = getDailyPercents(supplyApy, walletSupply) | |
702 | 712 | let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price) | |
703 | 713 | let walletDailyLoanInterest = getDailyPercents(borrowApy, walletBorrow) | |
704 | 714 | let walletDailyLoanInterestInUsd = getInUsd(walletDailyLoanInterest, assetScale, price) | |
705 | 715 | let supplyAssetsJson = ((((((((((((("{" + "\"amount\":") + assetToJson(assetIdStr, walletSupply)) + ",\"amountInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"apy\":") + amountToDecimal(supplyApy, 8)) + ",\"dailyPercents\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"dailyPercentsInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + "}") | |
706 | 716 | let borrowAssetsJson = ((((((((((((("{" + "\"amount\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"amountInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"apy\":") + amountToDecimal(borrowApy, 8)) + ",\"dailyPercents\":") + assetToJson(assetIdStr, walletDailyLoanInterest)) + ",\"dailyPercentsInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + "}") | |
707 | 717 | $Tuple2((accum._1 :+ supplyAssetsJson), (accum._2 :+ borrowAssetsJson)) | |
708 | 718 | } | |
709 | 719 | ||
710 | - | let $ | |
720 | + | let $t03687036956 = { | |
711 | 721 | let $l = arr12 | |
712 | 722 | let $s = size($l) | |
713 | 723 | let $acc0 = $Tuple2(nil, nil) | |
714 | 724 | func $f1_1 ($a,$i) = if (($i >= $s)) | |
715 | 725 | then $a | |
716 | 726 | else walletAssetsFold($a, $l[$i]) | |
717 | 727 | ||
718 | 728 | func $f1_2 ($a,$i) = if (($i >= $s)) | |
719 | 729 | then $a | |
720 | 730 | else throw("List size exceeds 12") | |
721 | 731 | ||
722 | 732 | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
723 | 733 | } | |
724 | - | let supplyAssetsJson = $ | |
725 | - | let borrowAssetsJson = $ | |
734 | + | let supplyAssetsJson = $t03687036956._1 | |
735 | + | let borrowAssetsJson = $t03687036956._2 | |
726 | 736 | if ((marketIndex == next)) | |
727 | 737 | then $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletBadDebtInUsd, totalWalletDailyIncomeInUsd, totalWalletDailyLoanInterestInUsd, accountHealth, netApy, (accum._13 :+ marketsJson), supplyAssetsJson, borrowAssetsJson) | |
728 | 738 | else $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), accum._6, accum._7, accum._8, accum._9, accum._10, accum._11, accum._12, (accum._13 :+ marketsJson), accum._14, accum._15) | |
729 | 739 | } | |
730 | 740 | ||
731 | - | let $ | |
741 | + | let $t03841338897 = { | |
732 | 742 | let $l = arr12 | |
733 | 743 | let $s = size($l) | |
734 | 744 | let $acc0 = $Tuple15(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil) | |
735 | 745 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
736 | 746 | then $a | |
737 | 747 | else marketsFold($a, $l[$i]) | |
738 | 748 | ||
739 | 749 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
740 | 750 | then $a | |
741 | 751 | else throw("List size exceeds 12") | |
742 | 752 | ||
743 | 753 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
744 | 754 | } | |
745 | - | let totalWalletSupplyInUsd = $ | |
746 | - | let totalWalletBorrowInUsd = $ | |
747 | - | let totalWalletBadDebtInUsd = $ | |
748 | - | let totalWalletDailyIncomeInUsd = $ | |
749 | - | let totalWalletDailyLoanInterestInUsd = $ | |
750 | - | let walletSupplyInUsd = $ | |
751 | - | let walletBorrowInUsd = $ | |
752 | - | let walletBadDebtInUsd = $ | |
753 | - | let walletDailyIncomeInUsd = $ | |
754 | - | let walletDailyLoanInterestInUsd = $ | |
755 | - | let walletAccountHealth = $ | |
756 | - | let walletNetApy = $ | |
757 | - | let marketsJson = $ | |
758 | - | let supplyAssetsJson = $ | |
759 | - | let borrowAssetsJson = $ | |
755 | + | let totalWalletSupplyInUsd = $t03841338897._1 | |
756 | + | let totalWalletBorrowInUsd = $t03841338897._2 | |
757 | + | let totalWalletBadDebtInUsd = $t03841338897._3 | |
758 | + | let totalWalletDailyIncomeInUsd = $t03841338897._4 | |
759 | + | let totalWalletDailyLoanInterestInUsd = $t03841338897._5 | |
760 | + | let walletSupplyInUsd = $t03841338897._6 | |
761 | + | let walletBorrowInUsd = $t03841338897._7 | |
762 | + | let walletBadDebtInUsd = $t03841338897._8 | |
763 | + | let walletDailyIncomeInUsd = $t03841338897._9 | |
764 | + | let walletDailyLoanInterestInUsd = $t03841338897._10 | |
765 | + | let walletAccountHealth = $t03841338897._11 | |
766 | + | let walletNetApy = $t03841338897._12 | |
767 | + | let marketsJson = $t03841338897._13 | |
768 | + | let supplyAssetsJson = $t03841338897._14 | |
769 | + | let borrowAssetsJson = $t03841338897._15 | |
760 | 770 | let json = ((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"name\":\"") + marketName) + "\"") + ",\"totalSupplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"totalBorrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"totalBadDebtInUsd\":") + assetToJson(usdtIdStr, totalWalletBadDebtInUsd)) + ",\"totalDailyIncomeInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyIncomeInUsd)) + ",\"totalDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyLoanInterestInUsd)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"badDebtInUsd\":") + assetToJson(usdtIdStr, walletBadDebtInUsd)) + ",\"dailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"dailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + ",\"accountHealth\":") + amountToDecimal(walletAccountHealth, 8)) + ",\"netApy\":") + amountToDecimal(walletNetApy, 8)) + ",\"supplyAssets\":[") + makeString_11C(supplyAssetsJson, ",")) + "]") + ",\"borrowAssets\":[") + makeString_11C(borrowAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}") | |
761 | 771 | if (debug) | |
762 | 772 | then throw(json) | |
763 | 773 | else json | |
764 | 774 | } | |
765 | 775 | ||
766 | 776 | ||
767 | 777 | func getWalletOperationsJson (marketIndex,assetIdStr,wallet,debug) = { | |
768 | 778 | let marketStr = getStringValue(("market_" + toString(marketIndex))) | |
769 | 779 | let marketAddress = addressFromStringValue(marketStr) | |
770 | 780 | let marketName = getStringValue(("market_name_" + marketStr)) | |
771 | 781 | let active = valueOrElse(getBoolean(marketAddress, "setup_active"), true) | |
772 | 782 | let setupTokens = getSetupTokens(marketAddress) | |
773 | 783 | let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",") | |
774 | 784 | let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",") | |
775 | 785 | let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",") | |
776 | 786 | let assetIndex = getAssetIndex(setupTokens, assetIdStr) | |
777 | 787 | let cf = parseIntValue(setupCf[assetIndex]) | |
778 | 788 | let lt = parseIntValue(setupLt[assetIndex]) | |
779 | 789 | let penalty = parseIntValue(setupPenalty[assetIndex]) | |
780 | 790 | let assetsCount = size(setupTokens) | |
781 | 791 | let lastRateHeight = getLastRateHeight(marketAddress) | |
782 | 792 | let price = getTokenPrice(marketAddress, assetIdStr) | |
783 | 793 | let assetScale = getAssetScale(assetIdStr) | |
784 | 794 | let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr) | |
785 | 795 | let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr) | |
786 | 796 | let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr) | |
787 | 797 | let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr) | |
788 | 798 | let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate) | |
789 | 799 | let rate = getRate(outdatedUr, assetIdStr, marketStr) | |
790 | 800 | let interest = getInterest(rate) | |
791 | 801 | let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate) | |
792 | 802 | let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate) | |
793 | 803 | let supply = getActualAmount(outdatedTotalSupply, sRate) | |
794 | 804 | let borrow = getActualAmount(outdatedTotalBorrow, bRate) | |
795 | 805 | let supplyInUsd = getInUsd(supply, assetScale, price) | |
796 | 806 | let borrowInUsd = getInUsd(borrow, assetScale, price) | |
797 | 807 | let reserves = (supply - borrow) | |
798 | 808 | let reservesInUsd = getInUsd(reserves, assetScale, price) | |
799 | 809 | let ur = getActualUr(supply, borrow) | |
800 | 810 | let supplyApy = getSupplyApy(rate, ur) | |
801 | 811 | let borrowApy = getBorrowApy(rate) | |
802 | 812 | let maxSupply = getMaxSupply(marketAddress, assetIdStr) | |
803 | 813 | let walletSupply = getWalletSupply(marketAddress, assetIdStr, wallet, sRate) | |
804 | 814 | let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price) | |
805 | 815 | let walletDailyIncome = getDailyPercents(supplyApy, walletSupply) | |
806 | 816 | let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price) | |
807 | 817 | let walletBorrow = getWalletBorrow(marketAddress, assetIdStr, wallet, bRate) | |
808 | 818 | let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price) | |
809 | 819 | let walletDailyLoanPercents = getDailyPercents(borrowApy, walletBorrow) | |
810 | 820 | let walletDailyLoanPercentsInUsd = getInUsd(walletDailyLoanPercents, assetScale, price) | |
811 | 821 | func assetsFold (accum,next) = if ((next >= assetsCount)) | |
812 | 822 | then accum | |
813 | 823 | else { | |
814 | 824 | let currentAssetIdStr = setupTokens[next] | |
815 | 825 | let currentCf = parseIntValue(setupCf[next]) | |
816 | 826 | let currentLt = parseIntValue(setupLt[next]) | |
817 | 827 | let currentPrice = getTokenPrice(marketAddress, currentAssetIdStr) | |
818 | 828 | let currentAssetScale = getAssetScale(currentAssetIdStr) | |
819 | 829 | let currentOutdatedTotalSupply = getOutdatedTotalSupply(marketAddress, currentAssetIdStr) | |
820 | 830 | let currentOutdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, currentAssetIdStr) | |
821 | 831 | let currentOutdatedSRate = getOutdatedSRate(marketAddress, currentAssetIdStr) | |
822 | 832 | let currentOutdatedBRate = getOutdatedBRate(marketAddress, currentAssetIdStr) | |
823 | 833 | let currentOutdatedUr = getOutdatedUr(currentOutdatedTotalSupply, currentOutdatedTotalBorrow, currentOutdatedSRate, currentOutdatedBRate) | |
824 | 834 | let currentRate = getRate(currentOutdatedUr, currentAssetIdStr, marketStr) | |
825 | 835 | let currentInterest = getInterest(currentRate) | |
826 | 836 | let currentSRate = getActualSRate(lastRateHeight, currentInterest, currentOutdatedUr, currentOutdatedSRate) | |
827 | 837 | let currentBRate = getActualBRate(lastRateHeight, currentInterest, currentOutdatedBRate) | |
828 | 838 | let currentSupply = getActualAmount(currentOutdatedTotalSupply, sRate) | |
829 | 839 | let currentBorrow = getActualAmount(currentOutdatedTotalBorrow, bRate) | |
830 | 840 | let currentUr = getActualUr(currentSupply, currentBorrow) | |
831 | 841 | let currentSupplyApy = getSupplyApy(currentRate, currentUr) | |
832 | 842 | let currentBorrowApy = getBorrowApy(currentRate) | |
833 | 843 | let currentWalletSupply = getWalletSupply(marketAddress, currentAssetIdStr, wallet, currentSRate) | |
834 | 844 | let currentWalletSupplyInUsd = getInUsd(currentWalletSupply, currentAssetScale, currentPrice) | |
835 | 845 | let currentWalletBorrow = getWalletBorrow(marketAddress, currentAssetIdStr, wallet, currentBRate) | |
836 | 846 | let currentWalletBorrowInUsd = getInUsd(currentWalletBorrow, currentAssetScale, currentPrice) | |
837 | 847 | let currentWalletBorrowLimitInUsd = fraction(currentWalletSupplyInUsd, currentCf, Scale8) | |
838 | 848 | let currentWalletBorrowUsageInUsd = fraction(currentWalletBorrowInUsd, Scale8, currentLt) | |
839 | 849 | let walletMarginInUsd = (fraction(currentWalletSupplyInUsd, currentSupplyApy, Scale8) - fraction(currentWalletBorrowInUsd, currentBorrowApy, Scale8)) | |
840 | 850 | $Tuple5((accum._1 + currentWalletSupplyInUsd), (accum._2 + currentWalletBorrowInUsd), (accum._3 + currentWalletBorrowLimitInUsd), (accum._4 + currentWalletBorrowUsageInUsd), (accum._5 + walletMarginInUsd)) | |
841 | 851 | } | |
842 | 852 | ||
843 | - | let $ | |
853 | + | let $t04589946080 = { | |
844 | 854 | let $l = arr12 | |
845 | 855 | let $s = size($l) | |
846 | 856 | let $acc0 = $Tuple5(0, 0, 0, 0, 0) | |
847 | 857 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
848 | 858 | then $a | |
849 | 859 | else assetsFold($a, $l[$i]) | |
850 | 860 | ||
851 | 861 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
852 | 862 | then $a | |
853 | 863 | else throw("List size exceeds 12") | |
854 | 864 | ||
855 | 865 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
856 | 866 | } | |
857 | - | let totalWalletSupplyInUsd = $ | |
858 | - | let totalWalletBorrowInUsd = $ | |
859 | - | let totalWalletBorrowLimitInUsd = $ | |
860 | - | let totalWalletBorrowUsageInUsd = $ | |
861 | - | let totalWalletMarginInUsd = $ | |
867 | + | let totalWalletSupplyInUsd = $t04589946080._1 | |
868 | + | let totalWalletBorrowInUsd = $t04589946080._2 | |
869 | + | let totalWalletBorrowLimitInUsd = $t04589946080._3 | |
870 | + | let totalWalletBorrowUsageInUsd = $t04589946080._4 | |
871 | + | let totalWalletMarginInUsd = $t04589946080._5 | |
862 | 872 | let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd) | |
863 | 873 | let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd) | |
864 | 874 | let json = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"marketName\":\"") + marketName) + "\"") + ",\"address\":\"") + marketStr) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, price)) + ",\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, 8)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, 8)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"utilizationRatio\":") + amountToDecimal(ur, 8)) + ",\"collateralFactor\":") + amountToDecimal(cf, 8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, 8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, 8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"walletSupply\":") + assetToJson(assetIdStr, walletSupply)) + ",\"walletSupplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"walletDailyIncome\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"walletDailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"walletBorrow\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"walletBorrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"walletDailyLoanInterest\":") + assetToJson(assetIdStr, walletDailyLoanPercents)) + ",\"walletDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanPercentsInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + ",\"netApy\":") + amountToDecimal(netApy, 8)) + "}") | |
865 | 875 | if (debug) | |
866 | 876 | then throw(json) | |
867 | 877 | else json | |
868 | 878 | } | |
869 | 879 | ||
870 | 880 | ||
871 | 881 | func getMarketParametersJson (marketIndex,debug) = { | |
872 | 882 | let marketStr = getStringValue(("market_" + toString(marketIndex))) | |
873 | 883 | let marketAddress = addressFromStringValue(marketStr) | |
874 | 884 | let marketName = getStringValue(("market_name_" + marketStr)) | |
875 | 885 | let setupTokens = getSetupTokens(marketAddress) | |
876 | 886 | let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",") | |
877 | 887 | let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",") | |
878 | 888 | let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",") | |
879 | 889 | let assetsCount = size(setupTokens) | |
880 | 890 | func assetsFold (accum,next) = if ((next >= assetsCount)) | |
881 | 891 | then accum | |
882 | 892 | else { | |
883 | 893 | let assetIdStr = setupTokens[next] | |
884 | 894 | let maxSupply = getMaxSupply(marketAddress, assetIdStr) | |
885 | 895 | let cf = parseIntValue(setupCf[next]) | |
886 | 896 | let lt = parseIntValue(setupLt[next]) | |
887 | 897 | let penalty = parseIntValue(setupPenalty[next]) | |
888 | 898 | let json = ((((((((((("{" + "\"asset\":") + assetToJson(assetIdStr, 0)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"collateralFactor\":") + amountToDecimal(cf, 8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, 8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, 8)) + "}") | |
889 | 899 | (accum :+ json) | |
890 | 900 | } | |
891 | 901 | ||
892 | 902 | let assetsJson = { | |
893 | 903 | let $l = arr12 | |
894 | 904 | let $s = size($l) | |
895 | 905 | let $acc0 = nil | |
896 | 906 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
897 | 907 | then $a | |
898 | 908 | else assetsFold($a, $l[$i]) | |
899 | 909 | ||
900 | 910 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
901 | 911 | then $a | |
902 | 912 | else throw("List size exceeds 12") | |
903 | 913 | ||
904 | 914 | $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12) | |
905 | 915 | } | |
906 | 916 | let json = ((((((("{" + "\"name\":\"") + marketName) + "\"") + ",\"assets\":[") + makeString_11C(assetsJson, ",")) + "]") + "}") | |
907 | 917 | if (debug) | |
908 | 918 | then throw(json) | |
909 | 919 | else json | |
910 | 920 | } | |
911 | 921 | ||
912 | 922 | ||
913 | 923 |
github/deemru/w8io/3ef1775 128.77 ms ◑