tx · 98X7kXtp4C3XgihCxXLs8Je8hw12SX4CuKCCALjiR21r

3N6VKmg8fcTLVZtzTGJTd2gfjmK3VYobQf1:  -0.03700000 Waves

2023.05.15 13:00 [2578924] smart account 3N6VKmg8fcTLVZtzTGJTd2gfjmK3VYobQf1 > SELF 0.00000000 Waves

{ "type": 13, "id": "98X7kXtp4C3XgihCxXLs8Je8hw12SX4CuKCCALjiR21r", "fee": 3700000, "feeAssetId": null, "timestamp": 1684144857840, "version": 2, "chainId": 84, "sender": "3N6VKmg8fcTLVZtzTGJTd2gfjmK3VYobQf1", "senderPublicKey": "A2kf7bN5S7rrpJUdubvPFNzkrSEL8uTN8Hc2Sya5cZth", "proofs": [ "9agLTe2kyqD1ZDLRdZzw26jkQdJ9ESdeT63MeWBuSRYJiodryhKmfitL6M5MmZS3j8TH7jhzdHTFxFnuQUna9Hr" ], "script": "base64:BgJlCAISBAoCCAgSAwoBCBIAEgMKAQgSDwoNCAEBAQEBAQgBAQEBARIMCgoIAQEBCAEBAQEIEgUKAwgIARIICgYICAEBAQESDgoMCAgBAQEBAQEICAEBEgMKAQESBAoCAQgSBAoCAQhCABRrX2Nvb3JkaW5hdG9yQWRkcmVzcwIUa19jb29yZGluYXRvckFkZHJlc3MAD2tfYWRtaW5fYWRkcmVzcwIPa19hZG1pbl9hZGRyZXNzAA1rX3F1b3RlX2Fzc2V0Ag1rX3F1b3RlX2Fzc2V0AAVrX2FtbQIFa19hbW0AEWtfbWFuYWdlcl9hZGRyZXNzAhFrX21hbmFnZXJfYWRkcmVzcwASa19wb3NpdGlvblNlcXVlbmNlAhJrX3Bvc2l0aW9uU2VxdWVuY2UADmtfcG9zaXRpb25TaXplAg5rX3Bvc2l0aW9uU2l6ZQAQa19leGVjdXRlZE9yZGVycwIQa19leGVjdXRlZE9yZGVycwAQa19jYW5jZWxlZE9yZGVycwIQa19jYW5jZWxlZE9yZGVycwAHa19vcmRlcgIHa19vcmRlcgAOa19vcmRlclJlcXVlc3QCCmtfb3JkZXJSZXEADWtfbGFzdE9yZGVySWQCDWtfbGFzdE9yZGVySWQAEGtfdHJhZGVyT3JkZXJDbnQCEGtfdHJhZGVyT3JkZXJDbnQAEGtfdHJhZGVyT3JkZXJJZHMCEGtfdHJhZGVyT3JkZXJJZHMACGtfc2VuZGVyAghrX3NlbmRlcgANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAAEU1RPUAABAARUQUtFAAIABUxJTUlUAAMABExPTkcAAQAFU0hPUlQAAgAISU5DUkVBU0UAAQAIREVDUkVBU0UAAgAZTUFYX1RSQURFUl9PUkRFUlNfUEVSX0FNTQAKAARUSU1FCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAMREVDSU1BTF9VTklUCQBoAgABCQBoAgkAaAIJAGgCCQBoAgkAaAIACgAKAAoACgAKAAoADFNQUkVBRF9MSU1JVAkAaQIFDERFQ0lNQUxfVU5JVADIAQEDYWJzAQJfeAMJAGYCBQJfeAAABQJfeAkBAS0BBQJfeAEEZGl2ZAICX3gCX3kJAG4EBQJfeAUMREVDSU1BTF9VTklUBQJfeQUISEFMRkVWRU4BBG11bGQCAl94Al95CQBuBAUCX3gFAl95BQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAQRtaW52AgJfeAJfeQMJAGYCBQJfeAUCX3kFAl95BQJfeAEOdG9Db21wb3NpdGVLZXkCBF9rZXkIX2FkZHJlc3MJAKwCAgkArAICBQRfa2V5AgFfBQhfYWRkcmVzcwEQZXhlY3V0ZWRPcmRlcktleQEIX29yZGVySWQJAKwCAgkArAICBRBrX2V4ZWN1dGVkT3JkZXJzAgFfCQCkAwEFCF9vcmRlcklkARBjYW5jZWxlZE9yZGVyS2V5AQhfb3JkZXJJZAkArAICCQCsAgIFEGtfY2FuY2VsZWRPcmRlcnMCAV8JAKQDAQUIX29yZGVySWQBCG9yZGVyS2V5AQhfb3JkZXJJZAkBDnRvQ29tcG9zaXRlS2V5AgUHa19vcmRlcgkApAMBBQhfb3JkZXJJZAEPb3JkZXJSZXF1ZXN0S2V5Aghfb3JkZXJJZAVfdHlwZQkArAICCQCsAgIJAKwCAgkArAICBQ5rX29yZGVyUmVxdWVzdAIBXwkApAMBBQhfb3JkZXJJZAIBXwkApAMBBQVfdHlwZQETdHJhZGVyT3JkZXJDb3VudEtleQIEX2FtbQdfdHJhZGVyCQCsAgIJAKwCAgkArAICCQCsAgIFEGtfdHJhZGVyT3JkZXJDbnQCAV8FBF9hbW0CAV8FB190cmFkZXIBEXRyYWRlck9yZGVySWRzS2V5AgRfYW1tB190cmFkZXIJAKwCAgkArAICCQCsAgIJAKwCAgUQa190cmFkZXJPcmRlcklkcwIBXwUEX2FtbQIBXwUHX3RyYWRlcgELY29vcmRpbmF0b3IACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MCE0Nvb3JkaW5hdG9yIG5vdCBzZXQBCnF1b3RlQXNzZXQACQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFDWtfcXVvdGVfYXNzZXQBDm1hbmFnZXJBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEWtfbWFuYWdlcl9hZGRyZXNzAg9NYW5hZ2VyIG5vdCBzZXQBC2lzV2hpdGVsaXN0AQhfYWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmwgCCQELY29vcmRpbmF0b3IACQEOdG9Db21wb3NpdGVLZXkCBQVrX2FtbQUIX2FkZHJlc3MHAQtpbml0aWFsaXplZAAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUNa19pbml0aWFsaXplZAcBB2lzVmFsaWQBCF9vcmRlcklkAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQEQZXhlY3V0ZWRPcmRlcktleQEFCF9vcmRlcklkBwkAAgEJAKwCAgIYT3JkZXIgYWxyZWFkeSBleGVjdXRlZDogCQCkAwEFCF9vcmRlcklkAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQEQY2FuY2VsZWRPcmRlcktleQEFCF9vcmRlcklkBwkAAgEJAKwCAgIZT3JkZXIgYWxyZWFkeSBjYW5jZWxsZWQ6IAkApAMBBQhfb3JkZXJJZAYBDmN1cnJlbnRPcmRlcklkAAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ1rX2xhc3RPcmRlcklkAAABE2dldFRyYWRlck9yZGVyQ291bnQCBF9hbW0HX3RyYWRlcgQDa2V5CQETdHJhZGVyT3JkZXJDb3VudEtleQIFBF9hbW0FB190cmFkZXIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABEnRyYWRlckFtbU9yZGVyc0lkcwIEX2FtbQdfdHJhZGVyBANrZXkJARF0cmFkZXJPcmRlcklkc0tleQIFBF9hbW0FB190cmFkZXIEA3ZhbAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAMJAAACBQN2YWwCAAUDbmlsCQC1CQIFA3ZhbAIBLAEQaGF2ZU9yZGVyUmVxdWVzdAIIX29yZGVySWQFX3R5cGUEA2tleQkBD29yZGVyUmVxdWVzdEtleQIFCF9vcmRlcklkBQVfdHlwZQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5AQ9nZXRPcmRlclJlcXVlc3QCCF9vcmRlcklkBV90eXBlBANrZXkJAQ9vcmRlclJlcXVlc3RLZXkCBQhfb3JkZXJJZAUFX3R5cGUED29yZGVyUmVxdWVzdFN0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFA2tleQkArAICAhtOb3Qgb3JkZXIgcmVxdWVzdCBmb3Iga2V5OiAFA2tleQQUb3JkZXJSZXF1ZXN0UGFydExpc3QJALUJAgUPb3JkZXJSZXF1ZXN0U3RyAgEsBAdvcmRlcklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBRRvcmRlclJlcXVlc3RQYXJ0TGlzdAAAAg9JbnZhbGlkIG9yZGVySWQEA2FtbQkAkQMCBRRvcmRlclJlcXVlc3RQYXJ0TGlzdAABBAZ0cmFkZXIJAJEDAgUUb3JkZXJSZXF1ZXN0UGFydExpc3QAAgQEdHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUUb3JkZXJSZXF1ZXN0UGFydExpc3QAAwIMSW52YWxpZCB0eXBlBAx0cmlnZ2VyUHJpY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFFG9yZGVyUmVxdWVzdFBhcnRMaXN0AAQCFEludmFsaWQgdHJpZ2dlclByaWNlBApsaW1pdFByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBRRvcmRlclJlcXVlc3RQYXJ0TGlzdAAFAhJJbnZhbGlkIGxpbWl0UHJpY2UJAJgKBgUHb3JkZXJJZAUDYW1tBQZ0cmFkZXIFBHR5cGUFDHRyaWdnZXJQcmljZQUKbGltaXRQcmljZQEIZ2V0T3JkZXIBCF9vcmRlcklkBAhvcmRlclN0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAQhvcmRlcktleQEFCF9vcmRlcklkCQCsAgICEkludmFsaWQgb3JkZXIgaWQ6IAkApAMBBQhfb3JkZXJJZAQNb3JkZXJQYXJ0TGlzdAkAtQkCBQhvcmRlclN0cgIBLAQDYW1tCQCRAwIFDW9yZGVyUGFydExpc3QAAAQGdHJhZGVyCQCRAwIFDW9yZGVyUGFydExpc3QAAQQIYW1vdW50SW4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QAAgIQSW52YWxpZCBhbW91bnRJbgQIbGV2ZXJhZ2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QAAwIQSW52YWxpZCBsZXZlcmFnZQQEdHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAEAgxJbnZhbGlkIHR5cGUEDHRyaWdnZXJQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAFAhRJbnZhbGlkIHRyaWdnZXJQcmljZQQLcGF5bWVudFVzZG4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QABgITSW52YWxpZCBwYXltZW50VXNkbgQEc2lkZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAHAgxJbnZhbGlkIHNpZGUEB3JlZkxpbmsJAJEDAgUNb3JkZXJQYXJ0TGlzdAAIBApwb3NpdGlvbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQ1vcmRlclBhcnRMaXN0AAkCEkludmFsaWQgcG9zaXRpb25JZAQKbGltaXRQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAKAhJJbnZhbGlkIGxpbWl0UHJpY2UECmV4cGlyYXRpb24DCQBmAgkAkAMBBQ1vcmRlclBhcnRMaXN0AAsJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QACwISSW52YWxpZCBsaW1pdFByaWNlAAAJAJ4KDAUDYW1tBQZ0cmFkZXIFCGFtb3VudEluBQhsZXZlcmFnZQUEdHlwZQUMdHJpZ2dlclByaWNlBQtwYXltZW50VXNkbgUEc2lkZQUHcmVmTGluawUKcG9zaXRpb25JZAUKbGltaXRQcmljZQUKZXhwaXJhdGlvbgEOZ2V0TWFya2V0UHJpY2UBBF9hbW0EAXMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUEX2FtbQIQY29tcHV0ZVNwb3RQcmljZQUDbmlsBQNuaWwDCQAAAgUBcwUBcwQDcmVzBAckbWF0Y2gwBQFzAwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgECH0ludmFsaWQgY29tcHV0ZVNwb3RQcmljZSByZXN1bHQJAQV2YWx1ZQEFA3JlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEGZ2V0RmVlAgRfYW1tB190cmFkZXIEAXMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUEX2FtbQIfY29tcHV0ZUZlZUZvclRyYWRlcldpdGhBcnRpZmFjdAkAzAgCBQdfdHJhZGVyCQDMCAICAAUDbmlsBQNuaWwDCQAAAgUBcwUBcwQDcmVzBAckbWF0Y2gwBQFzAwkAAQIFByRtYXRjaDACDihJbnQsIEJvb2xlYW4pBAF0BQckbWF0Y2gwCAUBdAJfMQkAAgECLkludmFsaWQgY29tcHV0ZUZlZUZvclRyYWRlcldpdGhBcnRpZmFjdCByZXN1bHQJAQV2YWx1ZQEFA3JlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEUZ2V0UG9zaXRpb25EaXJlY3Rpb24CCl9vcmRlclNpZGUKX29yZGVyVHlwZQMDCQAAAgUKX29yZGVyVHlwZQUEVEFLRQYJAAACBQpfb3JkZXJUeXBlBQRTVE9QAwkAAAIFCl9vcmRlclNpZGUFBExPTkcFBVNIT1JUBQRMT05HBQpfb3JkZXJTaWRlAQ9nZXRQb3NpdGlvblNpemUDBF9hbW0HX3RyYWRlcgpfZGlyZWN0aW9uBANhbW0JARFAZXh0ck5hdGl2ZSgxMDYyKQEFBF9hbW0EC3Bvc2l0aW9uS2V5CQCsAgIJAKwCAgUHX3RyYWRlcgIBXwkApAMBBQpfZGlyZWN0aW9uBAdzaXplS2V5CQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQULcG9zaXRpb25LZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUDYW1tBQdzaXplS2V5AAABDWdldFBvc2l0aW9uSWQDBF9hbW0HX3RyYWRlcgpfZGlyZWN0aW9uBANhbW0JARFAZXh0ck5hdGl2ZSgxMDYyKQEFBF9hbW0EC3Bvc2l0aW9uS2V5CQCsAgIJAKwCAgUHX3RyYWRlcgIBXwkApAMBBQpfZGlyZWN0aW9uBAZzZXFLZXkJAQ50b0NvbXBvc2l0ZUtleQIFEmtfcG9zaXRpb25TZXF1ZW5jZQULcG9zaXRpb25LZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUDYW1tBQZzZXFLZXkAAAEJZ2V0U3ByZWFkAQZfcHJpY2UJAQRtdWxkAgUGX3ByaWNlBQxTUFJFQURfTElNSVQBCXNhdmVPcmRlcg0IX29yZGVySWQEX2FtbQdfdHJhZGVyCV9hbW91bnRJbglfbGV2ZXJhZ2UFX3R5cGUNX3RyaWdnZXJQcmljZQxfcGF5bWVudFVzZG4FX3NpZGUIX3JlZkxpbmsLX3Bvc2l0aW9uSWQLX2xpbWl0UHJpY2ULX2V4cGlyYXRpb24ECG9yZGVyU3RyCQC5CQIJAMwIAgUEX2FtbQkAzAgCBQdfdHJhZGVyCQDMCAIJAKQDAQUJX2Ftb3VudEluCQDMCAIJAKQDAQUJX2xldmVyYWdlCQDMCAIJAKQDAQUFX3R5cGUJAMwIAgkApAMBBQ1fdHJpZ2dlclByaWNlCQDMCAIJAKQDAQUMX3BheW1lbnRVc2RuCQDMCAIJAKQDAQUFX3NpZGUJAMwIAgUIX3JlZkxpbmsJAMwIAgkApAMBBQtfcG9zaXRpb25JZAkAzAgCCQCkAwEFC19saW1pdFByaWNlCQDMCAIJAKQDAQULX2V4cGlyYXRpb24FA25pbAIBLAkAzAgCCQELU3RyaW5nRW50cnkCCQEIb3JkZXJLZXkBBQhfb3JkZXJJZAUIb3JkZXJTdHIFA25pbAEQc2F2ZU9yZGVyUmVxdWVzdAYIX29yZGVySWQEX2FtbQdfdHJhZGVyBV90eXBlDV90cmlnZ2VyUHJpY2ULX2xpbWl0UHJpY2UEC29yZGVyUmVxU3RyCQC5CQIJAMwIAgkApAMBBQhfb3JkZXJJZAkAzAgCBQRfYW1tCQDMCAIFB190cmFkZXIJAMwIAgkApAMBBQVfdHlwZQkAzAgCCQCkAwEFDV90cmlnZ2VyUHJpY2UJAMwIAgkApAMBBQtfbGltaXRQcmljZQUDbmlsAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9vcmRlclJlcXVlc3RLZXkCBQhfb3JkZXJJZAUFX3R5cGUFC29yZGVyUmVxU3RyBQNuaWwBEHVwZGF0ZU9yZGVySWRTdHIDD19vcmRlcklkc05ld1N0cgRfYW1tB190cmFkZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEXRyYWRlck9yZGVySWRzS2V5AgUEX2FtbQUHX3RyYWRlcgUPX29yZGVySWRzTmV3U3RyBQNuaWwBFGFkZFJlbW92ZU9yZGVySWRMaXN0BQlfb3JkZXJJZHMIX29yZGVySWQEX2FtbQdfdHJhZGVyBF9hZGQEC29yZGVySWRzTmV3AwUEX2FkZAkAzQgCBQlfb3JkZXJJZHMJAKQDAQUIX29yZGVySWQJANEIAgUJX29yZGVySWRzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUJX29yZGVySWRzCQCkAwEFCF9vcmRlcklkCQCsAgICEk5vIG9yZGVyIHdpdGggaWQ6IAkApAMBBQhfb3JkZXJJZAULb3JkZXJJZHNOZXcBEGFkZFJlbW92ZU9yZGVySWQECF9vcmRlcklkBF9hbW0HX3RyYWRlcgRfYWRkBAhvcmRlcklkcwkBEnRyYWRlckFtbU9yZGVyc0lkcwIFBF9hbW0FB190cmFkZXIEC29yZGVySWRzTmV3CQEUYWRkUmVtb3ZlT3JkZXJJZExpc3QFBQhvcmRlcklkcwUIX29yZGVySWQFBF9hbW0FB190cmFkZXIFBF9hZGQEDm9yZGVySWRzTmV3U3RyCQC5CQIFC29yZGVySWRzTmV3AgEsCQEQdXBkYXRlT3JkZXJJZFN0cgMFDm9yZGVySWRzTmV3U3RyBQRfYW1tBQdfdHJhZGVyARZ1cGRhdGVUcmFkZXJPcmRlckNvdW50AwRfYW1tB190cmFkZXIGX2NvdW50AwkAZgIAAAUGX2NvdW50CQACAQkArAICAhVJbnZhbGlkIG9yZGVyIGNvdW50OiAJAKQDAQUGX2NvdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETdHJhZGVyT3JkZXJDb3VudEtleQIFBF9hbW0FB190cmFkZXIFBl9jb3VudAUDbmlsARF1cGRhdGVMYXN0T3JkZXJJZAEMX2xhc3RPcmRlcklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rX2xhc3RPcmRlcklkBQxfbGFzdE9yZGVySWQFA25pbAEQbWFya0V4ZWN1dGVPcmRlcgEIX29yZGVySWQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEGtfZXhlY3V0ZWRPcmRlcnMJAKQDAQUIX29yZGVySWQGBQNuaWwBD21hcmtDYW5jZWxPcmRlcgEIX29yZGVySWQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEGtfY2FuY2VsZWRPcmRlcnMJAKQDAQUIX29yZGVySWQGBQNuaWwBDmdldFBvc2l0aW9uSWRzAgRfYW1tB190cmFkZXIEEGxvbmdQb3NpdGlvblNpemUJAQ9nZXRQb3NpdGlvblNpemUDBQRfYW1tBQdfdHJhZGVyBQRMT05HBBVjdXJyZW50TG9uZ1Bvc2l0aW9uSWQDCQECIT0CBRBsb25nUG9zaXRpb25TaXplAAAJAQ1nZXRQb3NpdGlvbklkAwUEX2FtbQUHX3RyYWRlcgUETE9ORwAABBFzaG9ydFBvc2l0aW9uU2l6ZQkBD2dldFBvc2l0aW9uU2l6ZQMFBF9hbW0FB190cmFkZXIFBVNIT1JUBBZjdXJyZW50U2hvcnRQb3NpdGlvbklkAwkBAiE9AgURc2hvcnRQb3NpdGlvblNpemUAAAkBDWdldFBvc2l0aW9uSWQDBQRfYW1tBQdfdHJhZGVyBQVTSE9SVAAACQDMCAIFFWN1cnJlbnRMb25nUG9zaXRpb25JZAkAzAgCBRZjdXJyZW50U2hvcnRQb3NpdGlvbklkBQNuaWwMAWkBEmNsZWFuVXBTdGFsZU9yZGVycwIEX2FtbQdfdHJhZGVyBAZvcmRlcnMJARJ0cmFkZXJBbW1PcmRlcnNJZHMCBQRfYW1tBQdfdHJhZGVyBAtwb3NpdGlvbklkcwkBDmdldFBvc2l0aW9uSWRzAgUEX2FtbQUHX3RyYWRlcgoBCmNsZWFuVXBPbmUCBF9hY2MIX29yZGVySWQECm9yZGVySWRJbnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBBQhfb3JkZXJJZAIQSW52YWxpZCBvcmRlciBpZAQNJHQwMTEzNTkxMTU3NQkBCGdldE9yZGVyAQUKb3JkZXJJZEludAQDX3gxCAUNJHQwMTEzNTkxMTU3NQJfMQQDX3gyCAUNJHQwMTEzNTkxMTU3NQJfMgQDX3gzCAUNJHQwMTEzNTkxMTU3NQJfMwQDX3g0CAUNJHQwMTEzNTkxMTU3NQJfNAQFX3R5cGUIBQ0kdDAxMTM1OTExNTc1Al81BANfeDUIBQ0kdDAxMTM1OTExNTc1Al82BANfeDYIBQ0kdDAxMTM1OTExNTc1Al83BANfeDcIBQ0kdDAxMTM1OTExNTc1Al84BANfeDgIBQ0kdDAxMTM1OTExNTc1Al85BAtfcG9zaXRpb25JZAgFDSR0MDExMzU5MTE1NzUDXzEwBANfeDkIBQ0kdDAxMTM1OTExNTc1A18xMQQLX2V4cGlyYXRpb24IBQ0kdDAxMTM1OTExNTc1A18xMgQaY2FuY2VsVGFrZVN0b3BPZk5vUG9zaXRpb24DAwMJAAACBQVfdHlwZQUEU1RPUAYJAAACBQVfdHlwZQUEVEFLRQkBAiE9AgkAkQMCBQtwb3NpdGlvbklkcwAABQtfcG9zaXRpb25JZAcJAQIhPQIJAJEDAgULcG9zaXRpb25JZHMAAQULX3Bvc2l0aW9uSWQHBBRjYW5jZWxMaW1pdElmRXhwaXJlZAMJAAACBQVfdHlwZQUFTElNSVQJAGcCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAULX2V4cGlyYXRpb24HAwMFGmNhbmNlbFRha2VTdG9wT2ZOb1Bvc2l0aW9uBgUUY2FuY2VsTGltaXRJZkV4cGlyZWQEBmNoYW5nZQkBD21hcmtDYW5jZWxPcmRlcgEFCm9yZGVySWRJbnQEDG5ld09yZGVyTGlzdAkBFGFkZFJlbW92ZU9yZGVySWRMaXN0BQgFBF9hY2MCXzEFCm9yZGVySWRJbnQFBF9hbW0FB190cmFkZXIHCQCUCgIFDG5ld09yZGVyTGlzdAkAzggCCAUEX2FjYwJfMgUGY2hhbmdlBQRfYWNjBA0kdDAxMjEwNzEyMTgyCgACJGwFBm9yZGVycwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUGb3JkZXJzBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmNsZWFuVXBPbmUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoECW5ld09yZGVycwgFDSR0MDEyMTA3MTIxODICXzEEDWNhbmNlbEFjdGlvbnMIBQ0kdDAxMjEwNzEyMTgyAl8yCQDOCAIJAM4IAgUNY2FuY2VsQWN0aW9ucwkBFnVwZGF0ZVRyYWRlck9yZGVyQ291bnQDBQRfYW1tBQdfdHJhZGVyCQCQAwEFCW5ld09yZGVycwkBEHVwZGF0ZU9yZGVySWRTdHIDCQC5CQIFCW5ld09yZGVycwIBLAUEX2FtbQUHX3RyYWRlcgFpAQpzZXRDb250ZXh0AQdfc2VuZGVyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIOT25seSBzZWxmLWNhbGwJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa19zZW5kZXIFB19zZW5kZXIFA25pbAFpAQxyZXNldENvbnRleHQAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIOT25seSBzZWxmLWNhbGwJAMwIAgkBC0RlbGV0ZUVudHJ5AQUIa19zZW5kZXIFA25pbAFpAQppbml0aWFsaXplAQxfY29vcmRpbmF0b3IDAwkBC2luaXRpYWxpemVkAAYJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECFFVuYWJsZSB0byBpbml0aWFsaXplCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzCQClCAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDF9jb29yZGluYXRvcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa19pbml0aWFsaXplZAYFA25pbAFpAQtjcmVhdGVPcmRlcg0EX2FtbQVfdHlwZQ1fdHJpZ2dlclByaWNlC19saW1pdFByaWNlCV9hbW91bnRJbglfbGV2ZXJhZ2UFX3NpZGUIX3JlZkxpbmsRX3N0b3BUcmlnZ2VyUHJpY2UPX3N0b3BMaW1pdFByaWNlEV90YWtlVHJpZ2dlclByaWNlD190YWtlTGltaXRQcmljZQtfZXhwaXJhdGlvbgQHX3RyYWRlcgkApQgBCAUBaQZjYWxsZXIEB2NsZWFuVXAJAPwHBAUEdGhpcwISY2xlYW5VcFN0YWxlT3JkZXJzCQDMCAIFBF9hbW0JAMwIAgUHX3RyYWRlcgUDbmlsBQNuaWwDCQAAAgUHY2xlYW5VcAUHY2xlYW5VcAMJAGYCCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAjVJbnZhbGlkIGNyZWF0ZU9yZGVyIHBhcmFtZXRlcnM6IGludmFsaWQgcGF5bWVudCBjb3VudAQNJHQwMTQ3MDAxNDk1MgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJQKAgkA2AQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIQSW52YWxpZCBhc3NldCBpZAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAJQKAgIAAAAEDnBheW1lbnRBc3NldElkCAUNJHQwMTQ3MDAxNDk1MgJfMQQNcGF5bWVudEFtb3VudAgFDSR0MDE0NzAwMTQ5NTICXzIEBmRvQ2FsbAkA/AcEBQR0aGlzAhNpbnRlcm5hbENyZWF0ZU9yZGVyCQDMCAIFB190cmFkZXIJAMwIAgUEX2FtbQkAzAgCBQVfdHlwZQkAzAgCBQ1fdHJpZ2dlclByaWNlCQDMCAIFC19saW1pdFByaWNlCQDMCAIFCV9hbW91bnRJbgkAzAgCBQlfbGV2ZXJhZ2UJAMwIAgUFX3NpZGUJAMwIAgUIX3JlZkxpbmsJAMwIAgUOcGF5bWVudEFzc2V0SWQJAMwIAgUNcGF5bWVudEFtb3VudAkAzAgCBQtfZXhwaXJhdGlvbgUDbmlsBQNuaWwDCQAAAgUGZG9DYWxsBQZkb0NhbGwEB29yZGVySWQEByRtYXRjaDAFBmRvQ2FsbAMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAFAXQJAAIBAhtJbnZhbGlkIElEIG9mIGNyZWF0ZWQgb3JkZXIDCQAAAgUFX3R5cGUFBUxJTUlUBAhtYWtlU3RvcAMJAGYCBRFfc3RvcFRyaWdnZXJQcmljZQAABApkb01ha2VTdG9wCQD8BwQFBHRoaXMCGmludGVybmFsQ3JlYXRlT3JkZXJSZXF1ZXN0CQDMCAIFB190cmFkZXIJAMwIAgUEX2FtbQkAzAgCBQdvcmRlcklkCQDMCAIFBFNUT1AJAMwIAgURX3N0b3BUcmlnZ2VyUHJpY2UJAMwIAgUPX3N0b3BMaW1pdFByaWNlBQNuaWwFA25pbAMJAAACBQpkb01ha2VTdG9wBQpkb01ha2VTdG9wBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAQIbWFrZVRha2UDCQBmAgURX3Rha2VUcmlnZ2VyUHJpY2UAAAQKZG9NYWtlVGFrZQkA/AcEBQR0aGlzAhppbnRlcm5hbENyZWF0ZU9yZGVyUmVxdWVzdAkAzAgCBQdfdHJhZGVyCQDMCAIFBF9hbW0JAMwIAgUHb3JkZXJJZAkAzAgCBQRUQUtFCQDMCAIFEV90YWtlVHJpZ2dlclByaWNlCQDMCAIFD190YWtlTGltaXRQcmljZQUDbmlsBQNuaWwDCQAAAgUKZG9NYWtlVGFrZQUKZG9NYWtlVGFrZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAM4IAgUIbWFrZVN0b3AFCG1ha2VUYWtlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEcaW5jcmVhc2VQb3NpdGlvbldpdGhTdG9wTG9zcwoEX2FtbQpfZGlyZWN0aW9uCV9sZXZlcmFnZRNfbWluQmFzZUFzc2V0QW1vdW50CF9yZWZMaW5rEV9zdG9wVHJpZ2dlclByaWNlD19zdG9wTGltaXRQcmljZRFfdGFrZVRyaWdnZXJQcmljZQ9fdGFrZUxpbWl0UHJpY2UKX3ByaWNlRGF0YQQHX3RyYWRlcgkApQgBCAUBaQZjYWxsZXIEB2NsZWFuVXAJAPwHBAUEdGhpcwISY2xlYW5VcFN0YWxlT3JkZXJzCQDMCAIFBF9hbW0JAMwIAgUHX3RyYWRlcgUDbmlsBQNuaWwDCQAAAgUHY2xlYW5VcAUHY2xlYW5VcAMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEJAQtpc1doaXRlbGlzdAEFBF9hbW0JAAIBAi9JbnZhbGlkIGluY3JlYXNlUG9zaXRpb25XaXRoU3RvcExvc3MgcGFyYW1ldGVycwQMcG9zaXRpb25TaXplCQEPZ2V0UG9zaXRpb25TaXplAwUEX2FtbQUHX3RyYWRlcgUKX2RpcmVjdGlvbgMJAQIhPQIFDHBvc2l0aW9uU2l6ZQAACQACAQJCSW52YWxpZCBpbmNyZWFzZVBvc2l0aW9uV2l0aFN0b3BMb3NzIHBhcmFtZXRlcnM6IG9ubHkgbmV3IHBvc2l0aW9uBAxkb1NldENvbnRleHQJAPwHBAUEdGhpcwIKc2V0Q29udGV4dAkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBQxkb1NldENvbnRleHQFDGRvU2V0Q29udGV4dAQPZG9DbG9zZVBvc2l0aW9uCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBF9hbW0CEGluY3JlYXNlUG9zaXRpb24JAMwIAgUKX2RpcmVjdGlvbgkAzAgCBQlfbGV2ZXJhZ2UJAMwIAgUTX21pbkJhc2VBc3NldEFtb3VudAkAzAgCBQhfcmVmTGluawkAzAgCBQpfcHJpY2VEYXRhBQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFD2RvQ2xvc2VQb3NpdGlvbgUPZG9DbG9zZVBvc2l0aW9uBA5kb1Jlc2V0Q29udGV4dAkA/AcEBQR0aGlzAgxyZXNldENvbnRleHQFA25pbAUDbmlsAwkAAAIFDmRvUmVzZXRDb250ZXh0BQ5kb1Jlc2V0Q29udGV4dAQSb3BlbmVkUG9zaXRpb25TaXplCQEPZ2V0UG9zaXRpb25TaXplAwUEX2FtbQUHX3RyYWRlcgUKX2RpcmVjdGlvbgMJAAACBRJvcGVuZWRQb3NpdGlvblNpemUFEm9wZW5lZFBvc2l0aW9uU2l6ZQQIYW1vdW50SW4JAQNhYnMBBRJvcGVuZWRQb3NpdGlvblNpemUEDHN0b3BMb3NzU2lkZQMJAGYCAAAFEm9wZW5lZFBvc2l0aW9uU2l6ZQUETE9ORwUFU0hPUlQEEWRvQ3JlYXRlU3RvcE9yZGVyAwkAZgIFEV9zdG9wVHJpZ2dlclByaWNlAAAEEWRvQ3JlYXRlU3RvcE9yZGVyCQD8BwQFBHRoaXMCE2ludGVybmFsQ3JlYXRlT3JkZXIJAMwIAgUHX3RyYWRlcgkAzAgCBQRfYW1tCQDMCAIFBFNUT1AJAMwIAgURX3N0b3BUcmlnZ2VyUHJpY2UJAMwIAgUPX3N0b3BMaW1pdFByaWNlCQDMCAIFCGFtb3VudEluCQDMCAIAAAkAzAgCBQxzdG9wTG9zc1NpZGUJAMwIAgUIX3JlZkxpbmsJAMwIAgIACQDMCAIAAAkAzAgCAAAFA25pbAUDbmlsAwkAAAIFEWRvQ3JlYXRlU3RvcE9yZGVyBRFkb0NyZWF0ZVN0b3BPcmRlcgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgURZG9DcmVhdGVTdG9wT3JkZXIFEWRvQ3JlYXRlU3RvcE9yZGVyBBFkb0NyZWF0ZVRha2VPcmRlcgMJAGYCBRFfdGFrZVRyaWdnZXJQcmljZQAABBFkb0NyZWF0ZVRha2VPcmRlcgkA/AcEBQR0aGlzAhNpbnRlcm5hbENyZWF0ZU9yZGVyCQDMCAIFB190cmFkZXIJAMwIAgUEX2FtbQkAzAgCBQRUQUtFCQDMCAIFEV90YWtlVHJpZ2dlclByaWNlCQDMCAIFD190YWtlTGltaXRQcmljZQkAzAgCBQhhbW91bnRJbgkAzAgCAAAJAMwIAgUMc3RvcExvc3NTaWRlCQDMCAIFCF9yZWZMaW5rCQDMCAICAAkAzAgCAAAJAMwIAgAABQNuaWwFA25pbAMJAAACBRFkb0NyZWF0ZVRha2VPcmRlcgURZG9DcmVhdGVUYWtlT3JkZXIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFEWRvQ3JlYXRlVGFrZU9yZGVyBRFkb0NyZWF0ZVRha2VPcmRlcgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGWludGVybmFsTWFya09yZGVyRXhlY3V0ZWQDBF9hbW0HX3RyYWRlcghfb3JkZXJJZAMDAwkBASEBCQELaW5pdGlhbGl6ZWQABgkBASEBCQELaXNXaGl0ZWxpc3QBBQRfYW1tBgkBASEBCQAAAggFAWkGY2FsbGVyBQR0aGlzCQACAQIsSW52YWxpZCBpbnRlcm5hbE1hcmtPcmRlckV4ZWN1dGVkIHBhcmFtZXRlcnMEE25ld1RyYWRlck9yZGVyQ291bnQJAGUCCQETZ2V0VHJhZGVyT3JkZXJDb3VudAIFBF9hbW0FB190cmFkZXIAAQkAzggCCQDOCAIJARZ1cGRhdGVUcmFkZXJPcmRlckNvdW50AwUEX2FtbQUHX3RyYWRlcgUTbmV3VHJhZGVyT3JkZXJDb3VudAkBEGFkZFJlbW92ZU9yZGVySWQEBQhfb3JkZXJJZAUEX2FtbQUHX3RyYWRlcgcJARBtYXJrRXhlY3V0ZU9yZGVyAQUIX29yZGVySWQBaQEaaW50ZXJuYWxDcmVhdGVPcmRlclJlcXVlc3QGB190cmFkZXIEX2FtbQhfb3JkZXJJZAVfdHlwZQ1fdHJpZ2dlclByaWNlC19saW1pdFByaWNlAwMDAwMJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQkBC2lzV2hpdGVsaXN0AQUEX2FtbQYJAGcCAAAFDV90cmlnZ2VyUHJpY2UGCQBmAgAABQtfbGltaXRQcmljZQYJAQEhAQkAAAIIBQFpBmNhbGxlcgUEdGhpcwkAAgECLUludmFsaWQgaW50ZXJuYWxDcmVhdGVPcmRlclJlcXVlc3QgcGFyYW1ldGVycwkBEHNhdmVPcmRlclJlcXVlc3QGBQhfb3JkZXJJZAUEX2FtbQUHX3RyYWRlcgUFX3R5cGUFDV90cmlnZ2VyUHJpY2UFC19saW1pdFByaWNlAWkBE2ludGVybmFsQ3JlYXRlT3JkZXIMB190cmFkZXIEX2FtbQVfdHlwZQ1fdHJpZ2dlclByaWNlC19saW1pdFByaWNlCV9hbW91bnRJbglfbGV2ZXJhZ2UFX3NpZGUIX3JlZkxpbmsPX3BheW1lbnRBc3NldElkDl9wYXltZW50QW1vdW50C19leHBpcmF0aW9uAwMDAwMDAwMDAwkBASEBCQELaW5pdGlhbGl6ZWQABgkBASEBCQELaXNXaGl0ZWxpc3QBBQRfYW1tBgkAZwIAAAUNX3RyaWdnZXJQcmljZQYJAGYCAAAFC19saW1pdFByaWNlBgkAZwIAAAUJX2Ftb3VudEluBgkAZgIAAAUJX2xldmVyYWdlBgkBASEBAwkAAAIFBV9zaWRlBQRMT05HBgkAAAIFBV9zaWRlBQVTSE9SVAYJAQEhAQMDCQAAAgUFX3R5cGUFBFNUT1AGCQAAAgUFX3R5cGUFBFRBS0UGCQAAAgUFX3R5cGUFBUxJTUlUBgkBASEBCQAAAggFAWkGY2FsbGVyBQR0aGlzBgkAZgIAAAULX2V4cGlyYXRpb24JAAIBAiZJbnZhbGlkIGludGVybmFsQ3JlYXRlT3JkZXIgcGFyYW1ldGVycwQHb3JkZXJJZAkAZAIJAQ5jdXJyZW50T3JkZXJJZAAAAQQRcG9zaXRpb25EaXJlY3Rpb24JARRnZXRQb3NpdGlvbkRpcmVjdGlvbgIFBV9zaWRlBQVfdHlwZQQTbmV3VHJhZGVyT3JkZXJDb3VudAkAZAIJARNnZXRUcmFkZXJPcmRlckNvdW50AgUEX2FtbQUHX3RyYWRlcgABBAxwb3NpdGlvblNpemUJAQ9nZXRQb3NpdGlvblNpemUDBQRfYW1tBQdfdHJhZGVyBRFwb3NpdGlvbkRpcmVjdGlvbgQKX2RpcmVjdGlvbgMDAwkAAAIFDHBvc2l0aW9uU2l6ZQAABgMJAGYCBQxwb3NpdGlvblNpemUAAAkAAAIFBV9zaWRlBQRMT05HBwYDCQBmAgAABQxwb3NpdGlvblNpemUJAAACBQVfc2lkZQUFU0hPUlQHBQhJTkNSRUFTRQUIREVDUkVBU0UDAwkAAAIFDHBvc2l0aW9uU2l6ZQAAAwkAAAIFBV90eXBlBQRTVE9QBgkAAAIFBV90eXBlBQRUQUtFBwkAAgECK0NhbiBub3QgY3JlYXRlIFNUT1AvVEFLRSBvcmRlcjogbm8gcG9zaXRpb24EC3VzZG5QYXltZW50AwkAAAIFCl9kaXJlY3Rpb24FCElOQ1JFQVNFAwMJAQIhPQIFD19wYXltZW50QXNzZXRJZAkA2AQBCQEKcXVvdGVBc3NldAAGCQECIT0CBQ5fcGF5bWVudEFtb3VudAUJX2Ftb3VudEluCQACAQI0SW52YWxpZCBjcmVhdGVMaW1pdE9yZGVyIHBhcmFtZXRlcnM6IGludmFsaWQgcGF5bWVudAQFc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDl9wYXltZW50QW1vdW50BQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlBQ5fcGF5bWVudEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAwkAAAIFC3VzZG5QYXltZW50BQt1c2RuUGF5bWVudAQKcG9zaXRpb25JZAMJAQIhPQIFDHBvc2l0aW9uU2l6ZQAACQENZ2V0UG9zaXRpb25JZAMFBF9hbW0FB190cmFkZXIFEXBvc2l0aW9uRGlyZWN0aW9uAAADAwMJAAACBQVfdHlwZQUEU1RPUAYJAAACBQVfdHlwZQUEVEFLRQkAAAIFCnBvc2l0aW9uSWQAAAcJAAIBAj9TVE9QIGFuZCBUQUtFIG9yZGVyIHNob3VsZCBiZSBhc3NpZ25lZCB0byBwb3NpdGlvbiB3aXRoIGlkICE9IDADCQBmAgUTbmV3VHJhZGVyT3JkZXJDb3VudAUZTUFYX1RSQURFUl9PUkRFUlNfUEVSX0FNTQkAAgECMEludmFsaWQgY3JlYXRlTGltaXRPcmRlciBwYXJhbWV0ZXJzOiBvcmRlciBjb3VudAQJY2hhbmdlU2V0CQDOCAIJAM4IAgkAzggCCQEJc2F2ZU9yZGVyDQUHb3JkZXJJZAUEX2FtbQUHX3RyYWRlcgUJX2Ftb3VudEluBQlfbGV2ZXJhZ2UFBV90eXBlBQ1fdHJpZ2dlclByaWNlBQt1c2RuUGF5bWVudAUFX3NpZGUFCF9yZWZMaW5rBQpwb3NpdGlvbklkBQtfbGltaXRQcmljZQULX2V4cGlyYXRpb24JARBhZGRSZW1vdmVPcmRlcklkBAUHb3JkZXJJZAUEX2FtbQUHX3RyYWRlcgYJARZ1cGRhdGVUcmFkZXJPcmRlckNvdW50AwUEX2FtbQUHX3RyYWRlcgUTbmV3VHJhZGVyT3JkZXJDb3VudAkBEXVwZGF0ZUxhc3RPcmRlcklkAQUHb3JkZXJJZAkAlAoCBQljaGFuZ2VTZXQFB29yZGVySWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELY2FuY2VsT3JkZXIBCF9vcmRlcklkBA0kdDAyNDA1MjI0MjcxCQEIZ2V0T3JkZXIBBQhfb3JkZXJJZAQEX2FtbQgFDSR0MDI0MDUyMjQyNzECXzEEB190cmFkZXIIBQ0kdDAyNDA1MjI0MjcxAl8yBAlfYW1vdW50SW4IBQ0kdDAyNDA1MjI0MjcxAl8zBAlfbGV2ZXJhZ2UIBQ0kdDAyNDA1MjI0MjcxAl80BAVfdHlwZQgFDSR0MDI0MDUyMjQyNzECXzUEDV90cmlnZ2VyUHJpY2UIBQ0kdDAyNDA1MjI0MjcxAl82BAtfYW1vdW50VXNkbggFDSR0MDI0MDUyMjQyNzECXzcEBV9zaWRlCAUNJHQwMjQwNTIyNDI3MQJfOAQIX3JlZkxpbmsIBQ0kdDAyNDA1MjI0MjcxAl85BAtfcG9zaXRpb25JZAgFDSR0MDI0MDUyMjQyNzEDXzEwBAtfbGltaXRQcmljZQgFDSR0MDI0MDUyMjQyNzEDXzExAwMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEJAQdpc1ZhbGlkAQUIX29yZGVySWQGCQEBIQEJAAACCQClCAEIBQFpBmNhbGxlcgUHX3RyYWRlcgkAAgECHkludmFsaWQgY2FuY2VsT3JkZXIgcGFyYW1ldGVycwQHY2xlYW5VcAkA/AcEBQR0aGlzAhJjbGVhblVwU3RhbGVPcmRlcnMJAMwIAgUEX2FtbQkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBQdjbGVhblVwBQdjbGVhblVwBBNuZXdUcmFkZXJPcmRlckNvdW50CQBlAgkBE2dldFRyYWRlck9yZGVyQ291bnQCBQRfYW1tBQdfdHJhZGVyAAEECHdpdGhkcmF3AwkAZgIFC19hbW91bnRVc2RuAAAEB3Vuc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgkA2AQBCQEKcXVvdGVBc3NldAAJAMwIAgULX2Ftb3VudFVzZG4FA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFCHdpdGhkcmF3BQh3aXRoZHJhdwkAzggCCQDOCAIJAM4IAgkBD21hcmtDYW5jZWxPcmRlcgEFCF9vcmRlcklkCQEQYWRkUmVtb3ZlT3JkZXJJZAQFCF9vcmRlcklkBQRfYW1tBQdfdHJhZGVyBwkBFnVwZGF0ZVRyYWRlck9yZGVyQ291bnQDBQRfYW1tBQdfdHJhZGVyBRNuZXdUcmFkZXJPcmRlckNvdW50AwkAZgIFC19hbW91bnRVc2RuAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtfYW1vdW50VXNkbgkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxleGVjdXRlT3JkZXICCF9vcmRlcklkCl9wcmljZURhdGEEDSR0MDI1NDg5MjU3MDgJAQhnZXRPcmRlcgEFCF9vcmRlcklkBARfYW1tCAUNJHQwMjU0ODkyNTcwOAJfMQQHX3RyYWRlcggFDSR0MDI1NDg5MjU3MDgCXzIECV9hbW91bnRJbggFDSR0MDI1NDg5MjU3MDgCXzMECV9sZXZlcmFnZQgFDSR0MDI1NDg5MjU3MDgCXzQEBV90eXBlCAUNJHQwMjU0ODkyNTcwOAJfNQQNX3RyaWdnZXJQcmljZQgFDSR0MDI1NDg5MjU3MDgCXzYEC19hbW91bnRVc2RuCAUNJHQwMjU0ODkyNTcwOAJfNwQFX3NpZGUIBQ0kdDAyNTQ4OTI1NzA4Al84BAhfcmVmTGluawgFDSR0MDI1NDg5MjU3MDgCXzkEC19wb3NpdGlvbklkCAUNJHQwMjU0ODkyNTcwOANfMTAEC19saW1pdFByaWNlCAUNJHQwMjU0ODkyNTcwOANfMTEEB2NsZWFuVXAJAPwHBAUEdGhpcwISY2xlYW5VcFN0YWxlT3JkZXJzCQDMCAIFBF9hbW0JAMwIAgUHX3RyYWRlcgUDbmlsBQNuaWwDCQAAAgUHY2xlYW5VcAUHY2xlYW5VcAQRcG9zaXRpb25EaXJlY3Rpb24JARRnZXRQb3NpdGlvbkRpcmVjdGlvbgIFBV9zaWRlBQVfdHlwZQMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEJAQdpc1ZhbGlkAQUIX29yZGVySWQJAAIBAh9JbnZhbGlkIGV4ZWN1dGVPcmRlciBwYXJhbWV0ZXJzBAxwb3NpdGlvblNpemUJAQ9nZXRQb3NpdGlvblNpemUDBQRfYW1tBQdfdHJhZGVyBRFwb3NpdGlvbkRpcmVjdGlvbgMJAAACBQxwb3NpdGlvblNpemUFDHBvc2l0aW9uU2l6ZQQRY3VycmVudFBvc2l0aW9uSWQDCQECIT0CBQxwb3NpdGlvblNpemUAAAkBDWdldFBvc2l0aW9uSWQDBQRfYW1tBQdfdHJhZGVyBRFwb3NpdGlvbkRpcmVjdGlvbgAABA0kdDAyNjIxNTI5NjM5AwkAAAIFBV90eXBlBQRTVE9QBBJfcG9zaXRpb25EaXJlY3Rpb24DCQBmAgUMcG9zaXRpb25TaXplAAAFBExPTkcDCQBmAgAABQxwb3NpdGlvblNpemUFBVNIT1JUCQACAQIsQ2FuIG5vdCBleGVjdXRlIFNUT1Agb3JkZXI6IG5vIG9wZW4gcG9zaXRpb24EC21hcmtldFByaWNlCQEOZ2V0TWFya2V0UHJpY2UBBQRfYW1tBAxpc0V4ZWN1dGFibGUDCQAAAgUFX3NpZGUFEl9wb3NpdGlvbkRpcmVjdGlvbgkAAgECJ0NhbiBub3QgZXhlY3V0ZSBTVE9QIG9yZGVyOiByZWR1Y2Ugb25seQMJAQIhPQIFEWN1cnJlbnRQb3NpdGlvbklkBQtfcG9zaXRpb25JZAkAAgECK0NhbiBub3QgZXhlY3V0ZSBTVE9QIG9yZGVyOiBwb3NpdGlvbiBjbG9zZWQDCQAAAgUSX3Bvc2l0aW9uRGlyZWN0aW9uBQRMT05HCQBnAgUNX3RyaWdnZXJQcmljZQULbWFya2V0UHJpY2UJAGcCBQttYXJrZXRQcmljZQUNX3RyaWdnZXJQcmljZQMFDGlzRXhlY3V0YWJsZQkAlQoDAg1jbG9zZVBvc2l0aW9uCQDMCAIJAQRtaW52AgUJX2Ftb3VudEluCQEDYWJzAQUMcG9zaXRpb25TaXplCQDMCAIFEXBvc2l0aW9uRGlyZWN0aW9uCQDMCAIJAQRtdWxkAgULX2xpbWl0UHJpY2UJAQNhYnMBBQxwb3NpdGlvblNpemUJAMwIAgcJAMwIAgUKX3ByaWNlRGF0YQUDbmlsBQNuaWwJAAIBAjFDYW4gbm90IGV4ZWN1dGUgU1RPUCBvcmRlcjogdHJpZ2dlclByaWNlIG1pc21hdGNoAwkAAAIFBV90eXBlBQRUQUtFBBJfcG9zaXRpb25EaXJlY3Rpb24DCQBmAgUMcG9zaXRpb25TaXplAAAFBExPTkcDCQBmAgAABQxwb3NpdGlvblNpemUFBVNIT1JUCQACAQIsQ2FuIG5vdCBleGVjdXRlIFNUT1Agb3JkZXI6IG5vIG9wZW4gcG9zaXRpb24EC21hcmtldFByaWNlCQEOZ2V0TWFya2V0UHJpY2UBBQRfYW1tBAxpc0V4ZWN1dGFibGUDCQAAAgUFX3NpZGUFEl9wb3NpdGlvbkRpcmVjdGlvbgkAAgECJ0NhbiBub3QgZXhlY3V0ZSBUQUtFIG9yZGVyOiByZWR1Y2Ugb25seQMJAQIhPQIFEWN1cnJlbnRQb3NpdGlvbklkBQtfcG9zaXRpb25JZAkAAgEJAKwCAgkArAICCQCsAgICLENhbiBub3QgZXhlY3V0ZSBUQUtFIG9yZGVyOiBwb3NpdGlvbiBjbG9zZWQgCQCkAwEFEWN1cnJlbnRQb3NpdGlvbklkAgIhPQkApAMBBQtfcG9zaXRpb25JZAMJAAACBRJfcG9zaXRpb25EaXJlY3Rpb24FBExPTkcJAGcCBQttYXJrZXRQcmljZQUNX3RyaWdnZXJQcmljZQkAZwIFDV90cmlnZ2VyUHJpY2UFC21hcmtldFByaWNlAwUMaXNFeGVjdXRhYmxlCQCVCgMCDWNsb3NlUG9zaXRpb24JAMwIAgkBBG1pbnYCBQlfYW1vdW50SW4JAQNhYnMBBQxwb3NpdGlvblNpemUJAMwIAgURcG9zaXRpb25EaXJlY3Rpb24JAMwIAgkBBG11bGQCBQtfbGltaXRQcmljZQkBA2FicwEFDHBvc2l0aW9uU2l6ZQkAzAgCBwkAzAgCBQpfcHJpY2VEYXRhBQNuaWwFA25pbAkAAgECMUNhbiBub3QgZXhlY3V0ZSBUQUtFIG9yZGVyOiB0cmlnZ2VyUHJpY2UgbWlzbWF0Y2gDCQAAAgUFX3R5cGUFBUxJTUlUBAttYXJrZXRQcmljZQkBDmdldE1hcmtldFByaWNlAQUEX2FtbQQGc3ByZWFkAwkAAAIFC19saW1pdFByaWNlAAAJAQlnZXRTcHJlYWQBBQ1fdHJpZ2dlclByaWNlCQEDYWJzAQkAZQIFDV90cmlnZ2VyUHJpY2UFC19saW1pdFByaWNlBAxpc0V4ZWN1dGFibGUDCQBnAgULbWFya2V0UHJpY2UJAGUCBQ1fdHJpZ2dlclByaWNlBQZzcHJlYWQJAGcCCQBkAgUNX3RyaWdnZXJQcmljZQUGc3ByZWFkBQttYXJrZXRQcmljZQcDBQxpc0V4ZWN1dGFibGUED2Ftb3VudEluV2l0aEZlZQkAZQIFC19hbW91bnRVc2RuCQEEbXVsZAIFC19hbW91bnRVc2RuCQEGZ2V0RmVlAgUEX2FtbQUHX3RyYWRlcgkAlQoDAhBpbmNyZWFzZVBvc2l0aW9uCQDMCAIFBV9zaWRlCQDMCAIFCV9sZXZlcmFnZQkAzAgCAwkAAAIFC19saW1pdFByaWNlAAAAAAkBBGRpdmQCBQ9hbW91bnRJbldpdGhGZWUFC19saW1pdFByaWNlCQDMCAIFCF9yZWZMaW5rCQDMCAIFCl9wcmljZURhdGEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQtfYW1vdW50VXNkbgUDbmlsCQACAQIyQ2FuIG5vdCBleGVjdXRlIExJTUlUIG9yZGVyOiB0cmlnZ2VyUHJpY2UgbWlzbWF0Y2gJAAIBCQCsAgICFEludmFsaWQgb3JkZXIgdHlwZTogCQCkAwEFBV90eXBlBAZtZXRob2QIBQ0kdDAyNjIxNTI5NjM5Al8xBARhcmdzCAUNJHQwMjYyMTUyOTYzOQJfMgQIcGF5bWVudHMIBQ0kdDAyNjIxNTI5NjM5Al8zBAh3aXRoZHJhdwMJAAACCQCQAwEFCHBheW1lbnRzAAEEB3Vuc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgkA2AQBCQEKcXVvdGVBc3NldAAJAMwIAggJAJEDAgUIcGF5bWVudHMAAAZhbW91bnQFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFCHdpdGhkcmF3BQh3aXRoZHJhdwQMZG9TZXRDb250ZXh0CQD8BwQFBHRoaXMCCnNldENvbnRleHQJAMwIAgUHX3RyYWRlcgUDbmlsBQNuaWwDCQAAAgUMZG9TZXRDb250ZXh0BQxkb1NldENvbnRleHQED2RvQ2xvc2VQb3NpdGlvbgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQRfYW1tBQZtZXRob2QFBGFyZ3MFCHBheW1lbnRzAwkAAAIFD2RvQ2xvc2VQb3NpdGlvbgUPZG9DbG9zZVBvc2l0aW9uBA5kb1Jlc2V0Q29udGV4dAkA/AcEBQR0aGlzAgxyZXNldENvbnRleHQFA25pbAUDbmlsAwkAAAIFDmRvUmVzZXRDb250ZXh0BQ5kb1Jlc2V0Q29udGV4dAQTZXhlY3V0ZU9yZGVyUmVxdWVzdAMJAAACBQVfdHlwZQUFTElNSVQED25ld1Bvc2l0aW9uU2l6ZQkBD2dldFBvc2l0aW9uU2l6ZQMFBF9hbW0FB190cmFkZXIFEXBvc2l0aW9uRGlyZWN0aW9uAwkAAAIFD25ld1Bvc2l0aW9uU2l6ZQUPbmV3UG9zaXRpb25TaXplBA1uZXdQb3NpdGlvbklkCQENZ2V0UG9zaXRpb25JZAMFBF9hbW0FB190cmFkZXIFEXBvc2l0aW9uRGlyZWN0aW9uAwkAAAIFDW5ld1Bvc2l0aW9uSWQFDW5ld1Bvc2l0aW9uSWQEEXBvc2l0aW9uU2l6ZURlbHRhCQBlAgUPbmV3UG9zaXRpb25TaXplBQxwb3NpdGlvblNpemUEDmNsb3NlT3JkZXJTaWRlAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAABQVTSE9SVAUETE9ORwQNbWFrZVRha2VPcmRlcgMJARBoYXZlT3JkZXJSZXF1ZXN0AgUIX29yZGVySWQFBFRBS0UEDSR0MDMwNjAxMzA4MDAJAQ9nZXRPcmRlclJlcXVlc3QCBQhfb3JkZXJJZAUEVEFLRQQKbmV3T3JkZXJJZAgFDSR0MDMwNjAxMzA4MDACXzEEBm5ld0FtbQgFDSR0MDMwNjAxMzA4MDACXzIECW5ld1RyYWRlcggFDSR0MDMwNjAxMzA4MDACXzMEB25ld1R5cGUIBQ0kdDAzMDYwMTMwODAwAl80BA9uZXdUcmlnZ2VyUHJpY2UIBQ0kdDAzMDYwMTMwODAwAl81BA1uZXdMaW1pdFByaWNlCAUNJHQwMzA2MDEzMDgwMAJfNgQGZG9DYWxsCQD8BwQFBHRoaXMCE2ludGVybmFsQ3JlYXRlT3JkZXIJAMwIAgUJbmV3VHJhZGVyCQDMCAIFBm5ld0FtbQkAzAgCBQduZXdUeXBlCQDMCAIFD25ld1RyaWdnZXJQcmljZQkAzAgCBQ1uZXdMaW1pdFByaWNlCQDMCAIFEXBvc2l0aW9uU2l6ZURlbHRhCQDMCAIAAAkAzAgCBQ5jbG9zZU9yZGVyU2lkZQkAzAgCAgAJAMwIAgIACQDMCAIAAAkAzAgCAAAFA25pbAUDbmlsAwkAAAIFBmRvQ2FsbAUGZG9DYWxsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQ1tYWtlVGFrZU9yZGVyBQ1tYWtlVGFrZU9yZGVyBA1tYWtlU3RvcE9yZGVyAwkBEGhhdmVPcmRlclJlcXVlc3QCBQhfb3JkZXJJZAUEU1RPUAQNJHQwMzEzNzMzMTU3MgkBD2dldE9yZGVyUmVxdWVzdAIFCF9vcmRlcklkBQRTVE9QBApuZXdPcmRlcklkCAUNJHQwMzEzNzMzMTU3MgJfMQQGbmV3QW1tCAUNJHQwMzEzNzMzMTU3MgJfMgQJbmV3VHJhZGVyCAUNJHQwMzEzNzMzMTU3MgJfMwQHbmV3VHlwZQgFDSR0MDMxMzczMzE1NzICXzQED25ld1RyaWdnZXJQcmljZQgFDSR0MDMxMzczMzE1NzICXzUEDW5ld0xpbWl0UHJpY2UIBQ0kdDAzMTM3MzMxNTcyAl82BAZkb0NhbGwJAPwHBAUEdGhpcwITaW50ZXJuYWxDcmVhdGVPcmRlcgkAzAgCBQluZXdUcmFkZXIJAMwIAgUGbmV3QW1tCQDMCAIFB25ld1R5cGUJAMwIAgUPbmV3VHJpZ2dlclByaWNlCQDMCAIFDW5ld0xpbWl0UHJpY2UJAMwIAgURcG9zaXRpb25TaXplRGVsdGEJAMwIAgAACQDMCAIFDmNsb3NlT3JkZXJTaWRlCQDMCAICAAkAzAgCAgAJAMwIAgAACQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUGZG9DYWxsBQZkb0NhbGwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFDW1ha2VTdG9wT3JkZXIFDW1ha2VTdG9wT3JkZXIJAM4IAgUNbWFrZVRha2VPcmRlcgUNbWFrZVN0b3BPcmRlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFE2V4ZWN1dGVPcmRlclJlcXVlc3QFE2V4ZWN1dGVPcmRlclJlcXVlc3QEE2RvTWFya09yZGVyRXhlY3V0ZWQJAPwHBAUEdGhpcwIZaW50ZXJuYWxNYXJrT3JkZXJFeGVjdXRlZAkAzAgCBQRfYW1tCQDMCAIFB190cmFkZXIJAMwIAgUIX29yZGVySWQFA25pbAUDbmlsAwkAAAIFE2RvTWFya09yZGVyRXhlY3V0ZWQFE2RvTWFya09yZGVyRXhlY3V0ZWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARR2aWV3X2NhbkV4ZWN1dGVPcmRlcgIIX29yZGVySWQKX3ByaWNlRGF0YQQBcwkA/AcEBQR0aGlzAgxleGVjdXRlT3JkZXIJAMwIAgUIX29yZGVySWQJAMwIAgUKX3ByaWNlRGF0YQUDbmlsBQNuaWwDCQAAAgUBcwUBcwkAAgECB1N1Y2Nlc3MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA5jb29yZGluYXRvclN0cgkAnQgCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwMJAQlpc0RlZmluZWQBBQ5jb29yZGluYXRvclN0cgQFYWRtaW4JAJ0IAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUOY29vcmRpbmF0b3JTdHIFD2tfYWRtaW5fYWRkcmVzcwMJAQlpc0RlZmluZWQBBQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQVhZG1pbgkArAICCQCsAgIJAKwCAgIHc3RhdHVzXwkApQgBBQR0aGlzAgFfCQDYBAEIBQJ0eAJpZAcJAAIBAi51bmFibGUgdG8gdmVyaWZ5OiBhZG1pbiBub3Qgc2V0IGluIGNvb3JkaW5hdG9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5GWDpAA==", "height": 2578924, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Dz28Jt59NMtNCA5dqFYk4Gj3mbLWoWmkBCKL5bbn2Mhe Next: GUBhAY7DrcVuujSkBWs7KN4BhCRz8aMreZHDDTrmQccm Diff:
OldNewDifferences
310310 let _positionId = $t01135911575._10
311311 let _x9 = $t01135911575._11
312312 let _expiration = $t01135911575._12
313- if (if (if (if ((_type == STOP))
313+ let cancelTakeStopOfNoPosition = if (if (if ((_type == STOP))
314314 then true
315315 else (_type == TAKE))
316316 then (positionIds[0] != _positionId)
317317 else false)
318318 then (positionIds[1] != _positionId)
319- else false)
319+ else false
320+ let cancelLimitIfExpired = if ((_type == LIMIT))
321+ then (lastBlock.timestamp >= _expiration)
322+ else false
323+ if (if (cancelTakeStopOfNoPosition)
324+ then true
325+ else cancelLimitIfExpired)
320326 then {
321327 let change = markCancelOrder(orderIdInt)
322328 let newOrderList = addRemoveOrderIdList(_acc._1, orderIdInt, _amm, _trader, false)
325331 else _acc
326332 }
327333
328- let $t01192812003 = {
334+ let $t01210712182 = {
329335 let $l = orders
330336 let $s = size($l)
331337 let $acc0 = $Tuple2(orders, nil)
339345
340346 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
341347 }
342- let newOrders = $t01192812003._1
343- let cancelActions = $t01192812003._2
348+ let newOrders = $t01210712182._1
349+ let cancelActions = $t01210712182._2
344350 ((cancelActions ++ updateTraderOrderCount(_amm, _trader, size(newOrders))) ++ updateOrderIdStr(makeString(newOrders, ","), _amm, _trader))
345351 }
346352
377383 then if ((size(i.payments) > 1))
378384 then throw("Invalid createOrder parameters: invalid payment count")
379385 else {
380- let $t01452114773 = if ((size(i.payments) == 1))
386+ let $t01470014952 = if ((size(i.payments) == 1))
381387 then $Tuple2(toBase58String(valueOrErrorMessage(i.payments[0].assetId, "Invalid asset id")), i.payments[0].amount)
382388 else $Tuple2("", 0)
383- let paymentAssetId = $t01452114773._1
384- let paymentAmount = $t01452114773._2
389+ let paymentAssetId = $t01470014952._1
390+ let paymentAmount = $t01470014952._2
385391 let doCall = invoke(this, "internalCreateOrder", [_trader, _amm, _type, _triggerPrice, _limitPrice, _amountIn, _leverage, _side, _refLink, paymentAssetId, paymentAmount, _expiration], nil)
386392 if ((doCall == doCall))
387393 then {
421427
422428
423429 @Callable(i)
424-func increasePositionWithStopLoss (_amm,_direction,_leverage,_minBaseAssetAmount,_refLink,_stopTriggerPrice,_stopLimitPrice,_takeTriggerPrice,_takeLimitPrice) = {
430+func increasePositionWithStopLoss (_amm,_direction,_leverage,_minBaseAssetAmount,_refLink,_stopTriggerPrice,_stopLimitPrice,_takeTriggerPrice,_takeLimitPrice,_priceData) = {
425431 let _trader = toString(i.caller)
426432 let cleanUp = invoke(this, "cleanUpStaleOrders", [_amm, _trader], nil)
427433 if ((cleanUp == cleanUp))
437443 let doSetContext = invoke(this, "setContext", [_trader], nil)
438444 if ((doSetContext == doSetContext))
439445 then {
440- let doClosePosition = invoke(addressFromStringValue(_amm), "increasePosition", [_direction, _leverage, _minBaseAssetAmount, _refLink], i.payments)
446+ let doClosePosition = invoke(addressFromStringValue(_amm), "increasePosition", [_direction, _leverage, _minBaseAssetAmount, _refLink, _priceData], i.payments)
441447 if ((doClosePosition == doClosePosition))
442448 then {
443449 let doResetContext = invoke(this, "resetContext", nil, nil)
605611
606612 @Callable(i)
607613 func cancelOrder (_orderId) = {
608- let $t02383724056 = getOrder(_orderId)
609- let _amm = $t02383724056._1
610- let _trader = $t02383724056._2
611- let _amountIn = $t02383724056._3
612- let _leverage = $t02383724056._4
613- let _type = $t02383724056._5
614- let _triggerPrice = $t02383724056._6
615- let _amountUsdn = $t02383724056._7
616- let _side = $t02383724056._8
617- let _refLink = $t02383724056._9
618- let _positionId = $t02383724056._10
619- let _limitPrice = $t02383724056._11
614+ let $t02405224271 = getOrder(_orderId)
615+ let _amm = $t02405224271._1
616+ let _trader = $t02405224271._2
617+ let _amountIn = $t02405224271._3
618+ let _leverage = $t02405224271._4
619+ let _type = $t02405224271._5
620+ let _triggerPrice = $t02405224271._6
621+ let _amountUsdn = $t02405224271._7
622+ let _side = $t02405224271._8
623+ let _refLink = $t02405224271._9
624+ let _positionId = $t02405224271._10
625+ let _limitPrice = $t02405224271._11
620626 if (if (if (!(initialized()))
621627 then true
622628 else !(isValid(_orderId)))
649655
650656
651657 @Callable(i)
652-func executeOrder (_orderId) = {
653- let $t02525425473 = getOrder(_orderId)
654- let _amm = $t02525425473._1
655- let _trader = $t02525425473._2
656- let _amountIn = $t02525425473._3
657- let _leverage = $t02525425473._4
658- let _type = $t02525425473._5
659- let _triggerPrice = $t02525425473._6
660- let _amountUsdn = $t02525425473._7
661- let _side = $t02525425473._8
662- let _refLink = $t02525425473._9
663- let _positionId = $t02525425473._10
664- let _limitPrice = $t02525425473._11
658+func executeOrder (_orderId,_priceData) = {
659+ let $t02548925708 = getOrder(_orderId)
660+ let _amm = $t02548925708._1
661+ let _trader = $t02548925708._2
662+ let _amountIn = $t02548925708._3
663+ let _leverage = $t02548925708._4
664+ let _type = $t02548925708._5
665+ let _triggerPrice = $t02548925708._6
666+ let _amountUsdn = $t02548925708._7
667+ let _side = $t02548925708._8
668+ let _refLink = $t02548925708._9
669+ let _positionId = $t02548925708._10
670+ let _limitPrice = $t02548925708._11
665671 let cleanUp = invoke(this, "cleanUpStaleOrders", [_amm, _trader], nil)
666672 if ((cleanUp == cleanUp))
667673 then {
677683 let currentPositionId = if ((positionSize != 0))
678684 then getPositionId(_amm, _trader, positionDirection)
679685 else 0
680- let $t02598029358 = if ((_type == STOP))
686+ let $t02621529639 = if ((_type == STOP))
681687 then {
682688 let _positionDirection = if ((positionSize > 0))
683689 then LONG
693699 then (_triggerPrice >= marketPrice)
694700 else (marketPrice >= _triggerPrice)
695701 if (isExecutable)
696- then $Tuple3("closePosition", [minv(_amountIn, abs(positionSize)), positionDirection, muld(_limitPrice, abs(positionSize)), false], nil)
702+ then $Tuple3("closePosition", [minv(_amountIn, abs(positionSize)), positionDirection, muld(_limitPrice, abs(positionSize)), false, _priceData], nil)
697703 else throw("Can not execute STOP order: triggerPrice mismatch")
698704 }
699705 else if ((_type == TAKE))
712718 then (marketPrice >= _triggerPrice)
713719 else (_triggerPrice >= marketPrice)
714720 if (isExecutable)
715- then $Tuple3("closePosition", [minv(_amountIn, abs(positionSize)), positionDirection, muld(_limitPrice, abs(positionSize)), false], nil)
721+ then $Tuple3("closePosition", [minv(_amountIn, abs(positionSize)), positionDirection, muld(_limitPrice, abs(positionSize)), false, _priceData], nil)
716722 else throw("Can not execute TAKE order: triggerPrice mismatch")
717723 }
718724 else if ((_type == LIMIT))
729735 let amountInWithFee = (_amountUsdn - muld(_amountUsdn, getFee(_amm, _trader)))
730736 $Tuple3("increasePosition", [_side, _leverage, if ((_limitPrice == 0))
731737 then 0
732- else divd(amountInWithFee, _limitPrice), _refLink], [AttachedPayment(quoteAsset(), _amountUsdn)])
738+ else divd(amountInWithFee, _limitPrice), _refLink, _priceData], [AttachedPayment(quoteAsset(), _amountUsdn)])
733739 }
734740 else throw("Can not execute LIMIT order: triggerPrice mismatch")
735741 }
736742 else throw(("Invalid order type: " + toString(_type)))
737- let method = $t02598029358._1
738- let args = $t02598029358._2
739- let payments = $t02598029358._3
743+ let method = $t02621529639._1
744+ let args = $t02621529639._2
745+ let payments = $t02621529639._3
740746 let withdraw = if ((size(payments) == 1))
741747 then {
742748 let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), payments[0].amount], nil)
770776 else LONG
771777 let makeTakeOrder = if (haveOrderRequest(_orderId, TAKE))
772778 then {
773- let $t03032030519 = getOrderRequest(_orderId, TAKE)
774- let newOrderId = $t03032030519._1
775- let newAmm = $t03032030519._2
776- let newTrader = $t03032030519._3
777- let newType = $t03032030519._4
778- let newTriggerPrice = $t03032030519._5
779- let newLimitPrice = $t03032030519._6
779+ let $t03060130800 = getOrderRequest(_orderId, TAKE)
780+ let newOrderId = $t03060130800._1
781+ let newAmm = $t03060130800._2
782+ let newTrader = $t03060130800._3
783+ let newType = $t03060130800._4
784+ let newTriggerPrice = $t03060130800._5
785+ let newLimitPrice = $t03060130800._6
780786 let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
781787 if ((doCall == doCall))
782788 then nil
787793 then {
788794 let makeStopOrder = if (haveOrderRequest(_orderId, STOP))
789795 then {
790- let $t03109231291 = getOrderRequest(_orderId, STOP)
791- let newOrderId = $t03109231291._1
792- let newAmm = $t03109231291._2
793- let newTrader = $t03109231291._3
794- let newType = $t03109231291._4
795- let newTriggerPrice = $t03109231291._5
796- let newLimitPrice = $t03109231291._6
796+ let $t03137331572 = getOrderRequest(_orderId, STOP)
797+ let newOrderId = $t03137331572._1
798+ let newAmm = $t03137331572._2
799+ let newTrader = $t03137331572._3
800+ let newType = $t03137331572._4
801+ let newTriggerPrice = $t03137331572._5
802+ let newLimitPrice = $t03137331572._6
797803 let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
798804 if ((doCall == doCall))
799805 then nil
837843
838844
839845 @Callable(i)
840-func view_canExecuteOrder (_orderId) = {
841- let s = invoke(this, "executeOrder", [_orderId], nil)
846+func view_canExecuteOrder (_orderId,_priceData) = {
847+ let s = invoke(this, "executeOrder", [_orderId, _priceData], nil)
842848 if ((s == s))
843849 then throw("Success")
844850 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_coordinatorAddress = "k_coordinatorAddress"
55
66 let k_admin_address = "k_admin_address"
77
88 let k_quote_asset = "k_quote_asset"
99
1010 let k_amm = "k_amm"
1111
1212 let k_manager_address = "k_manager_address"
1313
1414 let k_positionSequence = "k_positionSequence"
1515
1616 let k_positionSize = "k_positionSize"
1717
1818 let k_executedOrders = "k_executedOrders"
1919
2020 let k_canceledOrders = "k_canceledOrders"
2121
2222 let k_order = "k_order"
2323
2424 let k_orderRequest = "k_orderReq"
2525
2626 let k_lastOrderId = "k_lastOrderId"
2727
2828 let k_traderOrderCnt = "k_traderOrderCnt"
2929
3030 let k_traderOrderIds = "k_traderOrderIds"
3131
3232 let k_sender = "k_sender"
3333
3434 let k_initialized = "k_initialized"
3535
3636 let STOP = 1
3737
3838 let TAKE = 2
3939
4040 let LIMIT = 3
4141
4242 let LONG = 1
4343
4444 let SHORT = 2
4545
4646 let INCREASE = 1
4747
4848 let DECREASE = 2
4949
5050 let MAX_TRADER_ORDERS_PER_AMM = 10
5151
5252 let TIME = lastBlock.timestamp
5353
5454 let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
5555
5656 let SPREAD_LIMIT = (DECIMAL_UNIT / 200)
5757
5858 func abs (_x) = if ((_x > 0))
5959 then _x
6060 else -(_x)
6161
6262
6363 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
6464
6565
6666 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
6767
6868
6969 func minv (_x,_y) = if ((_x > _y))
7070 then _y
7171 else _x
7272
7373
7474 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
7575
7676
7777 func executedOrderKey (_orderId) = ((k_executedOrders + "_") + toString(_orderId))
7878
7979
8080 func canceledOrderKey (_orderId) = ((k_canceledOrders + "_") + toString(_orderId))
8181
8282
8383 func orderKey (_orderId) = toCompositeKey(k_order, toString(_orderId))
8484
8585
8686 func orderRequestKey (_orderId,_type) = ((((k_orderRequest + "_") + toString(_orderId)) + "_") + toString(_type))
8787
8888
8989 func traderOrderCountKey (_amm,_trader) = ((((k_traderOrderCnt + "_") + _amm) + "_") + _trader)
9090
9191
9292 func traderOrderIdsKey (_amm,_trader) = ((((k_traderOrderIds + "_") + _amm) + "_") + _trader)
9393
9494
9595 func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
9696
9797
9898 func quoteAsset () = fromBase58String(getStringValue(coordinator(), k_quote_asset))
9999
100100
101101 func managerAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_manager_address)), "Manager not set")
102102
103103
104104 func isWhitelist (_address) = valueOrElse(getBoolean(coordinator(), toCompositeKey(k_amm, _address)), false)
105105
106106
107107 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
108108
109109
110110 func isValid (_orderId) = if (valueOrElse(getBoolean(this, executedOrderKey(_orderId)), false))
111111 then throw(("Order already executed: " + toString(_orderId)))
112112 else if (valueOrElse(getBoolean(this, canceledOrderKey(_orderId)), false))
113113 then throw(("Order already cancelled: " + toString(_orderId)))
114114 else true
115115
116116
117117 func currentOrderId () = valueOrElse(getInteger(this, k_lastOrderId), 0)
118118
119119
120120 func getTraderOrderCount (_amm,_trader) = {
121121 let key = traderOrderCountKey(_amm, _trader)
122122 valueOrElse(getInteger(this, key), 0)
123123 }
124124
125125
126126 func traderAmmOrdersIds (_amm,_trader) = {
127127 let key = traderOrderIdsKey(_amm, _trader)
128128 let val = valueOrElse(getString(this, key), "")
129129 if ((val == ""))
130130 then nil
131131 else split(val, ",")
132132 }
133133
134134
135135 func haveOrderRequest (_orderId,_type) = {
136136 let key = orderRequestKey(_orderId, _type)
137137 isDefined(getString(this, key))
138138 }
139139
140140
141141 func getOrderRequest (_orderId,_type) = {
142142 let key = orderRequestKey(_orderId, _type)
143143 let orderRequestStr = valueOrErrorMessage(getString(this, key), ("Not order request for key: " + key))
144144 let orderRequestPartList = split(orderRequestStr, ",")
145145 let orderId = valueOrErrorMessage(parseInt(orderRequestPartList[0]), "Invalid orderId")
146146 let amm = orderRequestPartList[1]
147147 let trader = orderRequestPartList[2]
148148 let type = valueOrErrorMessage(parseInt(orderRequestPartList[3]), "Invalid type")
149149 let triggerPrice = valueOrErrorMessage(parseInt(orderRequestPartList[4]), "Invalid triggerPrice")
150150 let limitPrice = valueOrErrorMessage(parseInt(orderRequestPartList[5]), "Invalid limitPrice")
151151 $Tuple6(orderId, amm, trader, type, triggerPrice, limitPrice)
152152 }
153153
154154
155155 func getOrder (_orderId) = {
156156 let orderStr = valueOrErrorMessage(getString(this, orderKey(_orderId)), ("Invalid order id: " + toString(_orderId)))
157157 let orderPartList = split(orderStr, ",")
158158 let amm = orderPartList[0]
159159 let trader = orderPartList[1]
160160 let amountIn = valueOrErrorMessage(parseInt(orderPartList[2]), "Invalid amountIn")
161161 let leverage = valueOrErrorMessage(parseInt(orderPartList[3]), "Invalid leverage")
162162 let type = valueOrErrorMessage(parseInt(orderPartList[4]), "Invalid type")
163163 let triggerPrice = valueOrErrorMessage(parseInt(orderPartList[5]), "Invalid triggerPrice")
164164 let paymentUsdn = valueOrErrorMessage(parseInt(orderPartList[6]), "Invalid paymentUsdn")
165165 let side = valueOrErrorMessage(parseInt(orderPartList[7]), "Invalid side")
166166 let refLink = orderPartList[8]
167167 let positionId = valueOrErrorMessage(parseInt(orderPartList[9]), "Invalid positionId")
168168 let limitPrice = valueOrErrorMessage(parseInt(orderPartList[10]), "Invalid limitPrice")
169169 let expiration = if ((size(orderPartList) > 11))
170170 then valueOrErrorMessage(parseInt(orderPartList[11]), "Invalid limitPrice")
171171 else 0
172172 $Tuple12(amm, trader, amountIn, leverage, type, triggerPrice, paymentUsdn, side, refLink, positionId, limitPrice, expiration)
173173 }
174174
175175
176176 func getMarketPrice (_amm) = {
177177 let s = invoke(addressFromStringValue(_amm), "computeSpotPrice", nil, nil)
178178 if ((s == s))
179179 then {
180180 let res = match s {
181181 case t: Int =>
182182 t
183183 case _ =>
184184 throw("Invalid computeSpotPrice result")
185185 }
186186 value(res)
187187 }
188188 else throw("Strict value is not equal to itself.")
189189 }
190190
191191
192192 func getFee (_amm,_trader) = {
193193 let s = invoke(addressFromStringValue(_amm), "computeFeeForTraderWithArtifact", [_trader, ""], nil)
194194 if ((s == s))
195195 then {
196196 let res = match s {
197197 case t: (Int, Boolean) =>
198198 t._1
199199 case _ =>
200200 throw("Invalid computeFeeForTraderWithArtifact result")
201201 }
202202 value(res)
203203 }
204204 else throw("Strict value is not equal to itself.")
205205 }
206206
207207
208208 func getPositionDirection (_orderSide,_orderType) = if (if ((_orderType == TAKE))
209209 then true
210210 else (_orderType == STOP))
211211 then if ((_orderSide == LONG))
212212 then SHORT
213213 else LONG
214214 else _orderSide
215215
216216
217217 func getPositionSize (_amm,_trader,_direction) = {
218218 let amm = addressFromStringValue(_amm)
219219 let positionKey = ((_trader + "_") + toString(_direction))
220220 let sizeKey = toCompositeKey(k_positionSize, positionKey)
221221 valueOrElse(getInteger(amm, sizeKey), 0)
222222 }
223223
224224
225225 func getPositionId (_amm,_trader,_direction) = {
226226 let amm = addressFromStringValue(_amm)
227227 let positionKey = ((_trader + "_") + toString(_direction))
228228 let seqKey = toCompositeKey(k_positionSequence, positionKey)
229229 valueOrElse(getInteger(amm, seqKey), 0)
230230 }
231231
232232
233233 func getSpread (_price) = muld(_price, SPREAD_LIMIT)
234234
235235
236236 func saveOrder (_orderId,_amm,_trader,_amountIn,_leverage,_type,_triggerPrice,_paymentUsdn,_side,_refLink,_positionId,_limitPrice,_expiration) = {
237237 let orderStr = makeString([_amm, _trader, toString(_amountIn), toString(_leverage), toString(_type), toString(_triggerPrice), toString(_paymentUsdn), toString(_side), _refLink, toString(_positionId), toString(_limitPrice), toString(_expiration)], ",")
238238 [StringEntry(orderKey(_orderId), orderStr)]
239239 }
240240
241241
242242 func saveOrderRequest (_orderId,_amm,_trader,_type,_triggerPrice,_limitPrice) = {
243243 let orderReqStr = makeString([toString(_orderId), _amm, _trader, toString(_type), toString(_triggerPrice), toString(_limitPrice)], ",")
244244 [StringEntry(orderRequestKey(_orderId, _type), orderReqStr)]
245245 }
246246
247247
248248 func updateOrderIdStr (_orderIdsNewStr,_amm,_trader) = [StringEntry(traderOrderIdsKey(_amm, _trader), _orderIdsNewStr)]
249249
250250
251251 func addRemoveOrderIdList (_orderIds,_orderId,_amm,_trader,_add) = {
252252 let orderIdsNew = if (_add)
253253 then (_orderIds :+ toString(_orderId))
254254 else removeByIndex(_orderIds, valueOrErrorMessage(indexOf(_orderIds, toString(_orderId)), ("No order with id: " + toString(_orderId))))
255255 orderIdsNew
256256 }
257257
258258
259259 func addRemoveOrderId (_orderId,_amm,_trader,_add) = {
260260 let orderIds = traderAmmOrdersIds(_amm, _trader)
261261 let orderIdsNew = addRemoveOrderIdList(orderIds, _orderId, _amm, _trader, _add)
262262 let orderIdsNewStr = makeString(orderIdsNew, ",")
263263 updateOrderIdStr(orderIdsNewStr, _amm, _trader)
264264 }
265265
266266
267267 func updateTraderOrderCount (_amm,_trader,_count) = if ((0 > _count))
268268 then throw(("Invalid order count: " + toString(_count)))
269269 else [IntegerEntry(traderOrderCountKey(_amm, _trader), _count)]
270270
271271
272272 func updateLastOrderId (_lastOrderId) = [IntegerEntry(k_lastOrderId, _lastOrderId)]
273273
274274
275275 func markExecuteOrder (_orderId) = [BooleanEntry(toCompositeKey(k_executedOrders, toString(_orderId)), true)]
276276
277277
278278 func markCancelOrder (_orderId) = [BooleanEntry(toCompositeKey(k_canceledOrders, toString(_orderId)), true)]
279279
280280
281281 func getPositionIds (_amm,_trader) = {
282282 let longPositionSize = getPositionSize(_amm, _trader, LONG)
283283 let currentLongPositionId = if ((longPositionSize != 0))
284284 then getPositionId(_amm, _trader, LONG)
285285 else 0
286286 let shortPositionSize = getPositionSize(_amm, _trader, SHORT)
287287 let currentShortPositionId = if ((shortPositionSize != 0))
288288 then getPositionId(_amm, _trader, SHORT)
289289 else 0
290290 [currentLongPositionId, currentShortPositionId]
291291 }
292292
293293
294294 @Callable(i)
295295 func cleanUpStaleOrders (_amm,_trader) = {
296296 let orders = traderAmmOrdersIds(_amm, _trader)
297297 let positionIds = getPositionIds(_amm, _trader)
298298 func cleanUpOne (_acc,_orderId) = {
299299 let orderIdInt = valueOrErrorMessage(parseInt(_orderId), "Invalid order id")
300300 let $t01135911575 = getOrder(orderIdInt)
301301 let _x1 = $t01135911575._1
302302 let _x2 = $t01135911575._2
303303 let _x3 = $t01135911575._3
304304 let _x4 = $t01135911575._4
305305 let _type = $t01135911575._5
306306 let _x5 = $t01135911575._6
307307 let _x6 = $t01135911575._7
308308 let _x7 = $t01135911575._8
309309 let _x8 = $t01135911575._9
310310 let _positionId = $t01135911575._10
311311 let _x9 = $t01135911575._11
312312 let _expiration = $t01135911575._12
313- if (if (if (if ((_type == STOP))
313+ let cancelTakeStopOfNoPosition = if (if (if ((_type == STOP))
314314 then true
315315 else (_type == TAKE))
316316 then (positionIds[0] != _positionId)
317317 else false)
318318 then (positionIds[1] != _positionId)
319- else false)
319+ else false
320+ let cancelLimitIfExpired = if ((_type == LIMIT))
321+ then (lastBlock.timestamp >= _expiration)
322+ else false
323+ if (if (cancelTakeStopOfNoPosition)
324+ then true
325+ else cancelLimitIfExpired)
320326 then {
321327 let change = markCancelOrder(orderIdInt)
322328 let newOrderList = addRemoveOrderIdList(_acc._1, orderIdInt, _amm, _trader, false)
323329 $Tuple2(newOrderList, (_acc._2 ++ change))
324330 }
325331 else _acc
326332 }
327333
328- let $t01192812003 = {
334+ let $t01210712182 = {
329335 let $l = orders
330336 let $s = size($l)
331337 let $acc0 = $Tuple2(orders, nil)
332338 func $f0_1 ($a,$i) = if (($i >= $s))
333339 then $a
334340 else cleanUpOne($a, $l[$i])
335341
336342 func $f0_2 ($a,$i) = if (($i >= $s))
337343 then $a
338344 else throw("List size exceeds 10")
339345
340346 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
341347 }
342- let newOrders = $t01192812003._1
343- let cancelActions = $t01192812003._2
348+ let newOrders = $t01210712182._1
349+ let cancelActions = $t01210712182._2
344350 ((cancelActions ++ updateTraderOrderCount(_amm, _trader, size(newOrders))) ++ updateOrderIdStr(makeString(newOrders, ","), _amm, _trader))
345351 }
346352
347353
348354
349355 @Callable(i)
350356 func setContext (_sender) = if ((i.caller != this))
351357 then throw("Only self-call")
352358 else [StringEntry(k_sender, _sender)]
353359
354360
355361
356362 @Callable(i)
357363 func resetContext () = if ((i.caller != this))
358364 then throw("Only self-call")
359365 else [DeleteEntry(k_sender)]
360366
361367
362368
363369 @Callable(i)
364370 func initialize (_coordinator) = if (if (initialized())
365371 then true
366372 else (i.caller != this))
367373 then throw("Unable to initialize")
368374 else [StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator))), BooleanEntry(k_initialized, true)]
369375
370376
371377
372378 @Callable(i)
373379 func createOrder (_amm,_type,_triggerPrice,_limitPrice,_amountIn,_leverage,_side,_refLink,_stopTriggerPrice,_stopLimitPrice,_takeTriggerPrice,_takeLimitPrice,_expiration) = {
374380 let _trader = toString(i.caller)
375381 let cleanUp = invoke(this, "cleanUpStaleOrders", [_amm, _trader], nil)
376382 if ((cleanUp == cleanUp))
377383 then if ((size(i.payments) > 1))
378384 then throw("Invalid createOrder parameters: invalid payment count")
379385 else {
380- let $t01452114773 = if ((size(i.payments) == 1))
386+ let $t01470014952 = if ((size(i.payments) == 1))
381387 then $Tuple2(toBase58String(valueOrErrorMessage(i.payments[0].assetId, "Invalid asset id")), i.payments[0].amount)
382388 else $Tuple2("", 0)
383- let paymentAssetId = $t01452114773._1
384- let paymentAmount = $t01452114773._2
389+ let paymentAssetId = $t01470014952._1
390+ let paymentAmount = $t01470014952._2
385391 let doCall = invoke(this, "internalCreateOrder", [_trader, _amm, _type, _triggerPrice, _limitPrice, _amountIn, _leverage, _side, _refLink, paymentAssetId, paymentAmount, _expiration], nil)
386392 if ((doCall == doCall))
387393 then {
388394 let orderId = match doCall {
389395 case t: Int =>
390396 t
391397 case _ =>
392398 throw("Invalid ID of created order")
393399 }
394400 if ((_type == LIMIT))
395401 then {
396402 let makeStop = if ((_stopTriggerPrice > 0))
397403 then {
398404 let doMakeStop = invoke(this, "internalCreateOrderRequest", [_trader, _amm, orderId, STOP, _stopTriggerPrice, _stopLimitPrice], nil)
399405 if ((doMakeStop == doMakeStop))
400406 then nil
401407 else throw("Strict value is not equal to itself.")
402408 }
403409 else nil
404410 let makeTake = if ((_takeTriggerPrice > 0))
405411 then {
406412 let doMakeTake = invoke(this, "internalCreateOrderRequest", [_trader, _amm, orderId, TAKE, _takeTriggerPrice, _takeLimitPrice], nil)
407413 if ((doMakeTake == doMakeTake))
408414 then nil
409415 else throw("Strict value is not equal to itself.")
410416 }
411417 else nil
412418 (makeStop ++ makeTake)
413419 }
414420 else nil
415421 }
416422 else throw("Strict value is not equal to itself.")
417423 }
418424 else throw("Strict value is not equal to itself.")
419425 }
420426
421427
422428
423429 @Callable(i)
424-func increasePositionWithStopLoss (_amm,_direction,_leverage,_minBaseAssetAmount,_refLink,_stopTriggerPrice,_stopLimitPrice,_takeTriggerPrice,_takeLimitPrice) = {
430+func increasePositionWithStopLoss (_amm,_direction,_leverage,_minBaseAssetAmount,_refLink,_stopTriggerPrice,_stopLimitPrice,_takeTriggerPrice,_takeLimitPrice,_priceData) = {
425431 let _trader = toString(i.caller)
426432 let cleanUp = invoke(this, "cleanUpStaleOrders", [_amm, _trader], nil)
427433 if ((cleanUp == cleanUp))
428434 then if (if (!(initialized()))
429435 then true
430436 else !(isWhitelist(_amm)))
431437 then throw("Invalid increasePositionWithStopLoss parameters")
432438 else {
433439 let positionSize = getPositionSize(_amm, _trader, _direction)
434440 if ((positionSize != 0))
435441 then throw("Invalid increasePositionWithStopLoss parameters: only new position")
436442 else {
437443 let doSetContext = invoke(this, "setContext", [_trader], nil)
438444 if ((doSetContext == doSetContext))
439445 then {
440- let doClosePosition = invoke(addressFromStringValue(_amm), "increasePosition", [_direction, _leverage, _minBaseAssetAmount, _refLink], i.payments)
446+ let doClosePosition = invoke(addressFromStringValue(_amm), "increasePosition", [_direction, _leverage, _minBaseAssetAmount, _refLink, _priceData], i.payments)
441447 if ((doClosePosition == doClosePosition))
442448 then {
443449 let doResetContext = invoke(this, "resetContext", nil, nil)
444450 if ((doResetContext == doResetContext))
445451 then {
446452 let openedPositionSize = getPositionSize(_amm, _trader, _direction)
447453 if ((openedPositionSize == openedPositionSize))
448454 then {
449455 let amountIn = abs(openedPositionSize)
450456 let stopLossSide = if ((0 > openedPositionSize))
451457 then LONG
452458 else SHORT
453459 let doCreateStopOrder = if ((_stopTriggerPrice > 0))
454460 then {
455461 let doCreateStopOrder = invoke(this, "internalCreateOrder", [_trader, _amm, STOP, _stopTriggerPrice, _stopLimitPrice, amountIn, 0, stopLossSide, _refLink, "", 0, 0], nil)
456462 if ((doCreateStopOrder == doCreateStopOrder))
457463 then nil
458464 else throw("Strict value is not equal to itself.")
459465 }
460466 else nil
461467 if ((doCreateStopOrder == doCreateStopOrder))
462468 then {
463469 let doCreateTakeOrder = if ((_takeTriggerPrice > 0))
464470 then {
465471 let doCreateTakeOrder = invoke(this, "internalCreateOrder", [_trader, _amm, TAKE, _takeTriggerPrice, _takeLimitPrice, amountIn, 0, stopLossSide, _refLink, "", 0, 0], nil)
466472 if ((doCreateTakeOrder == doCreateTakeOrder))
467473 then nil
468474 else throw("Strict value is not equal to itself.")
469475 }
470476 else nil
471477 if ((doCreateTakeOrder == doCreateTakeOrder))
472478 then nil
473479 else throw("Strict value is not equal to itself.")
474480 }
475481 else throw("Strict value is not equal to itself.")
476482 }
477483 else throw("Strict value is not equal to itself.")
478484 }
479485 else throw("Strict value is not equal to itself.")
480486 }
481487 else throw("Strict value is not equal to itself.")
482488 }
483489 else throw("Strict value is not equal to itself.")
484490 }
485491 }
486492 else throw("Strict value is not equal to itself.")
487493 }
488494
489495
490496
491497 @Callable(i)
492498 func internalMarkOrderExecuted (_amm,_trader,_orderId) = if (if (if (!(initialized()))
493499 then true
494500 else !(isWhitelist(_amm)))
495501 then true
496502 else !((i.caller == this)))
497503 then throw("Invalid internalMarkOrderExecuted parameters")
498504 else {
499505 let newTraderOrderCount = (getTraderOrderCount(_amm, _trader) - 1)
500506 ((updateTraderOrderCount(_amm, _trader, newTraderOrderCount) ++ addRemoveOrderId(_orderId, _amm, _trader, false)) ++ markExecuteOrder(_orderId))
501507 }
502508
503509
504510
505511 @Callable(i)
506512 func internalCreateOrderRequest (_trader,_amm,_orderId,_type,_triggerPrice,_limitPrice) = if (if (if (if (if (!(initialized()))
507513 then true
508514 else !(isWhitelist(_amm)))
509515 then true
510516 else (0 >= _triggerPrice))
511517 then true
512518 else (0 > _limitPrice))
513519 then true
514520 else !((i.caller == this)))
515521 then throw("Invalid internalCreateOrderRequest parameters")
516522 else saveOrderRequest(_orderId, _amm, _trader, _type, _triggerPrice, _limitPrice)
517523
518524
519525
520526 @Callable(i)
521527 func internalCreateOrder (_trader,_amm,_type,_triggerPrice,_limitPrice,_amountIn,_leverage,_side,_refLink,_paymentAssetId,_paymentAmount,_expiration) = if (if (if (if (if (if (if (if (if (if (!(initialized()))
522528 then true
523529 else !(isWhitelist(_amm)))
524530 then true
525531 else (0 >= _triggerPrice))
526532 then true
527533 else (0 > _limitPrice))
528534 then true
529535 else (0 >= _amountIn))
530536 then true
531537 else (0 > _leverage))
532538 then true
533539 else !(if ((_side == LONG))
534540 then true
535541 else (_side == SHORT)))
536542 then true
537543 else !(if (if ((_type == STOP))
538544 then true
539545 else (_type == TAKE))
540546 then true
541547 else (_type == LIMIT)))
542548 then true
543549 else !((i.caller == this)))
544550 then true
545551 else (0 > _expiration))
546552 then throw("Invalid internalCreateOrder parameters")
547553 else {
548554 let orderId = (currentOrderId() + 1)
549555 let positionDirection = getPositionDirection(_side, _type)
550556 let newTraderOrderCount = (getTraderOrderCount(_amm, _trader) + 1)
551557 let positionSize = getPositionSize(_amm, _trader, positionDirection)
552558 let _direction = if (if (if ((positionSize == 0))
553559 then true
554560 else if ((positionSize > 0))
555561 then (_side == LONG)
556562 else false)
557563 then true
558564 else if ((0 > positionSize))
559565 then (_side == SHORT)
560566 else false)
561567 then INCREASE
562568 else DECREASE
563569 if (if ((positionSize == 0))
564570 then if ((_type == STOP))
565571 then true
566572 else (_type == TAKE)
567573 else false)
568574 then throw("Can not create STOP/TAKE order: no position")
569575 else {
570576 let usdnPayment = if ((_direction == INCREASE))
571577 then if (if ((_paymentAssetId != toBase58String(quoteAsset())))
572578 then true
573579 else (_paymentAmount != _amountIn))
574580 then throw("Invalid createLimitOrder parameters: invalid payment")
575581 else {
576582 let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), _paymentAmount)])
577583 if ((stake == stake))
578584 then _paymentAmount
579585 else throw("Strict value is not equal to itself.")
580586 }
581587 else 0
582588 if ((usdnPayment == usdnPayment))
583589 then {
584590 let positionId = if ((positionSize != 0))
585591 then getPositionId(_amm, _trader, positionDirection)
586592 else 0
587593 if (if (if ((_type == STOP))
588594 then true
589595 else (_type == TAKE))
590596 then (positionId == 0)
591597 else false)
592598 then throw("STOP and TAKE order should be assigned to position with id != 0")
593599 else if ((newTraderOrderCount > MAX_TRADER_ORDERS_PER_AMM))
594600 then throw("Invalid createLimitOrder parameters: order count")
595601 else {
596602 let changeSet = (((saveOrder(orderId, _amm, _trader, _amountIn, _leverage, _type, _triggerPrice, usdnPayment, _side, _refLink, positionId, _limitPrice, _expiration) ++ addRemoveOrderId(orderId, _amm, _trader, true)) ++ updateTraderOrderCount(_amm, _trader, newTraderOrderCount)) ++ updateLastOrderId(orderId))
597603 $Tuple2(changeSet, orderId)
598604 }
599605 }
600606 else throw("Strict value is not equal to itself.")
601607 }
602608 }
603609
604610
605611
606612 @Callable(i)
607613 func cancelOrder (_orderId) = {
608- let $t02383724056 = getOrder(_orderId)
609- let _amm = $t02383724056._1
610- let _trader = $t02383724056._2
611- let _amountIn = $t02383724056._3
612- let _leverage = $t02383724056._4
613- let _type = $t02383724056._5
614- let _triggerPrice = $t02383724056._6
615- let _amountUsdn = $t02383724056._7
616- let _side = $t02383724056._8
617- let _refLink = $t02383724056._9
618- let _positionId = $t02383724056._10
619- let _limitPrice = $t02383724056._11
614+ let $t02405224271 = getOrder(_orderId)
615+ let _amm = $t02405224271._1
616+ let _trader = $t02405224271._2
617+ let _amountIn = $t02405224271._3
618+ let _leverage = $t02405224271._4
619+ let _type = $t02405224271._5
620+ let _triggerPrice = $t02405224271._6
621+ let _amountUsdn = $t02405224271._7
622+ let _side = $t02405224271._8
623+ let _refLink = $t02405224271._9
624+ let _positionId = $t02405224271._10
625+ let _limitPrice = $t02405224271._11
620626 if (if (if (!(initialized()))
621627 then true
622628 else !(isValid(_orderId)))
623629 then true
624630 else !((toString(i.caller) == _trader)))
625631 then throw("Invalid cancelOrder parameters")
626632 else {
627633 let cleanUp = invoke(this, "cleanUpStaleOrders", [_amm, _trader], nil)
628634 if ((cleanUp == cleanUp))
629635 then {
630636 let newTraderOrderCount = (getTraderOrderCount(_amm, _trader) - 1)
631637 let withdraw = if ((_amountUsdn > 0))
632638 then {
633639 let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), _amountUsdn], nil)
634640 if ((unstake == unstake))
635641 then nil
636642 else throw("Strict value is not equal to itself.")
637643 }
638644 else nil
639645 if ((withdraw == withdraw))
640646 then (((markCancelOrder(_orderId) ++ addRemoveOrderId(_orderId, _amm, _trader, false)) ++ updateTraderOrderCount(_amm, _trader, newTraderOrderCount)) ++ (if ((_amountUsdn > 0))
641647 then [ScriptTransfer(i.caller, _amountUsdn, quoteAsset())]
642648 else nil))
643649 else throw("Strict value is not equal to itself.")
644650 }
645651 else throw("Strict value is not equal to itself.")
646652 }
647653 }
648654
649655
650656
651657 @Callable(i)
652-func executeOrder (_orderId) = {
653- let $t02525425473 = getOrder(_orderId)
654- let _amm = $t02525425473._1
655- let _trader = $t02525425473._2
656- let _amountIn = $t02525425473._3
657- let _leverage = $t02525425473._4
658- let _type = $t02525425473._5
659- let _triggerPrice = $t02525425473._6
660- let _amountUsdn = $t02525425473._7
661- let _side = $t02525425473._8
662- let _refLink = $t02525425473._9
663- let _positionId = $t02525425473._10
664- let _limitPrice = $t02525425473._11
658+func executeOrder (_orderId,_priceData) = {
659+ let $t02548925708 = getOrder(_orderId)
660+ let _amm = $t02548925708._1
661+ let _trader = $t02548925708._2
662+ let _amountIn = $t02548925708._3
663+ let _leverage = $t02548925708._4
664+ let _type = $t02548925708._5
665+ let _triggerPrice = $t02548925708._6
666+ let _amountUsdn = $t02548925708._7
667+ let _side = $t02548925708._8
668+ let _refLink = $t02548925708._9
669+ let _positionId = $t02548925708._10
670+ let _limitPrice = $t02548925708._11
665671 let cleanUp = invoke(this, "cleanUpStaleOrders", [_amm, _trader], nil)
666672 if ((cleanUp == cleanUp))
667673 then {
668674 let positionDirection = getPositionDirection(_side, _type)
669675 if (if (!(initialized()))
670676 then true
671677 else !(isValid(_orderId)))
672678 then throw("Invalid executeOrder parameters")
673679 else {
674680 let positionSize = getPositionSize(_amm, _trader, positionDirection)
675681 if ((positionSize == positionSize))
676682 then {
677683 let currentPositionId = if ((positionSize != 0))
678684 then getPositionId(_amm, _trader, positionDirection)
679685 else 0
680- let $t02598029358 = if ((_type == STOP))
686+ let $t02621529639 = if ((_type == STOP))
681687 then {
682688 let _positionDirection = if ((positionSize > 0))
683689 then LONG
684690 else if ((0 > positionSize))
685691 then SHORT
686692 else throw("Can not execute STOP order: no open position")
687693 let marketPrice = getMarketPrice(_amm)
688694 let isExecutable = if ((_side == _positionDirection))
689695 then throw("Can not execute STOP order: reduce only")
690696 else if ((currentPositionId != _positionId))
691697 then throw("Can not execute STOP order: position closed")
692698 else if ((_positionDirection == LONG))
693699 then (_triggerPrice >= marketPrice)
694700 else (marketPrice >= _triggerPrice)
695701 if (isExecutable)
696- then $Tuple3("closePosition", [minv(_amountIn, abs(positionSize)), positionDirection, muld(_limitPrice, abs(positionSize)), false], nil)
702+ then $Tuple3("closePosition", [minv(_amountIn, abs(positionSize)), positionDirection, muld(_limitPrice, abs(positionSize)), false, _priceData], nil)
697703 else throw("Can not execute STOP order: triggerPrice mismatch")
698704 }
699705 else if ((_type == TAKE))
700706 then {
701707 let _positionDirection = if ((positionSize > 0))
702708 then LONG
703709 else if ((0 > positionSize))
704710 then SHORT
705711 else throw("Can not execute STOP order: no open position")
706712 let marketPrice = getMarketPrice(_amm)
707713 let isExecutable = if ((_side == _positionDirection))
708714 then throw("Can not execute TAKE order: reduce only")
709715 else if ((currentPositionId != _positionId))
710716 then throw(((("Can not execute TAKE order: position closed " + toString(currentPositionId)) + "!=") + toString(_positionId)))
711717 else if ((_positionDirection == LONG))
712718 then (marketPrice >= _triggerPrice)
713719 else (_triggerPrice >= marketPrice)
714720 if (isExecutable)
715- then $Tuple3("closePosition", [minv(_amountIn, abs(positionSize)), positionDirection, muld(_limitPrice, abs(positionSize)), false], nil)
721+ then $Tuple3("closePosition", [minv(_amountIn, abs(positionSize)), positionDirection, muld(_limitPrice, abs(positionSize)), false, _priceData], nil)
716722 else throw("Can not execute TAKE order: triggerPrice mismatch")
717723 }
718724 else if ((_type == LIMIT))
719725 then {
720726 let marketPrice = getMarketPrice(_amm)
721727 let spread = if ((_limitPrice == 0))
722728 then getSpread(_triggerPrice)
723729 else abs((_triggerPrice - _limitPrice))
724730 let isExecutable = if ((marketPrice >= (_triggerPrice - spread)))
725731 then ((_triggerPrice + spread) >= marketPrice)
726732 else false
727733 if (isExecutable)
728734 then {
729735 let amountInWithFee = (_amountUsdn - muld(_amountUsdn, getFee(_amm, _trader)))
730736 $Tuple3("increasePosition", [_side, _leverage, if ((_limitPrice == 0))
731737 then 0
732- else divd(amountInWithFee, _limitPrice), _refLink], [AttachedPayment(quoteAsset(), _amountUsdn)])
738+ else divd(amountInWithFee, _limitPrice), _refLink, _priceData], [AttachedPayment(quoteAsset(), _amountUsdn)])
733739 }
734740 else throw("Can not execute LIMIT order: triggerPrice mismatch")
735741 }
736742 else throw(("Invalid order type: " + toString(_type)))
737- let method = $t02598029358._1
738- let args = $t02598029358._2
739- let payments = $t02598029358._3
743+ let method = $t02621529639._1
744+ let args = $t02621529639._2
745+ let payments = $t02621529639._3
740746 let withdraw = if ((size(payments) == 1))
741747 then {
742748 let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), payments[0].amount], nil)
743749 if ((unstake == unstake))
744750 then nil
745751 else throw("Strict value is not equal to itself.")
746752 }
747753 else nil
748754 if ((withdraw == withdraw))
749755 then {
750756 let doSetContext = invoke(this, "setContext", [_trader], nil)
751757 if ((doSetContext == doSetContext))
752758 then {
753759 let doClosePosition = invoke(addressFromStringValue(_amm), method, args, payments)
754760 if ((doClosePosition == doClosePosition))
755761 then {
756762 let doResetContext = invoke(this, "resetContext", nil, nil)
757763 if ((doResetContext == doResetContext))
758764 then {
759765 let executeOrderRequest = if ((_type == LIMIT))
760766 then {
761767 let newPositionSize = getPositionSize(_amm, _trader, positionDirection)
762768 if ((newPositionSize == newPositionSize))
763769 then {
764770 let newPositionId = getPositionId(_amm, _trader, positionDirection)
765771 if ((newPositionId == newPositionId))
766772 then {
767773 let positionSizeDelta = (newPositionSize - positionSize)
768774 let closeOrderSide = if ((newPositionSize > 0))
769775 then SHORT
770776 else LONG
771777 let makeTakeOrder = if (haveOrderRequest(_orderId, TAKE))
772778 then {
773- let $t03032030519 = getOrderRequest(_orderId, TAKE)
774- let newOrderId = $t03032030519._1
775- let newAmm = $t03032030519._2
776- let newTrader = $t03032030519._3
777- let newType = $t03032030519._4
778- let newTriggerPrice = $t03032030519._5
779- let newLimitPrice = $t03032030519._6
779+ let $t03060130800 = getOrderRequest(_orderId, TAKE)
780+ let newOrderId = $t03060130800._1
781+ let newAmm = $t03060130800._2
782+ let newTrader = $t03060130800._3
783+ let newType = $t03060130800._4
784+ let newTriggerPrice = $t03060130800._5
785+ let newLimitPrice = $t03060130800._6
780786 let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
781787 if ((doCall == doCall))
782788 then nil
783789 else throw("Strict value is not equal to itself.")
784790 }
785791 else nil
786792 if ((makeTakeOrder == makeTakeOrder))
787793 then {
788794 let makeStopOrder = if (haveOrderRequest(_orderId, STOP))
789795 then {
790- let $t03109231291 = getOrderRequest(_orderId, STOP)
791- let newOrderId = $t03109231291._1
792- let newAmm = $t03109231291._2
793- let newTrader = $t03109231291._3
794- let newType = $t03109231291._4
795- let newTriggerPrice = $t03109231291._5
796- let newLimitPrice = $t03109231291._6
796+ let $t03137331572 = getOrderRequest(_orderId, STOP)
797+ let newOrderId = $t03137331572._1
798+ let newAmm = $t03137331572._2
799+ let newTrader = $t03137331572._3
800+ let newType = $t03137331572._4
801+ let newTriggerPrice = $t03137331572._5
802+ let newLimitPrice = $t03137331572._6
797803 let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
798804 if ((doCall == doCall))
799805 then nil
800806 else throw("Strict value is not equal to itself.")
801807 }
802808 else nil
803809 if ((makeStopOrder == makeStopOrder))
804810 then (makeTakeOrder ++ makeStopOrder)
805811 else throw("Strict value is not equal to itself.")
806812 }
807813 else throw("Strict value is not equal to itself.")
808814 }
809815 else throw("Strict value is not equal to itself.")
810816 }
811817 else throw("Strict value is not equal to itself.")
812818 }
813819 else nil
814820 if ((executeOrderRequest == executeOrderRequest))
815821 then {
816822 let doMarkOrderExecuted = invoke(this, "internalMarkOrderExecuted", [_amm, _trader, _orderId], nil)
817823 if ((doMarkOrderExecuted == doMarkOrderExecuted))
818824 then nil
819825 else throw("Strict value is not equal to itself.")
820826 }
821827 else throw("Strict value is not equal to itself.")
822828 }
823829 else throw("Strict value is not equal to itself.")
824830 }
825831 else throw("Strict value is not equal to itself.")
826832 }
827833 else throw("Strict value is not equal to itself.")
828834 }
829835 else throw("Strict value is not equal to itself.")
830836 }
831837 else throw("Strict value is not equal to itself.")
832838 }
833839 }
834840 else throw("Strict value is not equal to itself.")
835841 }
836842
837843
838844
839845 @Callable(i)
840-func view_canExecuteOrder (_orderId) = {
841- let s = invoke(this, "executeOrder", [_orderId], nil)
846+func view_canExecuteOrder (_orderId,_priceData) = {
847+ let s = invoke(this, "executeOrder", [_orderId, _priceData], nil)
842848 if ((s == s))
843849 then throw("Success")
844850 else throw("Strict value is not equal to itself.")
845851 }
846852
847853
848854 @Verifier(tx)
849855 func verify () = {
850856 let coordinatorStr = getString(this, k_coordinatorAddress)
851857 if (isDefined(coordinatorStr))
852858 then {
853859 let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
854860 if (isDefined(admin))
855861 then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
856862 else throw("unable to verify: admin not set in coordinator")
857863 }
858864 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
859865 }
860866

github/deemru/w8io/3ef1775 
215.62 ms