tx · D5fR9GKAFo54kJi9S7gKH27SmohD7tgNEpmujjBqCHFk

3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS:  -0.32000000 Waves

2023.04.20 10:51 [2542595] smart account 3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS > SELF 0.00000000 Waves

{ "type": 13, "id": "D5fR9GKAFo54kJi9S7gKH27SmohD7tgNEpmujjBqCHFk", "fee": 32000000, "feeAssetId": null, "timestamp": 1681977121046, "version": 2, "chainId": 84, "sender": "3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS", "senderPublicKey": "HP8sssVq1866F7CaPQJwgFrt6fsqhQjKwM84cL1wjD2a", "proofs": [ "3a8iEqFs3EmU1Uy3TfHxNgGcpWKCtx7YQcb16U8Cq3onPfgT1tg4dowveutthtnLK55YkSjbo45wRPvHhNfYN1DR" ], "script": "base64:BgJlCAISAwoBCBIDCgEIEgUKAwgBCBIDCgEIEgUKAwgBCBIDCgEIEgQKAggBEgMKAQgSDgoMCAgIAQQRGBgRAQEYEgoKCAgICAEECAEYEg4KDAgICAEEGBgYGBgBGBIICgYICAEBAQFJAAdTRl9QT09MAgJTRgAHV1hfUE9PTAICV1gAD0NBUF9GRUVfTk9fTE9BTgIJY2FwTm9Mb2FuAAxDQVBfRkVFX0xPQU4CB2NhcExvYW4ACExPQU5fRkVFAgRsb2FuAAtOT19MT0FOX0ZFRQIGbm9Mb2FuAAZTQ0FMRTgAgMLXLwAHU0NBTEUxMACAyK+gJQAKRkVFX1NDQUxFNgDAhD0AFGtTRlBvb2xBQXNzZXRCYWxhbmNlAg9BX2Fzc2V0X2JhbGFuY2UAFGtTRlBvb2xCQXNzZXRCYWxhbmNlAg9CX2Fzc2V0X2JhbGFuY2UAD2tTRlBvb2xBQXNzZXRJZAIKQV9hc3NldF9pZAAPa1NGUG9vbEJBc3NldElkAgpCX2Fzc2V0X2lkAA5rU0ZQb29sU2hhcmVJZAIOc2hhcmVfYXNzZXRfaWQACmtTRlBvb2xGZWUCCmNvbW1pc3Npb24ADWtVc2VyUG9zaXRpb24CDl91c2VyX3Bvc2l0aW9uABFrVXNlckJvcnJvd0Ftb3VudAIcX3VzZXJfcG9zaXRpb25fYm9ycm93X2Ftb3VudAASa1VzZXJCb3Jyb3dBc3NldElkAh5fdXNlcl9wb3NpdGlvbl9ib3Jyb3dfYXNzZXRfaWQAEGtVc2VyUG9zaXRpb25OdW0CFV91c2VyX3Bvc2l0aW9uX251bWJlcgAVa1VzZXJQb3NpdGlvbkludGVyZXN0AhdfdXNlcl9wb3NpdGlvbl9pbnRlcmVzdAAKa1Bvb2xUb3RhbAILX3Bvb2xfdG90YWwADmtQb29sVG90YWxMb2FuAhBfcG9vbF90b3RhbF9sb2FuAA1rUG9vbEludGVyZXN0Ag5fcG9vbF9pbnRlcmVzdAAVa0F4bHlJbkZlZVdpdGhvdXRMb2FuAhZfYXhseV9mZWVfd2l0aG91dF9sb2FuABJrQXhseUluRmVlV2l0aExvYW4CE19heGx5X2ZlZV93aXRoX2xvYW4AEWtBeGx5Tm9Mb2FuQ2FwRmVlAhdfYXhseV9mZWVfY2FwX3dpdGhfbG9hbgATa0F4bHlXaXRoTG9hbkNhcEZlZQIVX2F4bHlfZmVlX2NhcF9ub19sb2FuAAprUmVxdWVzdElkAgtfcmVxdWVzdF9pZAAMa1JlcXVlc3RJdGVyAg1yZXF1ZXN0c19pdGVyAAVrUG9vbAIFcG9vbF8ACmtTaGFyZVBvb2wCDl9wb29sX3NoYXJlX2lkAA5rUG9vbENhcENoYW5nZQIQX3Bvb2xfY2FwX2NoYW5nZQAJa01vbmV5Qm94Ag5heGx5X21vbmV5X2JveAAOa1NGRmFybWluZ0FkZHICE3N3b3BmaV9mYXJtaW5nX2FkZHIADGtMZW5kU2VydmljZQIRbGVuZF9zZXJ2aWNlX2FkZHIADGtQcmljZU9yYWNsZQIMcHJpY2Vfb3JhY2xlAAtrRXhDb250cmFjdAIRZXhjaGFuZ2VfY29udHJhY3QAD2tXeFN3YXBDb250cmFjdAIQd3hfc3dhcF9jb250cmFjdAAIbW9uZXlCb3gJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwULa0V4Q29udHJhY3QCHE5vIGV4Y2hhbmdlIGNvbnRyYWN0IGFkZHJlc3MAD3ByaWNlT3JhY2xlQWRkcgkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrUHJpY2VPcmFjbGUCF05vIHByaWNlIG9yYWNsZSBhZGRyZXNzAA53eFN3YXBDb250cmFjdAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGU1dPUElEASA0ARNWjmBG4n5bqbgBR4LnsQAmEpt25E5LoqB8nG3ugQAEV1hJRAEgxlIegU7qbuM8wJewDl8s8mrp7Z2yhtGaQnioYH0+G7EBCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBDWdldFNGUG9vbERhdGEBCHBvb2xBZGRyCQCXCgUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEFBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xCQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQUFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBiYWxhbmNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xCQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGJhbGFuY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUOa1NGUG9vbFNoYXJlSWQCGENhbid0IGdldCBzaGFyZSBhc3NldCBpZAENZ2V0V1hQb29sRGF0YQEIcG9vbEFkZHIEA2NmZwoAAUAJAPwHBAUIcG9vbEFkZHICHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQNjZmcFA2NmZwQDYUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAEAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAQDYklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAFAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAQHc2hhcmVJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcAAwMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGkNhbid0IGdldCBwb29sIExQIGFzc2V0IGlkBARiYWxBCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNhSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRiYWxBBQRiYWxBBARiYWxCCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNiSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRiYWxCBQRiYWxCCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAAIBAg9Xcm9uZyBwb29sIHR5cGUBEWdldFBvb2xUb3RhbFNoYXJlAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAAAARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4AAAEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAgRwb29sBHVzZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0AAAABAQpnZXRBeGx5RmVlAgRwb29sB2ZlZVR5cGUDCQAAAgUHZmVlVHlwZQUMQ0FQX0ZFRV9MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tBeGx5V2l0aExvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUPQ0FQX0ZFRV9OT19MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtBeGx5Tm9Mb2FuQ2FwRmVlAwkAAAIFB2ZlZVR5cGUFCExPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEmtBeGx5SW5GZWVXaXRoTG9hbgMJAAACBQdmZWVUeXBlBQtOT19MT0FOX0ZFRQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRVrQXhseUluRmVlV2l0aG91dExvYW4JAAIBAg5Xcm9uZyBmZWUgdHlwZQEQZ2V0U0ZGYXJtaW5nQWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUOa1NGRmFybWluZ0FkZHICHUNhbid0IGdldCBzd29wZmkgZmFybWluZyBhZGRyARBnZXRXWEZhcm1pbmdBZGRyAQhwb29sQWRkcgQJZkNvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyAhMlc19fZmFjdG9yeUNvbnRyYWN0AiJDYW4ndCBnZXQgV1ggZmFjdG9yeSBjb250cmFjdCBhZGRyBApmYWN0cm95Q2ZnCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlmQ29udHJhY3QCESVzX19mYWN0b3J5Q29uZmlnAhhDYW4ndCBnZXQgV1ggZmFjdG9yeSBjZmcCAl9fCQEHQWRkcmVzcwEJANkEAQkAkQMCBQpmYWN0cm95Q2ZnAAEBDmdldExlbmRTcnZBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrTGVuZFNlcnZpY2UCG0Nhbid0IGdldCBsZW5kIHNlcnZpY2UgYWRkcgEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECC01hdGNoIGVycm9yAQ5hc3NldElkRnJvbVN0cgEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARBnZXRBc3NldERlY2ltYWxzAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTAAgEByRtYXRjaDAJAOwHAQkA2QQBBQdhc3NldElkAwkAAQIFByRtYXRjaDACBUFzc2V0BAVhc3NldAUHJG1hdGNoMAgFBWFzc2V0CGRlY2ltYWxzCQACAQIQQ2FuJ3QgZmluZCBhc3NldAEPcmVwbGVuaXNoU3dvcEZpCQRwb29sB2ZlZVR5cGUEcG10QQlwbXRBc3NldEEEcG10QglwbXRBc3NldEIEYmFsQQRiYWxCB3NoYXJlSWQEEnNoYXJlQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQdzaGFyZUlkAwkAAAIFEnNoYXJlQmFsYW5jZUJlZm9yZQUSc2hhcmVCYWxhbmNlQmVmb3JlBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBnJhdGlvQQkAawMFBlNDQUxFOAUEcG10QQUEYmFsQQQGcmF0aW9CCQBrAwUGU0NBTEU4BQRwbXRCBQRiYWxCBAskdDA3MTM1NzQyNwMJAGYCBQZyYXRpb0IFBnJhdGlvQQQDcG10CQBuBAUEYmFsQgUGcmF0aW9BBQZTQ0FMRTgFB0NFSUxJTkcJAJYKBAUEcG10QQUDcG10CQBlAgUEcG10QgUDcG10BQlwbXRBc3NldEIEA3BtdAkAbgQFBGJhbEEFBnJhdGlvQgUGU0NBTEU4BQdDRUlMSU5HCQCWCgQFA3BtdAUEcG10QgkAZQIFBHBtdEEFA3BtdAUJcG10QXNzZXRBBApwbXRBbW91bnRBCAULJHQwNzEzNTc0MjcCXzEECnBtdEFtb3VudEIIBQskdDA3MTM1NzQyNwJfMgQGY2hhbmdlCAULJHQwNzEzNTc0MjcCXzMEDWNoYW5nZUFzc2V0SWQIBQskdDA3MTM1NzQyNwJfNAQEaW52MQMDCQBmAgUKcG10QW1vdW50QQAACQBmAgUKcG10QW1vdW50QgAABwQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCXBtdEFzc2V0QQUKcG10QW1vdW50QQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUJcG10QXNzZXRCBQpwbXRBbW91bnRCBQNuaWwJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQDMCAIJAMwIAgIFZmFsc2UJAMwIAgIBMAUDbmlsBQNuaWwFCHBheW1lbnRzAAADCQAAAgUEaW52MQUEaW52MQQEaW52MgMJAGYCBQZjaGFuZ2UAAAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFDWNoYW5nZUFzc2V0SWQFBmNoYW5nZQUDbmlsBAR2YXJzCQDMCAICATAJAMwIAgIFZmFsc2UJAMwIAgIBMAUDbmlsCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIVcmVwbGVuaXNoV2l0aE9uZVRva2VuCQDMCAIFBHZhcnMFA25pbAUIcGF5bWVudHMAAAMJAAACBQRpbnYyBQRpbnYyBBFzaGFyZUJhbGFuY2VBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQdzaGFyZUlkBAt0b3RhbFN0YWtlZAkAZQIFEXNoYXJlQmFsYW5jZUFmdGVyBRJzaGFyZUJhbGFuY2VCZWZvcmUEDWF4bHlGZWVBbW91bnQJAGsDBQt0b3RhbFN0YWtlZAkBCmdldEF4bHlGZWUCBQRwb29sBQdmZWVUeXBlBQpGRUVfU0NBTEU2BBF1c2VyU2hhcmVGb3JTdGFrZQkAZQIFC3RvdGFsU3Rha2VkBQ1heGx5RmVlQW1vdW50AwkAZwIAAAURdXNlclNoYXJlRm9yU3Rha2UJAAIBAihhbW91bnQgb2Ygc3Rha2VkIHNoYXJldG9rZW5zIG11c3QgYmUgPiAwBARpbnYzCQD8BwQJARBnZXRTRkZhcm1pbmdBZGRyAAIPbG9ja1NoYXJlVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgAABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHc2hhcmVJZAURdXNlclNoYXJlRm9yU3Rha2UFA25pbAMJAAACBQRpbnYzBQRpbnYzCQCUCgIFEXVzZXJTaGFyZUZvclN0YWtlBQ1heGx5RmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtyZXBsZW5pc2hXWAcEcG9vbAdmZWVUeXBlBHBtdEEJcG10QXNzZXRBBHBtdEIJcG10QXNzZXRCB3NoYXJlSWQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQLJHQwODg3ODk3MjcDAwkAZgIFBHBtdEEAAAkAZgIFBHBtdEIAAAcECmV2YWxQdXRJbkEJALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICIGV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZCQDMCAIFBHBtdEEFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18DCQAAAgUKZXZhbFB1dEluQQUKZXZhbFB1dEluQQQKZXZhbFB1dEluQgkAtQkCCgABQAkA/AcEBQhwb29sQWRkcgIfZXZhbHVhdGVQdXRCeVByaWNlQXNzZXRSRUFET05MWQkAzAgCBQRwbXRCBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fAwkAAAIFCmV2YWxQdXRJbkIFCmV2YWxQdXRJbkIEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEBnBtdEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlgoEBQRwbXRBBQZwbXRJbkIJAGUCBQRwbXRCBQZwbXRJbkIFCXBtdEFzc2V0QgQGcG10SW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQgAHCQCWCgQFBnBtdEluQQUEcG10QgkAZQIFBHBtdEEFBnBtdEluQQUJcG10QXNzZXRBCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAZgIFBHBtdEEAAAkAlgoEBQRwbXRBBQRwbXRCBQRwbXRBBQlwbXRBc3NldEEDCQBmAgUEcG10QgAACQCWCgQFBHBtdEEFBHBtdEIFBHBtdEIFCXBtdEFzc2V0QgkAAgECEHBtdHMgbXVzdCBiZSA+IDAECnBtdEFtb3VudEEIBQskdDA4ODc4OTcyNwJfMQQKcG10QW1vdW50QggFCyR0MDg4Nzg5NzI3Al8yBAZjaGFuZ2UIBQskdDA4ODc4OTcyNwJfMwQNY2hhbmdlQXNzZXRJZAgFCyR0MDg4Nzg5NzI3Al80BBJzaGFyZUJhbGFuY2VCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUHc2hhcmVJZAMJAAACBRJzaGFyZUJhbGFuY2VCZWZvcmUFEnNoYXJlQmFsYW5jZUJlZm9yZQQEaW52MQMDCQBmAgUKcG10QW1vdW50QQAACQBmAgUKcG10QW1vdW50QgAABwQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCXBtdEFzc2V0QQUKcG10QW1vdW50QQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUJcG10QXNzZXRCBQpwbXRBbW91bnRCBQNuaWwJAPwHBAUIcG9vbEFkZHICA3B1dAkAzAgCAMCEPQkAzAgCBwUDbmlsBQhwYXltZW50cwAAAwkAAAIFBGludjEFBGludjEEBGludjIDCQBmAgUGY2hhbmdlAAAECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQ1jaGFuZ2VBc3NldElkBQZjaGFuZ2UFA25pbAkA/AcEBQhwb29sQWRkcgIJcHV0T25lVGtuCQDMCAIAAAkAzAgCBwUDbmlsBQhwYXltZW50cwAAAwkAAAIFBGludjIFBGludjIEEXNoYXJlQmFsYW5jZUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFB3NoYXJlSWQEC3RvdGFsU3Rha2VkCQBlAgURc2hhcmVCYWxhbmNlQWZ0ZXIFEnNoYXJlQmFsYW5jZUJlZm9yZQQNYXhseUZlZUFtb3VudAkAawMFC3RvdGFsU3Rha2VkCQEKZ2V0QXhseUZlZQIFBHBvb2wFB2ZlZVR5cGUFCkZFRV9TQ0FMRTYEEXVzZXJTaGFyZUZvclN0YWtlCQBlAgULdG90YWxTdGFrZWQFDWF4bHlGZWVBbW91bnQDCQBnAgAABRF1c2VyU2hhcmVGb3JTdGFrZQkAAgECKGFtb3VudCBvZiBzdGFrZWQgc2hhcmV0b2tlbnMgbXVzdCBiZSA+IDAEBGludjMJAPwHBAkBEGdldFdYRmFybWluZ0FkZHIBBQhwb29sQWRkcgIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQdzaGFyZUlkBRF1c2VyU2hhcmVGb3JTdGFrZQUDbmlsAwkAAAIFBGludjMFBGludjMJAJQKAgURdXNlclNoYXJlRm9yU3Rha2UFDWF4bHlGZWVBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD3JlcGxlbmlzaEJ5VHlwZQoEdHlwZQRwb29sB2ZlZVR5cGUEcG10QQNBSWQEcG10QgNCSWQEYmFsQQRiYWxCB3NoYXJlSWQDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBD3JlcGxlbmlzaFN3b3BGaQkFBHBvb2wFCExPQU5fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAMJAAACBQR0eXBlBQdXWF9QT09MCQELcmVwbGVuaXNoV1gHBQRwb29sBQhMT0FOX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFB3NoYXJlSWQJAAIBAg9Xcm9uZyBwb29sIHR5cGUBEHJlcGxlbmlzaEVudHJpZXMHBHBvb2wEdXNlcgxzdGFrZWRBbW91bnQNYXhseUZlZUFtb3VudAZwb3NOdW0Hc2hhcmVJZAR0eXBlBAt0b3RhbEFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQPdG90YWxBbW91bnRMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wED2N1clBvb2xJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBQ1rUG9vbEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCBQt0b3RhbEFtb3VudAUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBkAgUPdG90YWxBbW91bnRMb2FuBQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUNa1VzZXJQb3NpdGlvbgUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FFWtVc2VyUG9zaXRpb25JbnRlcmVzdAUPY3VyUG9vbEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRBrVXNlclBvc2l0aW9uTnVtBQZwb3NOdW0JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDWF4bHlGZWVBbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsAQtjbGFpbUZhcm1lZAIEdHlwZQRwb29sAwkAAAIFBHR5cGUFB1NGX1BPT0wECWJhbEJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAgVjbGFpbQkAzAgCBQRwb29sBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFBlNXT1BJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUGU1dPUElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBHR5cGUFB1dYX1BPT0wECWJhbEJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAMJAAACBQliYWxCZWZvcmUFCWJhbEJlZm9yZQQDaW52CQD8BwQJARBnZXRXWEZhcm1pbmdBZGRyAQkBB0FkZHJlc3MBCQDZBAEFBHBvb2wCB2NsYWltV1gJAMwIAgUEcG9vbAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQRXWElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQRXWElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIPV3JvbmcgcG9vbCB0eXBlAQ5leGNoYW5nZUtlZXBlcgoHdG9Ub2tlbglwbXRBbW91bnQIcG10QXNzZXQJYW1vdW50c0luCWFkZHJlc3Nlcw9hc3NldHNUb1JlY2VpdmULZXN0UmVjZWl2ZWQRc2xpcHBhZ2VUb2xlcmFuY2ULbWluUmVjZWl2ZWQHb3B0aW9ucwQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b1Rva2VuAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANpbnYJAPwHBAUKZXhDb250cmFjdAIEc3dhcAkAzAgCBQlhbW91bnRzSW4JAMwIAgUJYWRkcmVzc2VzCQDMCAIFD2Fzc2V0c1RvUmVjZWl2ZQkAzAgCBQtlc3RSZWNlaXZlZAkAzAgCBRFzbGlwcGFnZVRvbGVyYW5jZQkAzAgCBQttaW5SZWNlaXZlZAkAzAgCBQdvcHRpb25zBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCHBtdEFzc2V0BQlwbXRBbW91bnQFA25pbAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3RvVG9rZW4FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEOZXhjaGFuZ2VQYXp6bGUGB3RvVG9rZW4JcG10QW1vdW50CHBtdEFzc2V0CXJvdXRlc1N0cgxtaW5Ub1JlY2VpdmUHb3B0aW9ucwQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b1Rva2VuAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANpbnYJAPwHBAUKZXhDb250cmFjdAIKcHV6emxlU3dhcAkAzAgCBQlyb3V0ZXNTdHIJAMwIAgUMbWluVG9SZWNlaXZlCQDMCAIFB29wdGlvbnMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIcG10QXNzZXQFCXBtdEFtb3VudAUDbmlsAwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9Ub2tlbgUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ5leGNoYW5nZVN3b3BGaQoHdG9Ub2tlbglwbXRBbW91bnQIcG10QXNzZXQKZXhjaGFuZ2Vycw5leGNoYW5nZXJzVHlwZQVhcmdzMQVhcmdzMhFyb3V0aW5nQXNzZXRzS2V5cxJtaW5BbW91bnRUb1JlY2VpdmUHb3B0aW9ucwQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b1Rva2VuAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANpbnYJAPwHBAUKZXhDb250cmFjdAIKc3dvcGZpU3dhcAkAzAgCBQpleGNoYW5nZXJzCQDMCAIFDmV4Y2hhbmdlcnNUeXBlCQDMCAIFBWFyZ3MxCQDMCAIFBWFyZ3MyCQDMCAIFEXJvdXRpbmdBc3NldHNLZXlzCQDMCAIFEm1pbkFtb3VudFRvUmVjZWl2ZQkAzAgCBQdvcHRpb25zBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCHBtdEFzc2V0BQlwbXRBbW91bnQFA25pbAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3RvVG9rZW4FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKY2FwaXRhbGl6ZQQEcG9vbAVwVHlwZQd0b2tlbklkC3Rva2VuQW1vdW50BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDE0NjkxMTQ3NzAJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwMTQ2OTExNDc3MAJfMQQDQklkCAUNJHQwMTQ2OTExNDc3MAJfMgQEYmFsQQgFDSR0MDE0NjkxMTQ3NzACXzMEBGJhbEIIBQ0kdDAxNDY5MTE0NzcwAl80BAdzaGFyZUlkCAUNJHQwMTQ2OTExNDc3MAJfNQQNJHQwMTQ3NzMxNDg1MwMJAAACBQd0b2tlbklkBQNBSWQJAJQKAgULdG9rZW5BbW91bnQAAAkAlAoCAAAFC3Rva2VuQW1vdW50BARwbXRBCAUNJHQwMTQ3NzMxNDg1MwJfMQQEcG10QggFDSR0MDE0NzczMTQ4NTMCXzIEDSR0MDE0ODU2MTQ5NzEJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAUMQ0FQX0ZFRV9MT0FOBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQMc3Rha2VkQW1vdW50CAUNJHQwMTQ4NTYxNDk3MQJfMQQHYXhseUZlZQgFDSR0MDE0ODU2MTQ5NzECXzIED2N1clBvb2xJbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDWtQb29sSW50ZXJlc3QAAAQQdG90YWxTaGFyZUFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQLbmV3SW50ZXJlc3QJAGQCBQ9jdXJQb29sSW50ZXJlc3QJAGsDBQxzdGFrZWRBbW91bnQFB1NDQUxFMTAFEHRvdGFsU2hhcmVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUNa1Bvb2xJbnRlcmVzdAULbmV3SW50ZXJlc3QJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFB2F4bHlGZWUJANkEAQUHc2hhcmVJZAUDbmlsARJleGNoYW5nZURpcmVjdGx5U0YHBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIEYmFsQQRiYWxCEGFtb3VudFRva2VuVG9HZXQPYXNzZXRUb2tlblRvR2V0BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wECWZlZVNjYWxlNgDAhD0EA2ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUIcG9vbEFkZHIFCmtTRlBvb2xGZWUEDGFtbnRHZXROb0ZlZQkAawMFEGFtb3VudFRva2VuVG9HZXQFCWZlZVNjYWxlNgkAZQIFCWZlZVNjYWxlNgUDZmVlBA0kdDAxNTY2NDE1OTUyAwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBrAwUEYmFsQQUMYW1udEdldE5vRmVlCQBlAgUEYmFsQgUMYW1udEdldE5vRmVlCQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQgQLYW1vdW50VG9QYXkJAGsDBQRiYWxCBQxhbW50R2V0Tm9GZWUJAGUCBQRiYWxBBQxhbW50R2V0Tm9GZWUJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE1NjY0MTU5NTICXzEECmFzc2V0VG9QYXkIBQ0kdDAxNTY2NDE1OTUyAl8yCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCAgExBQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAESZXhjaGFuZ2VEaXJlY3RseVdYBwRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwckZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUOd3hTd2FwQ29udHJhY3QCDyVzX19wcm90b2NvbEZlZQQEcEZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUOd3hTd2FwQ29udHJhY3QCCyVzX19wb29sRmVlBAhmZWVTY2FsZQkAtgIBAIDC1y8EDSR0MDE2NDMxMTY3MzkDCQAAAgUPYXNzZXRUb2tlblRvR2V0BQhhc3NldElkQQQLYW1vdW50VG9QYXkJAGsDBQRiYWxBBRBhbW91bnRUb2tlblRvR2V0CQBlAgUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEIEC2Ftb3VudFRvUGF5CQBrAwUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAkAZQIFBGJhbEEFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRBBAthbW91bnRUb1BheQgFDSR0MDE2NDMxMTY3MzkCXzEECmFzc2V0VG9QYXkIBQ0kdDAxNjQzMTE2NzM5Al8yBBJhbW91bnRUb1BheVdpdGhGZWUJAKADAQkAvAIDCQC2AgEFC2Ftb3VudFRvUGF5BQhmZWVTY2FsZQkAuAICBQhmZWVTY2FsZQkAtgIBCQBkAgUFcHJGZWUFBHBGZWUJAPwHBAUOd3hTd2FwQ29udHJhY3QCBHN3YXAJAMwIAgABCQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQUSYW1vdW50VG9QYXlXaXRoRmVlBQNuaWwBEGV4Y2hhbmdlRGlyZWN0bHkIBHR5cGUEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBEmV4Y2hhbmdlRGlyZWN0bHlTRgcFBHBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUEYmFsQQUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0CQESZXhjaGFuZ2VEaXJlY3RseVdYBwUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQBEndpdGhkcmF3QW1vdW50Q2FsYwQEcG9vbA91c2VyQ2FuV2l0aGRyYXcEZGVidAtib3Jyb3dBc3NldAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwMTc2MDQxNzY3MQkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBAhhc3NldElkQQgFDSR0MDE3NjA0MTc2NzECXzEECGFzc2V0SWRCCAUNJHQwMTc2MDQxNzY3MQJfMgQEYmFsQQgFDSR0MDE3NjA0MTc2NzECXzMEBGJhbEIIBQ0kdDAxNzYwNDE3NjcxAl80BAtjQmFsQUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUIYXNzZXRJZEEDCQAAAgULY0JhbEFCZWZvcmUFC2NCYWxBQmVmb3JlBAtjQmFsQkJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUIYXNzZXRJZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAgh3aXRoZHJhdwkAzAgCCQDMCAIJAKQDAQUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MCQD8BwQFCHBvb2xBZGRyAg11bnN0YWtlQW5kR2V0CQDMCAIFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwJAAIBAhNXcm9uZyBwb3NpdGlvbiB0eXBlAwkAAAIFA2ludgUDaW52BApjQmFsQUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQhhc3NldElkQQQKY0JhbEJBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUIYXNzZXRJZEIEDSR0MDE4MTgzMTgyNzIJAJQKAgkAZQIFCmNCYWxBQWZ0ZXIFC2NCYWxBQmVmb3JlCQBlAgUKY0JhbEJBZnRlcgULY0JhbEJCZWZvcmUEDXRva2Vuc0Ftb3VudEEIBQ0kdDAxODE4MzE4MjcyAl8xBA10b2tlbnNBbW91bnRCCAUNJHQwMTgxODMxODI3MgJfMgQNJHQwMTgyNzUxODk3MQMJAGYCBQRkZWJ0AAAEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQhhc3NldElkQQkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFCGFzc2V0SWRCCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAAAAwkAAAIFBWV4SW52BQVleEludgQPY0JhbEFBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQhhc3NldElkQQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQhhc3NldElkQgkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUNdG9rZW5zQW1vdW50QQUNdG9rZW5zQW1vdW50QgQNdG9Vc2VyQW1vdW50QQgFDSR0MDE4Mjc1MTg5NzECXzEEDXRvVXNlckFtb3VudEIIBQ0kdDAxODI3NTE4OTcxAl8yCQCYCgYFDXRvVXNlckFtb3VudEEFCGFzc2V0SWRBBQ10b1VzZXJBbW91bnRCBQhhc3NldElkQgUKY0JhbEFBZnRlcgUKY0JhbEJBZnRlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMcGFyc2VSZXF1ZXN0AQlyZXF1ZXN0SWQEB3JlcXVlc3QJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUJcmVxdWVzdElkBQprUmVxdWVzdElkCQCsAgICE05vIHJlcXVlc3Qgd2l0aCBpZCAFCXJlcXVlc3RJZAIBLAQEdXNlcgkAkQMCBQdyZXF1ZXN0AAAEBHBvb2wJAJEDAgUHcmVxdWVzdAABBARwbXRBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAACBANBSWQJAJEDAgUHcmVxdWVzdAADBARwbXRCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAEBANCSWQJAJEDAgUHcmVxdWVzdAAFBARiYWxBCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAGBARiYWxCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAHBAdzaGFyZUlkCQCRAwIFB3JlcXVlc3QACAQHYndBc3NldAkAkQMCBQdyZXF1ZXN0AAkECGJ3QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVxdWVzdAAKCQCdCgsFBHVzZXIFBHBvb2wFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBQdid0Fzc2V0BQhid0Ftb3VudAwBaQENZ2V0QXNzZXRQcmljZQEHYXNzZXRJZAkAlAoCBQNuaWwICgABQAkA/AcEBQ9wcmljZU9yYWNsZUFkZHICCWdldFRXQVA2MAkAzAgCBQdhc3NldElkCQDMCAIHBQNuaWwFA25pbAMJAAECBQFAAgooSW50LCBJbnQpBQFACQACAQkArAICCQADAQUBQAIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQJfMgFpAQ1nZXRTaGFyZVByaWNlAQdzaGFyZUlkBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAIC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CAIJAKQDAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQxuZXdSZXF1ZXN0SWQCGENhbid0IGNyZWF0ZSBuZXcgcmVxdWVzdAUDbmlsBANpbnYJAP0HBAkBDmdldExlbmRTcnZBZGRyAAINZmxhc2hQb3NpdGlvbgUEYXJncwUDbmlsAwkAAAIFA2ludgUDaW52CQCUCgIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCFUVWQUxPTkxZX1NUQUtFREFNT1VOVAUMYm9ycm93QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIICQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFC05PX0xPQU5fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAJfMQAABAp1c2VyU3Rha2VkCAUNJHQwMjEzNTQyMjgwNQJfMQQMYm9ycm93QW1vdW50CAUNJHQwMjEzNTQyMjgwNQJfMgQNJHQwMjI4MDkyMjk3NgkBEndpdGhkcmF3QW1vdW50Q2FsYwQFBHBvb2wFCnVzZXJTdGFrZWQFDGJvcnJvd0Ftb3VudAUNYm9ycm93QXNzZXRJZAMJAAACBQ0kdDAyMjgwOTIyOTc2BQ0kdDAyMjgwOTIyOTc2BBN1c2VyR2V0QkJlZm9yZVJlcGF5CAUNJHQwMjI4MDkyMjk3NgJfNgQTdXNlckdldEFCZWZvcmVSZXBheQgFDSR0MDIyODA5MjI5NzYCXzUECGFzc2V0SWRCCAUNJHQwMjI4MDkyMjk3NgJfNAQNdG9Vc2VyQW1vdW50QggFDSR0MDIyODA5MjI5NzYCXzMECGFzc2V0SWRBCAUNJHQwMjI4MDkyMjk3NgJfMgQNdG9Vc2VyQW1vdW50QQgFDSR0MDIyODA5MjI5NzYCXzEEDSR0MDIyOTc5MjMwOTQJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQIQUlkQWZ0ZXIIBQ0kdDAyMjk3OTIzMDk0Al8xBAhCSWRBZnRlcggFDSR0MDIyOTc5MjMwOTQCXzIECWJhbEFBZnRlcggFDSR0MDIyOTc5MjMwOTQCXzMECWJhbEJBZnRlcggFDSR0MDIyOTc5MjMwOTQCXzQEDHNoYXJlSWRBZnRlcggFDSR0MDIyOTc5MjMwOTQCXzUEC3JhdGlvQmVmb3JlCQBrAwUEYmFsQgUGU0NBTEU4BQRiYWxBBApyYXRpb0FmdGVyCQBrAwUJYmFsQkFmdGVyBQZTQ0FMRTgFCWJhbEFBZnRlcgQGaW1wYWN0CQBlAgUGU0NBTEU4CQBrAwULcmF0aW9CZWZvcmUFBlNDQUxFOAUKcmF0aW9BZnRlcgQIaW1jYXRNb2QDCQBmAgAABQZpbXBhY3QJAGgCBQZpbXBhY3QA////////////AQUGaW1wYWN0CQCUCgIFA25pbAkAzAgCBRN1c2VyR2V0QUJlZm9yZVJlcGF5CQDMCAIFE3VzZXJHZXRCQmVmb3JlUmVwYXkJAMwIAgUIaW1jYXRNb2QFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARlyZXBsZW5pc2hGcm9tTGFuZEVWQUxPTkxZAQlyZXF1ZXN0SWQEDSR0MDIzNDY0MjM1NjgJAQxwYXJzZVJlcXVlc3QBBQlyZXF1ZXN0SWQEBHVzZXIIBQ0kdDAyMzQ2NDIzNTY4Al8xBARwb29sCAUNJHQwMjM0NjQyMzU2OAJfMgQEcG10QQgFDSR0MDIzNDY0MjM1NjgCXzMEA0FJZAgFDSR0MDIzNDY0MjM1NjgCXzQEBHBtdEIIBQ0kdDAyMzQ2NDIzNTY4Al81BANCSWQIBQ0kdDAyMzQ2NDIzNTY4Al82BARiYWxBCAUNJHQwMjM0NjQyMzU2OAJfNwQEYmFsQggFDSR0MDIzNDY0MjM1NjgCXzgEB3NoYXJlSWQIBQ0kdDAyMzQ2NDIzNTY4Al85BAdid0Fzc2V0CAUNJHQwMjM0NjQyMzU2OANfMTAECGJ3QW1vdW50CAUNJHQwMjM0NjQyMzU2OANfMTEDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhJXcm9uZyBwYXltZW50IHNpemUDAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUHYndBc3NldAYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQhid0Ftb3VudAkAAgECDVdyb25nIHBheW1lbnQEDSR0MDIzNzU4MjM4ODIDCQAAAgUDQUlkBQdid0Fzc2V0CQCUCgIJAGQCBQRwbXRBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUEcG10QgkAlAoCBQRwbXRBCQBkAgUEcG10QggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEB3BtdEFsbEEIBQ0kdDAyMzc1ODIzODgyAl8xBAdwbXRBbGxCCAUNJHQwMjM3NTgyMzg4MgJfMgQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAgxVbmtub3duIHBvb2wEDSR0MDIzOTY0MjQwNzMJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAUITE9BTl9GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAp1c2VyU3Rha2VkCAUNJHQwMjM5NjQyNDA3MwJfMQQHYXhseUZlZQgFDSR0MDIzOTY0MjQwNzMCXzIJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgIVRVZBTE9OTFlfU1RBS0VEQU1PVU5UBQp1c2VyU3Rha2VkBQNuaWwFCnVzZXJTdGFrZWQBaQEJcmVwbGVuaXNoAwRwb29sCGxldmVyYWdlDWJvcnJvd0Fzc2V0SWQDAwkAZgIAZAUIbGV2ZXJhZ2UGCQBmAgUIbGV2ZXJhZ2UArAIJAAIBAh9MZXZlcmFnZSBjYW4ndCBiZSA8MTAwIGFuZCA+MzAwBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMjQ0NTAyNDU0MAkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDAyNDQ1MDI0NTQwAl8xBANCSWQIBQ0kdDAyNDQ1MDI0NTQwAl8yBARiYWxBCAUNJHQwMjQ0NTAyNDU0MAJfMwQEYmFsQggFDSR0MDI0NDUw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bmlzaEZyb21MYW5kCQDMCAIJAKQDAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQxuZXdSZXF1ZXN0SWQCGENhbid0IGNyZWF0ZSBuZXcgcmVxdWVzdAUDbmlsBANpbnYJAP0HBAkBDmdldExlbmRTcnZBZGRyAAINZmxhc2hQb3NpdGlvbgUEYXJncwUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDI2NDc3MjY1ODkJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAULTk9fTE9BTl9GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAp1c2VyU3Rha2VkCAUNJHQwMjY0NzcyNjU4OQJfMQQHYXhseUZlZQgFDSR0MDI2NDc3MjY1ODkCXzIJARByZXBsZW5pc2hFbnRyaWVzBwUEcG9vbAkApQgBCAUBaQZjYWxsZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFCW5ld1Bvc051bQUHc2hhcmVJZAUFcFR5cGUBaQERcmVwbGVuaXNoRnJvbUxhbmQBCXJlcXVlc3RJZAQNJHQwMjY3NTEyNjg1NQkBDHBhcnNlUmVxdWVzdAEFCXJlcXVlc3RJZAQEdXNlcggFDSR0MDI2NzUxMjY4NTUCXzEEBHBvb2wIBQ0kdDAyNjc1MTI2ODU1Al8yBARwbXRBCAUNJHQwMjY3NTEyNjg1NQJfMwQDQUlkCAUNJHQwMjY3NTEyNjg1NQJfNAQEcG10QggFDSR0MDI2NzUxMjY4NTUCXzUEA0JJZAgFDSR0MDI2NzUxMjY4NTUCXzYEBGJhbEEIBQ0kdDAyNjc1MTI2ODU1Al83BARiYWxCCAUNJHQwMjY3NTEyNjg1NQJfOAQHc2hhcmVJZAgFDSR0MDI2NzUxMjY4NTUCXzkEB2J3QXNzZXQIBQ0kdDAyNjc1MTI2ODU1A18xMAQIYndBbW91bnQIBQ0kdDAyNjc1MTI2ODU1A18xMQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECEldyb25nIHBheW1lbnQgc2l6ZQMDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQdid0Fzc2V0BgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFCGJ3QW1vdW50CQACAQINV3JvbmcgcGF5bWVudAQNJHQwMjcwNDUyNzE2OQMJAAACBQNBSWQFB2J3QXNzZXQJAJQKAgkAZAIFBHBtdEEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQRwbXRCCQCUCgIFBHBtdEEJAGQCBQRwbXRCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQHcG10QWxsQQgFDSR0MDI3MDQ1MjcxNjkCXzEEB3BtdEFsbEIIBQ0kdDAyNzA0NTI3MTY5Al8yBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwMjcyNTEyNzM2MAkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQhMT0FOX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQECnVzZXJTdGFrZWQIBQ0kdDAyNzI1MTI3MzYwAl8xBAdheGx5RmVlCAUNJHQwMjcyNTEyNzM2MAJfMgQGcG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAgUEcG9vbAkApQgBCAUBaQZjYWxsZXIEDWJvcnJvd0VudHJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQURa1VzZXJCb3Jyb3dBbW91bnQFCGJ3QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUSa1VzZXJCb3Jyb3dBc3NldElkBQdid0Fzc2V0BQNuaWwEB2VudHJpZXMJARByZXBsZW5pc2hFbnRyaWVzBwUEcG9vbAUEdXNlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUGcG9zTnVtBQdzaGFyZUlkBQVwVHlwZQkAlAoCCQDNCAIJAM4IAgUHZW50cmllcwUNYm9ycm93RW50cmllcwkBC0RlbGV0ZUVudHJ5AQkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFCnVzZXJTdGFrZWQBaQEId2l0aGRyYXcCBHBvb2wFcG9zSWQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24EDHVzZXJJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAQLcG9vbEludGVyc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUNa1Bvb2xJbnRlcmVzdAQOcG9vbFRvdGFsU2hhcmUJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wED3VzZXJDYW5XaXRoZHJhdwkAZAIFB3BBbW91bnQJAGsDBQdwQW1vdW50CQBlAgULcG9vbEludGVyc3QFDHVzZXJJbnRlcmVzdAUHU0NBTEUxMAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQDCQBmAgUMYm9ycm93QW1vdW50AAAKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAAABA0kdDAyODgwMjI4OTIyCQESd2l0aGRyYXdBbW91bnRDYWxjBAUEcG9vbAUPdXNlckNhbldpdGhkcmF3BQRkZWJ0BQtib3Jyb3dBc3NldAMJAAACBQ0kdDAyODgwMjI4OTIyBQ0kdDAyODgwMjI4OTIyBAhhc3NldElkQggFDSR0MDI4ODAyMjg5MjICXzQEDXRvVXNlckFtb3VudEIIBQ0kdDAyODgwMjI4OTIyAl8zBAhhc3NldElkQQgFDSR0MDI4ODAyMjg5MjICXzIEDXRvVXNlckFtb3VudEEIBQ0kdDAyODgwMjI4OTIyAl8xBAtjbG9zZURidEludgMJAGYCBQRkZWJ0AAAJAPwHBAkBDmdldExlbmRTcnZBZGRyAAIIcmVwYXlGb3IJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQULYm9ycm93QXNzZXQFBGRlYnQFA25pbAAAAwkAAAIFC2Nsb3NlRGJ0SW52BQtjbG9zZURidEludgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGUCBQ5wb29sVG90YWxTaGFyZQUPdXNlckNhbldpdGhkcmF3CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQ10b1VzZXJBbW91bnRBCQEOYXNzZXRJZEZyb21TdHIBBQhhc3NldElkQQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgUNdG9Vc2VyQW1vdW50QgkBDmFzc2V0SWRGcm9tU3RyAQUIYXNzZXRJZEIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBjcmVhdGVOZXdSZXF1ZXN0AQZwYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQMbmV3UmVxdWVzdElkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQxrUmVxdWVzdEl0ZXIAAAABCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCkAwEFDG5ld1JlcXVlc3RJZAUKa1JlcXVlc3RJZAUGcGFyYW1zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrUmVxdWVzdEl0ZXIFDG5ld1JlcXVlc3RJZAUDbmlsBQxuZXdSZXF1ZXN0SWQBaQESY2FwaXRhbGl6ZUV4S2VlcGVyDARwb29sBHR5cGUJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0JYW1vdW50c0luCWFkZHJlc3Nlcw9hc3NldHNUb1JlY2VpdmULZXN0UmVjZWl2ZWQRc2xpcHBhZ2VUb2xlcmFuY2ULbWluUmVjZWl2ZWQHb3B0aW9ucwQNJHQwMzAyMTkzMDQxMwMFBWNsYWltCQELY2xhaW1GYXJtZWQCBQR0eXBlBQRwb29sBAxjbGFpbWVkQXNzZXQDCQAAAgUEdHlwZQUHU0ZfUE9PTAUGU1dPUElEBQRXWElECQCUCgIFEGFtb3VudFRvRXhjaGFuZ2UFDGNsYWltZWRBc3NldAQNY2xhaW1lZEFtb3VudAgFDSR0MDMwMjE5MzA0MTMCXzEEDGNsYWltZWRBc3NldAgFDSR0MDMwMjE5MzA0MTMCXzIED2V4Y2hhbmdlZEFtb3VudAkBDmV4Y2hhbmdlS2VlcGVyCgUJdG9rZW5Ub0lkBRBhbW91bnRUb0V4Y2hhbmdlBQxjbGFpbWVkQXNzZXQFCWFtb3VudHNJbgUJYWRkcmVzc2VzBQ9hc3NldHNUb1JlY2VpdmUFC2VzdFJlY2VpdmVkBRFzbGlwcGFnZVRvbGVyYW5jZQULbWluUmVjZWl2ZWQFB29wdGlvbnMEBmNoYW5nZQkAZQIFDWNsYWltZWRBbW91bnQFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZgIFBmNoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlCQBkAgUGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAUDbmlsBQNuaWwJAM4IAgkBCmNhcGl0YWxpemUEBQRwb29sBQR0eXBlBQl0b2tlblRvSWQFD2V4Y2hhbmdlZEFtb3VudAULY2hhbmdlRW50cnkBaQESY2FwaXRhbGl6ZUV4UGF6emxlCARwb29sBHR5cGUJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0Jcm91dGVzU3RyDG1pblRvUmVjZWl2ZQdvcHRpb25zBA0kdDAzMTA2OTMxMjYzAwUFY2xhaW0JAQtjbGFpbUZhcm1lZAIFBHR5cGUFBHBvb2wEDGNsYWltZWRBc3NldAMJAAACBQR0eXBlBQdTRl9QT09MBQZTV09QSUQFBFdYSUQJAJQKAgUQYW1vdW50VG9FeGNoYW5nZQUMY2xhaW1lZEFzc2V0BA1jbGFpbWVkQW1vdW50CAUNJHQwMzEwNjkzMTI2MwJfMQQMY2xhaW1lZEFzc2V0CAUNJHQwMzEwNjkzMTI2MwJfMgQPZXhjaGFuZ2VkQW1vdW50CQEOZXhjaGFuZ2VQYXp6bGUGBQl0b2tlblRvSWQFEGFtb3VudFRvRXhjaGFuZ2UFDGNsYWltZWRBc3NldAUJcm91dGVzU3RyBQxtaW5Ub1JlY2VpdmUFB29wdGlvbnMEBmNoYW5nZQkAZQIFDWNsYWltZWRBbW91bnQFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZgIFBmNoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlCQBkAgUGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAUDbmlsBQNuaWwJAM4IAgkBCmNhcGl0YWxpemUEBQRwb29sBQR0eXBlBQl0b2tlblRvSWQFD2V4Y2hhbmdlZEFtb3VudAULY2hhbmdlRW50cnkBaQESY2FwaXRhbGl6ZUV4U3dvcEZpDARwb29sBHR5cGUJdG9rZW5Ub0lkEGFtb3VudFRvRXhjaGFuZ2UFY2xhaW0KZXhjaGFuZ2Vycw5leGNoYW5nZXJzVHlwZQVhcmdzMQVhcmdzMhFyb3V0aW5nQXNzZXRzS2V5cxJtaW5BbW91bnRUb1JlY2VpdmUHb3B0aW9ucwQNJHQwMzE5ODYzMjE4MAMFBWNsYWltCQELY2xhaW1GYXJtZWQCBQR0eXBlBQRwb29sBAxjbGFpbWVkQXNzZXQDCQAAAgUEdHlwZQUHU0ZfUE9PTAUGU1dPUElEBQRXWElECQCUCgIFEGFtb3VudFRvRXhjaGFuZ2UFDGNsYWltZWRBc3NldAQNY2xhaW1lZEFtb3VudAgFDSR0MDMxOTg2MzIxODACXzEEDGNsYWltZWRBc3NldAgFDSR0MDMxOTg2MzIxODACXzIED2V4Y2hhbmdlZEFtb3VudAkBDmV4Y2hhbmdlU3dvcEZpCgUJdG9rZW5Ub0lkBRBhbW91bnRUb0V4Y2hhbmdlBQxjbGFpbWVkQXNzZXQFCmV4Y2hhbmdlcnMFDmV4Y2hhbmdlcnNUeXBlBQVhcmdzMQUFYXJnczIFEXJvdXRpbmdBc3NldHNLZXlzBRJtaW5BbW91bnRUb1JlY2VpdmUFB29wdGlvbnMEBmNoYW5nZQkAZQIFDWNsYWltZWRBbW91bnQFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZgIFBmNoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlCQBkAgUGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAUDbmlsBQNuaWwJAM4IAgkBCmNhcGl0YWxpemUEBQRwb29sBQR0eXBlBQl0b2tlblRvSWQFD2V4Y2hhbmdlZEFtb3VudAULY2hhbmdlRW50cnkBaQELaW5pdE5ld1Bvb2wGBHR5cGUIcG9vbEFkZHILaW5GZWVOb0xvYW4JaW5GZWVMb2FuDGNhcEZlZU5vTG9hbg5jYXBGZWVXaXRoTG9hbgMDCQECIT0CBQR0eXBlBQdTRl9QT09MCQECIT0CBQR0eXBlBQdXWF9QT09MBwkAAgECCldyb25nIHR5cGUEDSR0MDMyODI1MzI5MTkJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQhwb29sQWRkcgUEdHlwZQQDYUlkCAUNJHQwMzI4MjUzMjkxOQJfMQQDYklkCAUNJHQwMzI4MjUzMjkxOQJfMgQEYUJhbAgFDSR0MDMyODI1MzI5MTkCXzMEBGJCYWwIBQ0kdDAzMjgyNTMyOTE5Al80BAdzaGFyZUlkCAUNJHQwMzI4MjUzMjkxOQJfNQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBQ1rUG9vbEludGVyZXN0AAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQVrUG9vbAUIcG9vbEFkZHIFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sBQhwb29sQWRkcgUDbmlsAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleZx21is=", "height": 2542595, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G3JAdpq4Jv68ad3r8K5MfoR6xRzXRKU5AKfKPiTPMLfk Next: DLjrR2vLeenXbj8E4QgH17CRKUmoXPhgb72462z7ya4a Diff:
OldNewDifferences
685685 }
686686 if ((newRequestId == newRequestId))
687687 then {
688- let args = [((toString(i.caller) + "_") + toString(1)), shareId, borrowAssetId, borrowAmount, toString(this), "replenishFromLandReadOnly", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
688+ let args = [((toString(i.caller) + "_") + toString(1)), shareId, borrowAssetId, borrowAmount, toString(this), "replenishFromLandEVALONLY", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
689689 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
690690 if ((inv == inv))
691691 then $Tuple2(getIntegerValue(this, "EVALONLY_STAKEDAMOUNT"), borrowAmount)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SF_POOL = "SF"
55
66 let WX_POOL = "WX"
77
88 let CAP_FEE_NO_LOAN = "capNoLoan"
99
1010 let CAP_FEE_LOAN = "capLoan"
1111
1212 let LOAN_FEE = "loan"
1313
1414 let NO_LOAN_FEE = "noLoan"
1515
1616 let SCALE8 = 100000000
1717
1818 let SCALE10 = 10000000000
1919
2020 let FEE_SCALE6 = 1000000
2121
2222 let kSFPoolAAssetBalance = "A_asset_balance"
2323
2424 let kSFPoolBAssetBalance = "B_asset_balance"
2525
2626 let kSFPoolAAssetId = "A_asset_id"
2727
2828 let kSFPoolBAssetId = "B_asset_id"
2929
3030 let kSFPoolShareId = "share_asset_id"
3131
3232 let kSFPoolFee = "commission"
3333
3434 let kUserPosition = "_user_position"
3535
3636 let kUserBorrowAmount = "_user_position_borrow_amount"
3737
3838 let kUserBorrowAssetId = "_user_position_borrow_asset_id"
3939
4040 let kUserPositionNum = "_user_position_number"
4141
4242 let kUserPositionInterest = "_user_position_interest"
4343
4444 let kPoolTotal = "_pool_total"
4545
4646 let kPoolTotalLoan = "_pool_total_loan"
4747
4848 let kPoolInterest = "_pool_interest"
4949
5050 let kAxlyInFeeWithoutLoan = "_axly_fee_without_loan"
5151
5252 let kAxlyInFeeWithLoan = "_axly_fee_with_loan"
5353
5454 let kAxlyNoLoanCapFee = "_axly_fee_cap_with_loan"
5555
5656 let kAxlyWithLoanCapFee = "_axly_fee_cap_no_loan"
5757
5858 let kRequestId = "_request_id"
5959
6060 let kRequestIter = "requests_iter"
6161
6262 let kPool = "pool_"
6363
6464 let kSharePool = "_pool_share_id"
6565
6666 let kPoolCapChange = "_pool_cap_change"
6767
6868 let kMoneyBox = "axly_money_box"
6969
7070 let kSFFarmingAddr = "swopfi_farming_addr"
7171
7272 let kLendService = "lend_service_addr"
7373
7474 let kPriceOracle = "price_oracle"
7575
7676 let kExContract = "exchange_contract"
7777
7878 let kWxSwapContract = "wx_swap_contract"
7979
8080 let moneyBox = Address(fromBase58String(valueOrErrorMessage(getString(this, kMoneyBox), "No axly moneyBox address")))
8181
8282 let exContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kExContract), "No exchange contract address")))
8383
8484 let priceOracleAddr = Address(fromBase58String(valueOrErrorMessage(getString(this, kPriceOracle), "No price oracle address")))
8585
8686 let wxSwapContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kWxSwapContract), "No wx swap address")))
8787
8888 let SWOPID = base58'4W19ndijcc2CsQa9HGW2dfXKTVXhnneWWttxXrtjPmEp'
8989
9090 let WXID = base58'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc'
9191
9292 func isSelfCall (i) = if ((i.caller == this))
9393 then unit
9494 else throw("Only contract itself can call this function")
9595
9696
9797 func accountBalance (assetId) = match assetId {
9898 case id: ByteVector =>
9999 assetBalance(this, id)
100100 case waves: Unit =>
101101 wavesBalance(this).available
102102 case _ =>
103103 throw("Match error")
104104 }
105105
106106
107107 func getSFPoolData (poolAddr) = $Tuple5(valueOrErrorMessage(getString(poolAddr, kSFPoolAAssetId), "Can't get pool A asset id"), valueOrErrorMessage(getString(poolAddr, kSFPoolBAssetId), "Can't get pool B asset id"), valueOrErrorMessage(getInteger(poolAddr, kSFPoolAAssetBalance), "Can't get pool A asset balance"), valueOrErrorMessage(getInteger(poolAddr, kSFPoolBAssetBalance), "Can't get pool B asset balance"), valueOrErrorMessage(getString(poolAddr, kSFPoolShareId), "Can't get share asset id"))
108108
109109
110110 func getWXPoolData (poolAddr) = {
111111 let cfg = {
112112 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
113113 if ($isInstanceOf(@, "List[Any]"))
114114 then @
115115 else throw(($getType(@) + " couldn't be cast to List[Any]"))
116116 }
117117 if ((cfg == cfg))
118118 then {
119119 let aId = valueOrErrorMessage({
120120 let @ = cfg[4]
121121 if ($isInstanceOf(@, "String"))
122122 then @
123123 else unit
124124 }, "Can't get pool A asset id")
125125 let bId = valueOrErrorMessage({
126126 let @ = cfg[5]
127127 if ($isInstanceOf(@, "String"))
128128 then @
129129 else unit
130130 }, "Can't get pool B asset id")
131131 let shareId = valueOrErrorMessage({
132132 let @ = cfg[3]
133133 if ($isInstanceOf(@, "String"))
134134 then @
135135 else unit
136136 }, "Can't get pool LP asset id")
137137 let balA = {
138138 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
139139 if ($isInstanceOf(@, "Int"))
140140 then @
141141 else throw(($getType(@) + " couldn't be cast to Int"))
142142 }
143143 if ((balA == balA))
144144 then {
145145 let balB = {
146146 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
147147 if ($isInstanceOf(@, "Int"))
148148 then @
149149 else throw(($getType(@) + " couldn't be cast to Int"))
150150 }
151151 if ((balB == balB))
152152 then $Tuple5(aId, bId, balA, balB, shareId)
153153 else throw("Strict value is not equal to itself.")
154154 }
155155 else throw("Strict value is not equal to itself.")
156156 }
157157 else throw("Strict value is not equal to itself.")
158158 }
159159
160160
161161 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
162162 then getSFPoolData(poolAddr)
163163 else if ((type == WX_POOL))
164164 then getWXPoolData(poolAddr)
165165 else throw("Wrong pool type")
166166
167167
168168 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
169169
170170
171171 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
172172
173173
174174 func getNewUserPositionNumber (pool,user) = (valueOrElse(getInteger(this, (((pool + "_") + user) + kUserPositionNum)), 0) + 1)
175175
176176
177177 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
178178 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
179179 else if ((feeType == CAP_FEE_NO_LOAN))
180180 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
181181 else if ((feeType == LOAN_FEE))
182182 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
183183 else if ((feeType == NO_LOAN_FEE))
184184 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
185185 else throw("Wrong fee type")
186186
187187
188188 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
189189
190190
191191 func getWXFarmingAddr (poolAddr) = {
192192 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
193193 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
194194 Address(fromBase58String(factroyCfg[1]))
195195 }
196196
197197
198198 func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
199199
200200
201201 func assetIdToStr (assetId) = match assetId {
202202 case id: ByteVector =>
203203 toBase58String(id)
204204 case waves: Unit =>
205205 "WAVES"
206206 case _ =>
207207 throw("Match error")
208208 }
209209
210210
211211 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
212212 then unit
213213 else fromBase58String(assetId)
214214
215215
216216 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
217217 then 8
218218 else match assetInfo(fromBase58String(assetId)) {
219219 case asset: Asset =>
220220 asset.decimals
221221 case _ =>
222222 throw("Can't find asset")
223223 }
224224
225225
226226 func replenishSwopFi (pool,feeType,pmtA,pmtAssetA,pmtB,pmtAssetB,balA,balB,shareId) = {
227227 let shareBalanceBefore = accountBalance(fromBase58String(shareId))
228228 if ((shareBalanceBefore == shareBalanceBefore))
229229 then {
230230 let poolAddr = Address(fromBase58String(pool))
231231 let ratioA = fraction(SCALE8, pmtA, balA)
232232 let ratioB = fraction(SCALE8, pmtB, balB)
233233 let $t071357427 = if ((ratioB > ratioA))
234234 then {
235235 let pmt = fraction(balB, ratioA, SCALE8, CEILING)
236236 $Tuple4(pmtA, pmt, (pmtB - pmt), pmtAssetB)
237237 }
238238 else {
239239 let pmt = fraction(balA, ratioB, SCALE8, CEILING)
240240 $Tuple4(pmt, pmtB, (pmtA - pmt), pmtAssetA)
241241 }
242242 let pmtAmountA = $t071357427._1
243243 let pmtAmountB = $t071357427._2
244244 let change = $t071357427._3
245245 let changeAssetId = $t071357427._4
246246 let inv1 = if (if ((pmtAmountA > 0))
247247 then (pmtAmountB > 0)
248248 else false)
249249 then {
250250 let payments = [AttachedPayment(assetIdFromStr(pmtAssetA), pmtAmountA), AttachedPayment(assetIdFromStr(pmtAssetB), pmtAmountB)]
251251 invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
252252 }
253253 else 0
254254 if ((inv1 == inv1))
255255 then {
256256 let inv2 = if ((change > 0))
257257 then {
258258 let payments = [AttachedPayment(assetIdFromStr(changeAssetId), change)]
259259 let vars = ["0", "false", "0"]
260260 invoke(poolAddr, "callFunction", ["replenishWithOneToken", vars], payments)
261261 }
262262 else 0
263263 if ((inv2 == inv2))
264264 then {
265265 let shareBalanceAfter = accountBalance(fromBase58String(shareId))
266266 let totalStaked = (shareBalanceAfter - shareBalanceBefore)
267267 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
268268 let userShareForStake = (totalStaked - axlyFeeAmount)
269269 if ((0 >= userShareForStake))
270270 then throw("amount of staked sharetokens must be > 0")
271271 else {
272272 let inv3 = invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], [AttachedPayment(fromBase58String(shareId), userShareForStake)])
273273 if ((inv3 == inv3))
274274 then $Tuple2(userShareForStake, axlyFeeAmount)
275275 else throw("Strict value is not equal to itself.")
276276 }
277277 }
278278 else throw("Strict value is not equal to itself.")
279279 }
280280 else throw("Strict value is not equal to itself.")
281281 }
282282 else throw("Strict value is not equal to itself.")
283283 }
284284
285285
286286 func replenishWX (pool,feeType,pmtA,pmtAssetA,pmtB,pmtAssetB,shareId) = {
287287 let poolAddr = Address(fromBase58String(pool))
288288 let $t088789727 = if (if ((pmtA > 0))
289289 then (pmtB > 0)
290290 else false)
291291 then {
292292 let evalPutInA = split({
293293 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
294294 if ($isInstanceOf(@, "String"))
295295 then @
296296 else throw(($getType(@) + " couldn't be cast to String"))
297297 }, "__")
298298 if ((evalPutInA == evalPutInA))
299299 then {
300300 let evalPutInB = split({
301301 let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
302302 if ($isInstanceOf(@, "String"))
303303 then @
304304 else throw(($getType(@) + " couldn't be cast to String"))
305305 }, "__")
306306 if ((evalPutInB == evalPutInB))
307307 then {
308308 let lpInA = parseIntValue(evalPutInA[1])
309309 let lpInB = parseIntValue(evalPutInB[1])
310310 if ((lpInB > lpInA))
311311 then {
312312 let pmtInB = parseIntValue(evalPutInA[8])
313313 $Tuple4(pmtA, pmtInB, (pmtB - pmtInB), pmtAssetB)
314314 }
315315 else {
316316 let pmtInA = parseIntValue(evalPutInB[7])
317317 $Tuple4(pmtInA, pmtB, (pmtA - pmtInA), pmtAssetA)
318318 }
319319 }
320320 else throw("Strict value is not equal to itself.")
321321 }
322322 else throw("Strict value is not equal to itself.")
323323 }
324324 else if ((pmtA > 0))
325325 then $Tuple4(pmtA, pmtB, pmtA, pmtAssetA)
326326 else if ((pmtB > 0))
327327 then $Tuple4(pmtA, pmtB, pmtB, pmtAssetB)
328328 else throw("pmts must be > 0")
329329 let pmtAmountA = $t088789727._1
330330 let pmtAmountB = $t088789727._2
331331 let change = $t088789727._3
332332 let changeAssetId = $t088789727._4
333333 let shareBalanceBefore = accountBalance(fromBase58String(shareId))
334334 if ((shareBalanceBefore == shareBalanceBefore))
335335 then {
336336 let inv1 = if (if ((pmtAmountA > 0))
337337 then (pmtAmountB > 0)
338338 else false)
339339 then {
340340 let payments = [AttachedPayment(assetIdFromStr(pmtAssetA), pmtAmountA), AttachedPayment(assetIdFromStr(pmtAssetB), pmtAmountB)]
341341 invoke(poolAddr, "put", [1000000, false], payments)
342342 }
343343 else 0
344344 if ((inv1 == inv1))
345345 then {
346346 let inv2 = if ((change > 0))
347347 then {
348348 let payments = [AttachedPayment(assetIdFromStr(changeAssetId), change)]
349349 invoke(poolAddr, "putOneTkn", [0, false], payments)
350350 }
351351 else 0
352352 if ((inv2 == inv2))
353353 then {
354354 let shareBalanceAfter = accountBalance(fromBase58String(shareId))
355355 let totalStaked = (shareBalanceAfter - shareBalanceBefore)
356356 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
357357 let userShareForStake = (totalStaked - axlyFeeAmount)
358358 if ((0 >= userShareForStake))
359359 then throw("amount of staked sharetokens must be > 0")
360360 else {
361361 let inv3 = invoke(getWXFarmingAddr(poolAddr), "stake", nil, [AttachedPayment(fromBase58String(shareId), userShareForStake)])
362362 if ((inv3 == inv3))
363363 then $Tuple2(userShareForStake, axlyFeeAmount)
364364 else throw("Strict value is not equal to itself.")
365365 }
366366 }
367367 else throw("Strict value is not equal to itself.")
368368 }
369369 else throw("Strict value is not equal to itself.")
370370 }
371371 else throw("Strict value is not equal to itself.")
372372 }
373373
374374
375375 func replenishByType (type,pool,feeType,pmtA,AId,pmtB,BId,balA,balB,shareId) = if ((type == SF_POOL))
376376 then replenishSwopFi(pool, LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
377377 else if ((type == WX_POOL))
378378 then replenishWX(pool, LOAN_FEE, pmtA, AId, pmtB, BId, shareId)
379379 else throw("Wrong pool type")
380380
381381
382382 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type) = {
383383 let totalAmount = getPoolTotalShare(pool)
384384 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
385385 let curPoolInterest = getIntegerValue(this, (pool + kPoolInterest))
386386 [IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalAmountLoan + stakedAmount)), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPosition), stakedAmount), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInterest), curPoolInterest), IntegerEntry((((pool + "_") + user) + kUserPositionNum), posNum), ScriptTransfer(moneyBox, axlyFeeAmount, fromBase58String(shareId))]
387387 }
388388
389389
390390 func claimFarmed (type,pool) = if ((type == SF_POOL))
391391 then {
392392 let balBefore = accountBalance(SWOPID)
393393 if ((balBefore == balBefore))
394394 then {
395395 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
396396 if ((inv == inv))
397397 then {
398398 let balAfter = accountBalance(SWOPID)
399399 $Tuple2((balAfter - balBefore), SWOPID)
400400 }
401401 else throw("Strict value is not equal to itself.")
402402 }
403403 else throw("Strict value is not equal to itself.")
404404 }
405405 else if ((type == WX_POOL))
406406 then {
407407 let balBefore = accountBalance(WXID)
408408 if ((balBefore == balBefore))
409409 then {
410410 let inv = invoke(getWXFarmingAddr(Address(fromBase58String(pool))), "claimWX", [pool], nil)
411411 if ((inv == inv))
412412 then {
413413 let balAfter = accountBalance(WXID)
414414 $Tuple2((balAfter - balBefore), WXID)
415415 }
416416 else throw("Strict value is not equal to itself.")
417417 }
418418 else throw("Strict value is not equal to itself.")
419419 }
420420 else throw("Wrong pool type")
421421
422422
423423 func exchangeKeeper (toToken,pmtAmount,pmtAsset,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
424424 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
425425 if ((tokenBalanceBefore == tokenBalanceBefore))
426426 then {
427427 let inv = invoke(exContract, "swap", [amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options], [AttachedPayment(pmtAsset, pmtAmount)])
428428 if ((inv == inv))
429429 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
430430 else throw("Strict value is not equal to itself.")
431431 }
432432 else throw("Strict value is not equal to itself.")
433433 }
434434
435435
436436 func exchangePazzle (toToken,pmtAmount,pmtAsset,routesStr,minToReceive,options) = {
437437 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
438438 if ((tokenBalanceBefore == tokenBalanceBefore))
439439 then {
440440 let inv = invoke(exContract, "puzzleSwap", [routesStr, minToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
441441 if ((inv == inv))
442442 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
443443 else throw("Strict value is not equal to itself.")
444444 }
445445 else throw("Strict value is not equal to itself.")
446446 }
447447
448448
449449 func exchangeSwopFi (toToken,pmtAmount,pmtAsset,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
450450 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
451451 if ((tokenBalanceBefore == tokenBalanceBefore))
452452 then {
453453 let inv = invoke(exContract, "swopfiSwap", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
454454 if ((inv == inv))
455455 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
456456 else throw("Strict value is not equal to itself.")
457457 }
458458 else throw("Strict value is not equal to itself.")
459459 }
460460
461461
462462 func capitalize (pool,pType,tokenId,tokenAmount) = {
463463 let poolAddr = Address(fromBase58String(pool))
464464 let $t01469114770 = getPoolData(poolAddr, pType)
465465 let AId = $t01469114770._1
466466 let BId = $t01469114770._2
467467 let balA = $t01469114770._3
468468 let balB = $t01469114770._4
469469 let shareId = $t01469114770._5
470470 let $t01477314853 = if ((tokenId == AId))
471471 then $Tuple2(tokenAmount, 0)
472472 else $Tuple2(0, tokenAmount)
473473 let pmtA = $t01477314853._1
474474 let pmtB = $t01477314853._2
475475 let $t01485614971 = replenishByType(pType, pool, CAP_FEE_LOAN, pmtA, AId, pmtB, BId, balA, balB, shareId)
476476 let stakedAmount = $t01485614971._1
477477 let axlyFee = $t01485614971._2
478478 let curPoolInterest = valueOrElse(getInteger(this, (pool + kPoolInterest)), 0)
479479 let totalShareAmount = getPoolTotalShare(pool)
480480 let newInterest = (curPoolInterest + fraction(stakedAmount, SCALE10, totalShareAmount))
481481 [IntegerEntry((pool + kPoolInterest), newInterest), ScriptTransfer(moneyBox, axlyFee, fromBase58String(shareId))]
482482 }
483483
484484
485485 func exchangeDirectlySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
486486 let poolAddr = Address(fromBase58String(pool))
487487 let feeScale6 = 1000000
488488 let fee = getIntegerValue(poolAddr, kSFPoolFee)
489489 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee))
490490 let $t01566415952 = if ((assetTokenToGet == assetIdA))
491491 then {
492492 let amountToPay = fraction(balA, amntGetNoFee, (balB - amntGetNoFee))
493493 $Tuple2(amountToPay, assetIdB)
494494 }
495495 else {
496496 let amountToPay = fraction(balB, amntGetNoFee, (balA - amntGetNoFee))
497497 $Tuple2(amountToPay, assetIdA)
498498 }
499499 let amountToPay = $t01566415952._1
500500 let assetToPay = $t01566415952._2
501501 invoke(poolAddr, "callFunction", ["exchange", ["1"]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
502502 }
503503
504504
505505 func exchangeDirectlyWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
506506 let poolAddr = Address(fromBase58String(pool))
507507 let prFee = getIntegerValue(wxSwapContract, "%s__protocolFee")
508508 let pFee = getIntegerValue(wxSwapContract, "%s__poolFee")
509509 let feeScale = toBigInt(100000000)
510510 let $t01643116739 = if ((assetTokenToGet == assetIdA))
511511 then {
512512 let amountToPay = fraction(balA, amountTokenToGet, (balB - amountTokenToGet))
513513 $Tuple2(amountToPay, assetIdB)
514514 }
515515 else {
516516 let amountToPay = fraction(balB, amountTokenToGet, (balA - amountTokenToGet))
517517 $Tuple2(amountToPay, assetIdA)
518518 }
519519 let amountToPay = $t01643116739._1
520520 let assetToPay = $t01643116739._2
521521 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee)))))
522522 invoke(wxSwapContract, "swap", [1, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPayWithFee)])
523523 }
524524
525525
526526 func exchangeDirectly (type,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = if ((type == SF_POOL))
527527 then exchangeDirectlySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
528528 else exchangeDirectlyWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
529529
530530
531531 func withdrawAmountCalc (pool,userCanWithdraw,debt,borrowAsset) = {
532532 let poolAddr = Address(fromBase58String(pool))
533533 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
534534 let $t01760417671 = getPoolData(poolAddr, pType)
535535 let assetIdA = $t01760417671._1
536536 let assetIdB = $t01760417671._2
537537 let balA = $t01760417671._3
538538 let balB = $t01760417671._4
539539 let cBalABefore = accountBalance(assetIdFromStr(assetIdA))
540540 if ((cBalABefore == cBalABefore))
541541 then {
542542 let cBalBBefore = accountBalance(assetIdFromStr(assetIdB))
543543 if ((cBalBBefore == cBalBBefore))
544544 then {
545545 let inv = if ((pType == SF_POOL))
546546 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
547547 else if ((pType == WX_POOL))
548548 then invoke(poolAddr, "unstakeAndGet", [userCanWithdraw], nil)
549549 else throw("Wrong position type")
550550 if ((inv == inv))
551551 then {
552552 let cBalAAfter = accountBalance(assetIdFromStr(assetIdA))
553553 let cBalBAfter = accountBalance(assetIdFromStr(assetIdB))
554554 let $t01818318272 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
555555 let tokensAmountA = $t01818318272._1
556556 let tokensAmountB = $t01818318272._2
557557 let $t01827518971 = if ((debt > 0))
558558 then {
559559 let amountToGetEx = if (if ((borrowAsset == assetIdA))
560560 then (debt > tokensAmountA)
561561 else false)
562562 then (debt - tokensAmountA)
563563 else if (if ((borrowAsset == assetIdB))
564564 then (debt > tokensAmountB)
565565 else false)
566566 then (debt - tokensAmountB)
567567 else 0
568568 let exInv = if ((amountToGetEx > 0))
569569 then exchangeDirectly(pType, pool, assetIdA, assetIdB, balA, balB, amountToGetEx, borrowAsset)
570570 else 0
571571 if ((exInv == exInv))
572572 then {
573573 let cBalAAfterRepay = accountBalance(assetIdFromStr(assetIdA))
574574 let cBalBAfterRepay = accountBalance(assetIdFromStr(assetIdB))
575575 $Tuple2((cBalAAfterRepay - cBalABefore), (cBalBAfterRepay - cBalBBefore))
576576 }
577577 else throw("Strict value is not equal to itself.")
578578 }
579579 else $Tuple2(tokensAmountA, tokensAmountB)
580580 let toUserAmountA = $t01827518971._1
581581 let toUserAmountB = $t01827518971._2
582582 $Tuple6(toUserAmountA, assetIdA, toUserAmountB, assetIdB, cBalAAfter, cBalBAfter)
583583 }
584584 else throw("Strict value is not equal to itself.")
585585 }
586586 else throw("Strict value is not equal to itself.")
587587 }
588588 else throw("Strict value is not equal to itself.")
589589 }
590590
591591
592592 func parseRequest (requestId) = {
593593 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
594594 let user = request[0]
595595 let pool = request[1]
596596 let pmtA = parseIntValue(request[2])
597597 let AId = request[3]
598598 let pmtB = parseIntValue(request[4])
599599 let BId = request[5]
600600 let balA = parseIntValue(request[6])
601601 let balB = parseIntValue(request[7])
602602 let shareId = request[8]
603603 let bwAsset = request[9]
604604 let bwAmount = parseIntValue(request[10])
605605 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
606606 }
607607
608608
609609 @Callable(i)
610610 func getAssetPrice (assetId) = $Tuple2(nil, (let @ = invoke(priceOracleAddr, "getTWAP60", [assetId, false], nil)
611611 if ($isInstanceOf(@, "(Int, Int)"))
612612 then @
613613 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2)
614614
615615
616616
617617 @Callable(i)
618618 func getSharePrice (shareId) = {
619619 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
620620 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
621621 let $t02006620136 = getPoolData(Address(fromBase58String(pool)), pType)
622622 let aId = $t02006620136._1
623623 let bId = $t02006620136._2
624624 let dPriceA = ( let @ = invoke(priceOracleAddr, "getTWAP60", [aId, false], nil)
625625 if ($isInstanceOf(@, "(Int, Int)"))
626626 then @
627627 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2
628628 let dPriceB = ( let @ = invoke(priceOracleAddr, "getTWAP60", [bId, false], nil)
629629 if ($isInstanceOf(@, "(Int, Int)"))
630630 then @
631631 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2
632632 $Tuple2(nil, (dPriceA + dPriceB))
633633 }
634634
635635
636636
637637 @Callable(i)
638638 func replenishEVALONLY (pool,leverage,borrowAssetId) = if (if ((100 > leverage))
639639 then true
640640 else (leverage > 300))
641641 then throw("Leverage can't be <100 and >300")
642642 else {
643643 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
644644 let $t02062120711 = getPoolData(Address(fromBase58String(pool)), pType)
645645 let AId = $t02062120711._1
646646 let BId = $t02062120711._2
647647 let balA = $t02062120711._3
648648 let balB = $t02062120711._4
649649 let shareId = $t02062120711._5
650650 let $t02071421351 = if ((size(i.payments) == 2))
651651 then if ((assetIdToStr(i.payments[0].assetId) != AId))
652652 then throw("Wrong payment asset A")
653653 else if ((assetIdToStr(i.payments[1].assetId) != BId))
654654 then throw("Wrong payment asset B")
655655 else $Tuple4(i.payments[0].amount, AId, i.payments[1].amount, BId)
656656 else if ((size(i.payments) == 1))
657657 then if ((assetIdToStr(i.payments[0].assetId) == AId))
658658 then $Tuple4(i.payments[0].amount, AId, 0, BId)
659659 else if ((assetIdToStr(i.payments[0].assetId) == BId))
660660 then $Tuple4(0, AId, i.payments[0].amount, BId)
661661 else throw("Wrong payment")
662662 else throw("One or two payments expected")
663663 let pmtA = $t02071421351._1
664664 let pmtAssetA = $t02071421351._2
665665 let pmtB = $t02071421351._3
666666 let pmtAssetB = $t02071421351._4
667667 let $t02135422805 = if ((leverage > 100))
668668 then {
669669 let dPriceA = ( let @ = invoke(priceOracleAddr, "getTWAP60", [pmtAssetA, false], nil)
670670 if ($isInstanceOf(@, "(Int, Int)"))
671671 then @
672672 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2
673673 let dPriceB = ( let @ = invoke(priceOracleAddr, "getTWAP60", [pmtAssetB, false], nil)
674674 if ($isInstanceOf(@, "(Int, Int)"))
675675 then @
676676 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2
677677 let paydInDollar = (fraction(dPriceA, pmtA, pow(10, 0, getAssetDecimals(pmtAssetA), 0, 0, DOWN)) + fraction(dPriceB, pmtB, pow(10, 0, getAssetDecimals(pmtAssetB), 0, 0, DOWN)))
678678 let borrowAmount = fraction(paydInDollar, (leverage - 100), 100)
679679 let request = makeString([toString(i.caller), pool, toString(pmtA), pmtAssetA, toString(pmtB), pmtAssetB, toString(balA), toString(balB), shareId, borrowAssetId, toString(borrowAmount), toString(1)], ",")
680680 let newRequestId = {
681681 let @ = invoke(this, "createNewRequest", [request], nil)
682682 if ($isInstanceOf(@, "Int"))
683683 then @
684684 else throw(($getType(@) + " couldn't be cast to Int"))
685685 }
686686 if ((newRequestId == newRequestId))
687687 then {
688- let args = [((toString(i.caller) + "_") + toString(1)), shareId, borrowAssetId, borrowAmount, toString(this), "replenishFromLandReadOnly", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
688+ let args = [((toString(i.caller) + "_") + toString(1)), shareId, borrowAssetId, borrowAmount, toString(this), "replenishFromLandEVALONLY", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
689689 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
690690 if ((inv == inv))
691691 then $Tuple2(getIntegerValue(this, "EVALONLY_STAKEDAMOUNT"), borrowAmount)
692692 else throw("Strict value is not equal to itself.")
693693 }
694694 else throw("Strict value is not equal to itself.")
695695 }
696696 else $Tuple2(replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)._1, 0)
697697 let userStaked = $t02135422805._1
698698 let borrowAmount = $t02135422805._2
699699 let $t02280922976 = withdrawAmountCalc(pool, userStaked, borrowAmount, borrowAssetId)
700700 if (($t02280922976 == $t02280922976))
701701 then {
702702 let userGetBBeforeRepay = $t02280922976._6
703703 let userGetABeforeRepay = $t02280922976._5
704704 let assetIdB = $t02280922976._4
705705 let toUserAmountB = $t02280922976._3
706706 let assetIdA = $t02280922976._2
707707 let toUserAmountA = $t02280922976._1
708708 let $t02297923094 = getPoolData(Address(fromBase58String(pool)), pType)
709709 let AIdAfter = $t02297923094._1
710710 let BIdAfter = $t02297923094._2
711711 let balAAfter = $t02297923094._3
712712 let balBAfter = $t02297923094._4
713713 let shareIdAfter = $t02297923094._5
714714 let ratioBefore = fraction(balB, SCALE8, balA)
715715 let ratioAfter = fraction(balBAfter, SCALE8, balAAfter)
716716 let impact = (SCALE8 - fraction(ratioBefore, SCALE8, ratioAfter))
717717 let imcatMod = if ((0 > impact))
718718 then (impact * -1)
719719 else impact
720720 $Tuple2(nil, [userGetABeforeRepay, userGetBBeforeRepay, imcatMod])
721721 }
722722 else throw("Strict value is not equal to itself.")
723723 }
724724
725725
726726
727727 @Callable(i)
728728 func replenishFromLandEVALONLY (requestId) = {
729729 let $t02346423568 = parseRequest(requestId)
730730 let user = $t02346423568._1
731731 let pool = $t02346423568._2
732732 let pmtA = $t02346423568._3
733733 let AId = $t02346423568._4
734734 let pmtB = $t02346423568._5
735735 let BId = $t02346423568._6
736736 let balA = $t02346423568._7
737737 let balB = $t02346423568._8
738738 let shareId = $t02346423568._9
739739 let bwAsset = $t02346423568._10
740740 let bwAmount = $t02346423568._11
741741 if ((size(i.payments) != 1))
742742 then throw("Wrong payment size")
743743 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
744744 then true
745745 else (i.payments[0].amount != bwAmount))
746746 then throw("Wrong payment")
747747 else {
748748 let $t02375823882 = if ((AId == bwAsset))
749749 then $Tuple2((pmtA + i.payments[0].amount), pmtB)
750750 else $Tuple2(pmtA, (pmtB + i.payments[0].amount))
751751 let pmtAllA = $t02375823882._1
752752 let pmtAllB = $t02375823882._2
753753 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
754754 let $t02396424073 = replenishByType(pType, pool, LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
755755 let userStaked = $t02396424073._1
756756 let axlyFee = $t02396424073._2
757757 $Tuple2([IntegerEntry("EVALONLY_STAKEDAMOUNT", userStaked)], userStaked)
758758 }
759759 }
760760
761761
762762
763763 @Callable(i)
764764 func replenish (pool,leverage,borrowAssetId) = if (if ((100 > leverage))
765765 then true
766766 else (leverage > 300))
767767 then throw("Leverage can't be <100 and >300")
768768 else {
769769 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
770770 let $t02445024540 = getPoolData(Address(fromBase58String(pool)), pType)
771771 let AId = $t02445024540._1
772772 let BId = $t02445024540._2
773773 let balA = $t02445024540._3
774774 let balB = $t02445024540._4
775775 let shareId = $t02445024540._5
776776 let $t02454325180 = if ((size(i.payments) == 2))
777777 then if ((assetIdToStr(i.payments[0].assetId) != AId))
778778 then throw("Wrong payment asset A")
779779 else if ((assetIdToStr(i.payments[1].assetId) != BId))
780780 then throw("Wrong payment asset B")
781781 else $Tuple4(i.payments[0].amount, AId, i.payments[1].amount, BId)
782782 else if ((size(i.payments) == 1))
783783 then if ((assetIdToStr(i.payments[0].assetId) == AId))
784784 then $Tuple4(i.payments[0].amount, AId, 0, BId)
785785 else if ((assetIdToStr(i.payments[0].assetId) == BId))
786786 then $Tuple4(0, AId, i.payments[0].amount, BId)
787787 else throw("Wrong payment")
788788 else throw("One or two payments expected")
789789 let pmtA = $t02454325180._1
790790 let pmtAssetA = $t02454325180._2
791791 let pmtB = $t02454325180._3
792792 let pmtAssetB = $t02454325180._4
793793 let newPosNum = getNewUserPositionNumber(pool, toString(i.caller))
794794 if ((leverage > 100))
795795 then {
796796 let dPriceA = ( let @ = invoke(priceOracleAddr, "getTWAP60", [pmtAssetA, false], nil)
797797 if ($isInstanceOf(@, "(Int, Int)"))
798798 then @
799799 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2
800800 let dPriceB = ( let @ = invoke(priceOracleAddr, "getTWAP60", [pmtAssetB, false], nil)
801801 if ($isInstanceOf(@, "(Int, Int)"))
802802 then @
803803 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2
804804 let paydInDollar = (fraction(dPriceA, pmtA, pow(10, 0, getAssetDecimals(pmtAssetA), 0, 0, DOWN)) + fraction(dPriceB, pmtB, pow(10, 0, getAssetDecimals(pmtAssetB), 0, 0, DOWN)))
805805 let borrowAmount = fraction(paydInDollar, (leverage - 100), 100)
806806 let request = makeString([toString(i.caller), pool, toString(pmtA), pmtAssetA, toString(pmtB), pmtAssetB, toString(balA), toString(balB), shareId, borrowAssetId, toString(borrowAmount)], ",")
807807 let newRequestId = {
808808 let @ = invoke(this, "createNewRequest", [request], nil)
809809 if ($isInstanceOf(@, "Int"))
810810 then @
811811 else throw(($getType(@) + " couldn't be cast to Int"))
812812 }
813813 if ((newRequestId == newRequestId))
814814 then {
815815 let args = [((toString(i.caller) + "_") + toString(newPosNum)), shareId, borrowAssetId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
816816 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
817817 if ((inv == inv))
818818 then nil
819819 else throw("Strict value is not equal to itself.")
820820 }
821821 else throw("Strict value is not equal to itself.")
822822 }
823823 else {
824824 let $t02647726589 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
825825 let userStaked = $t02647726589._1
826826 let axlyFee = $t02647726589._2
827827 replenishEntries(pool, toString(i.caller), userStaked, axlyFee, newPosNum, shareId, pType)
828828 }
829829 }
830830
831831
832832
833833 @Callable(i)
834834 func replenishFromLand (requestId) = {
835835 let $t02675126855 = parseRequest(requestId)
836836 let user = $t02675126855._1
837837 let pool = $t02675126855._2
838838 let pmtA = $t02675126855._3
839839 let AId = $t02675126855._4
840840 let pmtB = $t02675126855._5
841841 let BId = $t02675126855._6
842842 let balA = $t02675126855._7
843843 let balB = $t02675126855._8
844844 let shareId = $t02675126855._9
845845 let bwAsset = $t02675126855._10
846846 let bwAmount = $t02675126855._11
847847 if ((size(i.payments) != 1))
848848 then throw("Wrong payment size")
849849 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
850850 then true
851851 else (i.payments[0].amount != bwAmount))
852852 then throw("Wrong payment")
853853 else {
854854 let $t02704527169 = if ((AId == bwAsset))
855855 then $Tuple2((pmtA + i.payments[0].amount), pmtB)
856856 else $Tuple2(pmtA, (pmtB + i.payments[0].amount))
857857 let pmtAllA = $t02704527169._1
858858 let pmtAllB = $t02704527169._2
859859 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
860860 let $t02725127360 = replenishByType(pType, pool, LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
861861 let userStaked = $t02725127360._1
862862 let axlyFee = $t02725127360._2
863863 let posNum = getNewUserPositionNumber(pool, toString(i.caller))
864864 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
865865 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType)
866866 $Tuple2(((entries ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
867867 }
868868 }
869869
870870
871871
872872 @Callable(i)
873873 func withdraw (pool,posId) = {
874874 let user = toString(i.caller)
875875 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + toString(posId)) + kUserPosition)), "Unknown position")
876876 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(posId)) + kUserPositionInterest))
877877 let poolInterst = getIntegerValue(this, (pool + kPoolInterest))
878878 let poolTotalShare = getPoolTotalShare(pool)
879879 let userCanWithdraw = (pAmount + fraction(pAmount, (poolInterst - userInterest), SCALE10))
880880 let userAddr = Address(fromBase58String(user))
881881 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(posId)) + kUserBorrowAmount))
882882 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + toString(posId)) + kUserBorrowAssetId))
883883 let debt = if ((borrowAmount > 0))
884884 then {
885885 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((((pool + "_") + user) + "_") + toString(posId)), borrowAsset], nil)
886886 if ($isInstanceOf(@, "Int"))
887887 then @
888888 else throw(($getType(@) + " couldn't be cast to Int"))
889889 }
890890 else 0
891891 let $t02880228922 = withdrawAmountCalc(pool, userCanWithdraw, debt, borrowAsset)
892892 if (($t02880228922 == $t02880228922))
893893 then {
894894 let assetIdB = $t02880228922._4
895895 let toUserAmountB = $t02880228922._3
896896 let assetIdA = $t02880228922._2
897897 let toUserAmountA = $t02880228922._1
898898 let closeDbtInv = if ((debt > 0))
899899 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + toString(posId))], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
900900 else 0
901901 if ((closeDbtInv == closeDbtInv))
902902 then [DeleteEntry((((((pool + "_") + user) + "_") + toString(posId)) + kUserPosition)), DeleteEntry((((((pool + "_") + user) + "_") + toString(posId)) + kUserPositionInterest)), IntegerEntry((pool + kPoolTotal), (poolTotalShare - userCanWithdraw)), ScriptTransfer(userAddr, toUserAmountA, assetIdFromStr(assetIdA)), ScriptTransfer(userAddr, toUserAmountB, assetIdFromStr(assetIdB))]
903903 else throw("Strict value is not equal to itself.")
904904 }
905905 else throw("Strict value is not equal to itself.")
906906 }
907907
908908
909909
910910 @Callable(i)
911911 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
912912 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
913913 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
914914 })
915915
916916
917917
918918 @Callable(i)
919919 func capitalizeExKeeper (pool,type,tokenToId,amountToExchange,claim,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
920920 let $t03021930413 = if (claim)
921921 then claimFarmed(type, pool)
922922 else {
923923 let claimedAsset = if ((type == SF_POOL))
924924 then SWOPID
925925 else WXID
926926 $Tuple2(amountToExchange, claimedAsset)
927927 }
928928 let claimedAmount = $t03021930413._1
929929 let claimedAsset = $t03021930413._2
930930 let exchangedAmount = exchangeKeeper(tokenToId, amountToExchange, claimedAsset, amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options)
931931 let change = (claimedAmount - amountToExchange)
932932 let changeEntry = if ((change > 0))
933933 then [IntegerEntry((pool + kPoolCapChange), (change + valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)))]
934934 else nil
935935 (capitalize(pool, type, tokenToId, exchangedAmount) ++ changeEntry)
936936 }
937937
938938
939939
940940 @Callable(i)
941941 func capitalizeExPazzle (pool,type,tokenToId,amountToExchange,claim,routesStr,minToReceive,options) = {
942942 let $t03106931263 = if (claim)
943943 then claimFarmed(type, pool)
944944 else {
945945 let claimedAsset = if ((type == SF_POOL))
946946 then SWOPID
947947 else WXID
948948 $Tuple2(amountToExchange, claimedAsset)
949949 }
950950 let claimedAmount = $t03106931263._1
951951 let claimedAsset = $t03106931263._2
952952 let exchangedAmount = exchangePazzle(tokenToId, amountToExchange, claimedAsset, routesStr, minToReceive, options)
953953 let change = (claimedAmount - amountToExchange)
954954 let changeEntry = if ((change > 0))
955955 then [IntegerEntry((pool + kPoolCapChange), (change + valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)))]
956956 else nil
957957 (capitalize(pool, type, tokenToId, exchangedAmount) ++ changeEntry)
958958 }
959959
960960
961961
962962 @Callable(i)
963963 func capitalizeExSwopFi (pool,type,tokenToId,amountToExchange,claim,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
964964 let $t03198632180 = if (claim)
965965 then claimFarmed(type, pool)
966966 else {
967967 let claimedAsset = if ((type == SF_POOL))
968968 then SWOPID
969969 else WXID
970970 $Tuple2(amountToExchange, claimedAsset)
971971 }
972972 let claimedAmount = $t03198632180._1
973973 let claimedAsset = $t03198632180._2
974974 let exchangedAmount = exchangeSwopFi(tokenToId, amountToExchange, claimedAsset, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options)
975975 let change = (claimedAmount - amountToExchange)
976976 let changeEntry = if ((change > 0))
977977 then [IntegerEntry((pool + kPoolCapChange), (change + valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)))]
978978 else nil
979979 (capitalize(pool, type, tokenToId, exchangedAmount) ++ changeEntry)
980980 }
981981
982982
983983
984984 @Callable(i)
985985 func initNewPool (type,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan) = if (if ((type != SF_POOL))
986986 then (type != WX_POOL)
987987 else false)
988988 then throw("Wrong type")
989989 else {
990990 let $t03282532919 = getPoolData(Address(fromBase58String(poolAddr)), type)
991991 let aId = $t03282532919._1
992992 let bId = $t03282532919._2
993993 let aBal = $t03282532919._3
994994 let bBal = $t03282532919._4
995995 let shareId = $t03282532919._5
996996 [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kPoolInterest), 0), StringEntry((kPool + poolAddr), type), StringEntry((shareId + kSharePool), poolAddr)]
997997 }
998998
999999
10001000 @Verifier(tx)
10011001 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
10021002

github/deemru/w8io/873ac7e 
177.55 ms