tx · F3UGMSQFKnv1otcpC9jNZzmhXGnToxQPjEm6beCFwih6

3N8G95pEaYEhZ4U3m3UrzpEzwBFn5vvXsZH:  -0.07000000 Waves

2022.12.08 11:42 [2351140] smart account 3N8G95pEaYEhZ4U3m3UrzpEzwBFn5vvXsZH > SELF 0.00000000 Waves

{ "type": 13, "id": "F3UGMSQFKnv1otcpC9jNZzmhXGnToxQPjEm6beCFwih6", "fee": 7000000, "feeAssetId": null, "timestamp": 1670488924669, "version": 2, "chainId": 84, "sender": "3N8G95pEaYEhZ4U3m3UrzpEzwBFn5vvXsZH", "senderPublicKey": "Hj6oyH6As5UWo8fZ1K4hPsEY7nxH3MvhBqDD6axiwjXs", "proofs": [ "5xNbSYM7xZLT4UR9ceb42bdLr3v2y382px5KTiVHHWoCe5JS4F9ja7sY2Q6SngmhT4r1fNRNYW26HCM5A5QA4jjm" ], "script": "base64:BgJ1CAISABIAEgASABIDCgEBEgMKAQESDAoKAQEBAQEBAQEBARIRCg8BAQEBAQEBCAgIAQEBAQESBQoDAQEBEgYKBAEBAQgSABIDCgEBEgQKAgEBEgMKAQgSABIAEgMKAQgSAwoBARIAEgASAwoBCBIAEgQKAggIuwEACWtfb3JhX2tleQIJa19vcmFfa2V5AA9rX29yYV9ibG9ja19rZXkCD2tfb3JhX2Jsb2NrX2tleQAFa19vcmECBWtfb3JhAAlrX2JhbGFuY2UCCWtfYmFsYW5jZQAKa19zZXF1ZW5jZQIKa19zZXF1ZW5jZQAOa19wb3NpdGlvblNpemUCDmtfcG9zaXRpb25TaXplABBrX3Bvc2l0aW9uTWFyZ2luAhBrX3Bvc2l0aW9uTWFyZ2luABZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsAhZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsAC5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAhJrX3Bvc2l0aW9uRnJhY3Rpb24AEmtfcG9zaXRpb25TZXF1ZW5jZQISa19wb3NpdGlvblNlcXVlbmNlAA9rX3Bvc2l0aW9uQXNzZXQCD2tfcG9zaXRpb25Bc3NldAANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAAIa19wYXVzZWQCCGtfcGF1c2VkAAtrX2Nsb3NlT25seQILa19jbG9zZU9ubHkABWtfZmVlAgVrX2ZlZQAPa19mdW5kaW5nUGVyaW9kAg9rX2Z1bmRpbmdQZXJpb2QAEWtfaW5pdE1hcmdpblJhdGlvAhFrX2luaXRNYXJnaW5SYXRpbwAYa19tYWludGVuYW5jZU1hcmdpblJhdGlvAgVrX21tcgAVa19saXF1aWRhdGlvbkZlZVJhdGlvAhVrX2xpcXVpZGF0aW9uRmVlUmF0aW8AGWtfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8CFmtfcGFydExpcXVpZGF0aW9uUmF0aW8ADWtfc3ByZWFkTGltaXQCDWtfc3ByZWFkTGltaXQAEGtfbWF4UHJpY2VJbXBhY3QCEGtfbWF4UHJpY2VJbXBhY3QAEGtfbWF4UHJpY2VTcHJlYWQCEGtfbWF4UHJpY2VTcHJlYWQAEWtfbWF4T3Blbk5vdGlvbmFsAhFrX21heE9wZW5Ob3Rpb25hbAANa19sYXN0RGF0YVN0cgINa19sYXN0RGF0YVN0cgAOa19sYXN0TWludXRlSWQCDmtfbGFzdE1pbnV0ZUlkAB1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UAE2tfdHdhcERhdGFMYXN0UHJpY2UCE2tfdHdhcERhdGFMYXN0UHJpY2UAGmtfdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkAhprX3R3YXBEYXRhUHJldmlvdXNNaW51dGVJZAAla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgIba19sYXRlc3RMb25nUHJlbWl1bUZyYWN0aW9uACZrX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgIca19sYXRlc3RTaG9ydFByZW1pdW1GcmFjdGlvbgASa19uZXh0RnVuZGluZ0Jsb2NrAh5rX25leHRGdW5kaW5nQmxvY2tNaW5UaW1lc3RhbXAAEWtfbG9uZ0Z1bmRpbmdSYXRlAhFrX2xvbmdGdW5kaW5nUmF0ZQASa19zaG9ydEZ1bmRpbmdSYXRlAhJrX3Nob3J0RnVuZGluZ1JhdGUAE2tfcXVvdGVBc3NldFJlc2VydmUCCGtfcXRBc3RSABJrX2Jhc2VBc3NldFJlc2VydmUCCGtfYnNBc3RSABJrX3F1b3RlQXNzZXRXZWlnaHQCCGtfcXRBc3RXABFrX2Jhc2VBc3NldFdlaWdodAIIa19ic0FzdFcAE2tfdG90YWxQb3NpdGlvblNpemUCE2tfdG90YWxQb3NpdGlvblNpemUAF2tfdG90YWxMb25nUG9zaXRpb25TaXplAhdrX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAYa190b3RhbFNob3J0UG9zaXRpb25TaXplAhhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUAFmtfb3BlbkludGVyZXN0Tm90aW9uYWwCFmtfb3BlbkludGVyZXN0Tm90aW9uYWwAE2tfb3BlbkludGVyZXN0U2hvcnQCE2tfb3BlbkludGVyZXN0U2hvcnQAEmtfb3BlbkludGVyZXN0TG9uZwISa19vcGVuSW50ZXJlc3RMb25nABRrX2Nvb3JkaW5hdG9yQWRkcmVzcwIUa19jb29yZGluYXRvckFkZHJlc3MAD2tfdmF1bHRfYWRkcmVzcwIPa192YXVsdF9hZGRyZXNzAA9rX2FkbWluX2FkZHJlc3MCD2tfYWRtaW5fYWRkcmVzcwASa19hZG1pbl9wdWJsaWNfa2V5AhJrX2FkbWluX3B1YmxpY19rZXkADWtfcXVvdGVfYXNzZXQCDWtfcXVvdGVfYXNzZXQAD2tfcXVvdGVfc3Rha2luZwIPa19xdW90ZV9zdGFraW5nABFrX3N0YWtpbmdfYWRkcmVzcwIRa19zdGFraW5nX2FkZHJlc3MAD2tfbWluZXJfYWRkcmVzcwIPa19taW5lcl9hZGRyZXNzABBrX29yZGVyc19hZGRyZXNzAhBrX29yZGVyc19hZGRyZXNzABJrX3JlZmVycmFsX2FkZHJlc3MCEmtfcmVmZXJyYWxfYWRkcmVzcwAUa19jb2xsYXRlcmFsX2FkZHJlc3MCFGtfY29sbGF0ZXJhbF9hZGRyZXNzABJrX2V4Y2hhbmdlX2FkZHJlc3MCEmtfZXhjaGFuZ2VfYWRkcmVzcwAVa19uZnRfbWFuYWdlcl9hZGRyZXNzAhVrX25mdF9tYW5hZ2VyX2FkZHJlc3MAIGtfdHJhZGVyX21hcmtldF9hc3NldF9jb2xsYXRlcmFsAiBrX3RyYWRlcl9tYXJrZXRfYXNzZXRfY29sbGF0ZXJhbAEOdG9Db21wb3NpdGVLZXkCBF9rZXkIX2FkZHJlc3MJAKwCAgkArAICBQRfa2V5AgFfBQhfYWRkcmVzcwELY29vcmRpbmF0b3IACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MCE0Nvb3JkaW5hdG9yIG5vdCBzZXQBDGFkbWluQWRkcmVzcwAJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUPa19hZG1pbl9hZGRyZXNzAQ5hZG1pblB1YmxpY0tleQAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUSa19hZG1pbl9wdWJsaWNfa2V5AQpxdW90ZUFzc2V0AAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABQ1rX3F1b3RlX2Fzc2V0ARFxdW90ZUFzc2V0U3Rha2luZwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABQ9rX3F1b3RlX3N0YWtpbmcCG1F1b3RlIGFzc2V0IHN0YWtpbmcgbm90IHNldAEOc3Rha2luZ0FkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAURa19zdGFraW5nX2FkZHJlc3MCD1N0YWtpbmcgbm90IHNldAEMdmF1bHRBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfdmF1bHRfYWRkcmVzcwINVmF1bHQgbm90IHNldAEMbWluZXJBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfbWluZXJfYWRkcmVzcwINTWluZXIgbm90IHNldAENb3JkZXJzQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRBrX29yZGVyc19hZGRyZXNzAg5PcmRlcnMgbm90IHNldAEPcmVmZXJyYWxBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEmtfcmVmZXJyYWxfYWRkcmVzcwIQUmVmZXJyYWwgbm90IHNldAERbmZ0TWFuYWdlckFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUVa19uZnRfbWFuYWdlcl9hZGRyZXNzAhNORlQgTWFuYWdlciBub3Qgc2V0ARFjb2xsYXRlcmFsQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRRrX2NvbGxhdGVyYWxfYWRkcmVzcwIaQ29sbGF0ZXJhbCBNYW5hZ2VyIG5vdCBzZXQBC3N3YXBBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQELY29vcmRpbmF0b3IABRJrX2V4Y2hhbmdlX2FkZHJlc3MCD05vIHN3YXAgYWRkcmVzcwIUSW52YWxpZCBzd2FwIGFkZHJlc3MAEWtfd2hpdGVsaXN0X2Fzc2V0AhFrX3doaXRlbGlzdF9hc3NldAEQaXNXaGl0ZWxpc3RBc3NldAEIX2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEWNvbGxhdGVyYWxBZGRyZXNzAAkBDnRvQ29tcG9zaXRlS2V5AgURa193aGl0ZWxpc3RfYXNzZXQFCF9hc3NldElkBwANa190b2tlbl9wYXJhbQINa190b2tlbl9wYXJhbQAMa190b2tlbl90eXBlAgxrX3Rva2VuX3R5cGUAGEZFRV9SRURVQ1RJT05fVE9LRU5fVFlQRQINZmVlX3JlZHVjdGlvbgAIRElSX0xPTkcAAQAJRElSX1NIT1JUAAIADVRXQVBfSU5URVJWQUwADwAPT1JBQ0xFX0lOVEVSVkFMAA8AB1NFQ09ORFMA6AcAD0RFQ0lNQUxfTlVNQkVSUwAGAAxERUNJTUFMX1VOSVQJAGgCAAEJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgAHT05FX0RBWQkAaAIAgKMFBQxERUNJTUFMX1VOSVQACEFMTF9GRUVTAGQAD1BOTF9PUFRJT05fU1BPVAABABFQTkxfT1BUSU9OX09SQUNMRQACAQFzAQJfeAkArAICCQCkAwEFAl94AgEsAQRkaXZkAgJfeAJfeQkAbgQFAl94BQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEEbXVsZAICX3gCX3kJAG4EBQJfeAUCX3kFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BBXNxcnRkAQJfeAkBBHNxcnQEBQJfeAUPREVDSU1BTF9OVU1CRVJTBQ9ERUNJTUFMX05VTUJFUlMFCEhBTEZFVkVOAQRwb3dkAgJfeAJfeQkAbAYFAl94BQ9ERUNJTUFMX05VTUJFUlMFAl95BQ9ERUNJTUFMX05VTUJFUlMFD0RFQ0lNQUxfTlVNQkVSUwUISEFMRkVWRU4BBWJkaXZkAgJfeAJfeQkAvQIEBQJfeAkAtgIBBQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEFYm11bGQCAl94Al95CQC9AgQFAl94BQJfeQkAtgIBBQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAQZic3FydGQBAl94CQEKc3FydEJpZ0ludAQFAl94BQ9ERUNJTUFMX05VTUJFUlMFD0RFQ0lNQUxfTlVNQkVSUwUISEFMRkVWRU4BBWJwb3dkAgJfeAJfeQkAdgYFAl94BQ9ERUNJTUFMX05VTUJFUlMFAl95BQ9ERUNJTUFMX05VTUJFUlMFD0RFQ0lNQUxfTlVNQkVSUwUISEFMRkVWRU4BA2FicwECX3gDCQBmAgUCX3gAAAUCX3gJAQEtAQUCX3gBBHZtYXgCAl94Al95AwkAZwIFAl94BQJfeQUCX3gFAl95AQlsaXN0VG9TdHIBBV9saXN0CgEFX2pvaW4CC2FjY3VtdWxhdG9yA3ZhbAkArAICCQCsAgIFC2FjY3VtdWxhdG9yBQN2YWwCASwECm5ld0xpc3RTdHIKAAIkbAUFX2xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBV9qb2luAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQEC25ld0xpc3RTdHJVCQCzAgIFCm5ld0xpc3RTdHIAAQQLbmV3TGlzdFN0clIDCQAAAgkArwICBQtuZXdMaXN0U3RyVQABAgEsCQCwAgIFC25ld0xpc3RTdHJVAAEFC25ld0xpc3RTdHJVBQtuZXdMaXN0U3RyUgEJc3RyVG9MaXN0AQRfc3RyCQC1CQIFBF9zdHICASwBC3B1c2hUb1F1ZXVlAwVfbGlzdAhfbWF4U2l6ZQZfdmFsdWUDCQBmAgkAkAMBBQVfbGlzdAUIX21heFNpemUJAM0IAgkA0QgCBQVfbGlzdAAABQZfdmFsdWUJAM0IAgUFX2xpc3QFBl92YWx1ZQEDaW50AQFrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUBawkArAICAg1ubyB2YWx1ZSBmb3IgBQFrAQVpbnRPcgIBawNkZWYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUBawUDZGVmAQRzdHJBAghfYWRkcmVzcwRfa2V5BAN2YWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhfYWRkcmVzcwUEX2tleQkArAICAhFObyB2YWx1ZSBmb3Iga2V5IAUEX2tleQUDdmFsAQRpbnRBAghfYWRkcmVzcwRfa2V5BAN2YWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhfYWRkcmVzcwUEX2tleQkArAICAhFObyB2YWx1ZSBmb3Iga2V5IAUEX2tleQUDdmFsAQhjYmFsYW5jZQAJAQNpbnQBBQlrX2JhbGFuY2UBA2ZlZQAJAQNpbnQBBQVrX2ZlZQEPaW5pdE1hcmdpblJhdGlvAAkBA2ludAEFEWtfaW5pdE1hcmdpblJhdGlvAQZxdEFzdFIACQEDaW50AQUTa19xdW90ZUFzc2V0UmVzZXJ2ZQEGYnNBc3RSAAkBA2ludAEFEmtfYmFzZUFzc2V0UmVzZXJ2ZQEGcXRBc3RXAAkBBWludE9yAgUSa19xdW90ZUFzc2V0V2VpZ2h0BQxERUNJTUFMX1VOSVQBBmJzQXN0VwAJAQVpbnRPcgIFEWtfYmFzZUFzc2V0V2VpZ2h0BQxERUNJTUFMX1VOSVQBEXRvdGFsUG9zaXRpb25TaXplAAkBA2ludAEFE2tfdG90YWxQb3NpdGlvblNpemUBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAkBA2ludAEFFmtfb3BlbkludGVyZXN0Tm90aW9uYWwBEW9wZW5JbnRlcmVzdFNob3J0AAkBA2ludAEFE2tfb3BlbkludGVyZXN0U2hvcnQBEG9wZW5JbnRlcmVzdExvbmcACQEDaW50AQUSa19vcGVuSW50ZXJlc3RMb25nARluZXh0RnVuZGluZ0Jsb2NrVGltZXN0YW1wAAkBA2ludAEFEmtfbmV4dEZ1bmRpbmdCbG9jawEQZnVuZGluZ1BlcmlvZFJhdwAJAQNpbnQBBQ9rX2Z1bmRpbmdQZXJpb2QBFGZ1bmRpbmdQZXJpb2REZWNpbWFsAAkAaAIJARBmdW5kaW5nUGVyaW9kUmF3AAUMREVDSU1BTF9VTklUARRmdW5kaW5nUGVyaW9kU2Vjb25kcwAJAGgCCQEQZnVuZGluZ1BlcmlvZFJhdwAFB1NFQ09ORFMBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ACQEDaW50AQUYa19tYWludGVuYW5jZU1hcmdpblJhdGlvARNsaXF1aWRhdGlvbkZlZVJhdGlvAAkBA2ludAEFFWtfbGlxdWlkYXRpb25GZWVSYXRpbwEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ACQEDaW50AQUZa19wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwELc3ByZWFkTGltaXQACQEDaW50AQUNa19zcHJlYWRMaW1pdAEObWF4UHJpY2VJbXBhY3QACQEDaW50AQUQa19tYXhQcmljZUltcGFjdAEObWF4UHJpY2VTcHJlYWQACQEDaW50AQUQa19tYXhQcmljZVNwcmVhZAEPbWF4T3Blbk5vdGlvbmFsAAkBA2ludAEFEWtfbWF4T3Blbk5vdGlvbmFsASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAJAQNpbnQBBSVrX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ACQEDaW50AQUma19sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BFnRvdGFsU2hvcnRQb3NpdGlvblNpemUACQEDaW50AQUYa190b3RhbFNob3J0UG9zaXRpb25TaXplARV0b3RhbExvbmdQb3NpdGlvblNpemUACQEDaW50AQUXa190b3RhbExvbmdQb3NpdGlvblNpemUBDGxhc3RTZXF1ZW5jZQAJAQVpbnRPcgIFCmtfc2VxdWVuY2UAAAEPZ2V0QWN0dWFsQ2FsbGVyAQFpCQELdmFsdWVPckVsc2UCCQCdCAIJAQ1vcmRlcnNBZGRyZXNzAAIIa19zZW5kZXIJAKUIAQgFAWkGY2FsbGVyARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwxfbWFyZ2luUmF0aW8QX2Jhc2VNYXJnaW5SYXRpbxRfbGFyZ2VyVGhhbk9yRXF1YWxUbwQUcmVtYWluaW5nTWFyZ2luUmF0aW8JAGUCBQxfbWFyZ2luUmF0aW8FEF9iYXNlTWFyZ2luUmF0aW8DAwUUX2xhcmdlclRoYW5PckVxdWFsVG8JAGYCAAAFFHJlbWFpbmluZ01hcmdpblJhdGlvBwkAAgECDkludmFsaWQgbWFyZ2luAwMJAQEhAQUUX2xhcmdlclRoYW5PckVxdWFsVG8JAGcCBRRyZW1haW5pbmdNYXJnaW5SYXRpbwAABwkAAgECDkludmFsaWQgbWFyZ2luBgEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgENX3Bvc2l0aW9uU2l6ZQMJAAACBQ1fcG9zaXRpb25TaXplAAAJAAIBAixTaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIF9wb3NpdGlvblNpemUgPT0gMAMJAGYCBQ1fcG9zaXRpb25TaXplAAAJASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAJASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24AAQtnZXRQb3NpdGlvbgEHX3RyYWRlcgQPcG9zaXRpb25TaXplT3B0CQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQdfdHJhZGVyBAckbWF0Y2gwBQ9wb3NpdGlvblNpemVPcHQDCQABAgUHJG1hdGNoMAIDSW50BAxwb3NpdGlvblNpemUFByRtYXRjaDAJAJYKBAUMcG9zaXRpb25TaXplCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uTWFyZ2luBQdfdHJhZGVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQdfdHJhZGVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBS5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQdfdHJhZGVyCQCWCgQAAAAAAAAAAAEQZ2V0UG9zaXRpb25Bc3NldAEHX3RyYWRlcgQQcG9zaXRpb25Bc3NldE9wdAkAnQgCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQ9rX3Bvc2l0aW9uQXNzZXQFB190cmFkZXIEByRtYXRjaDAFEHBvc2l0aW9uQXNzZXRPcHQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBA1wb3NpdGlvbkFzc2V0BQckbWF0Y2gwBQ1wb3NpdGlvbkFzc2V0CQDYBAEJAQpxdW90ZUFzc2V0AAETcmVxdWlyZU9wZW5Qb3NpdGlvbgEHX3RyYWRlcgMJAAACCAkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgJfMQAACQACAQIQTm8gb3BlbiBwb3NpdGlvbgYBC2luaXRpYWxpemVkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ1rX2luaXRpYWxpemVkBwEGcGF1c2VkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQhrX3BhdXNlZAcBCWNsb3NlT25seQAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwULa19jbG9zZU9ubHkHAQ11cGRhdGVSZXNlcnZlAwZfaXNBZGQRX3F1b3RlQXNzZXRBbW91bnQQX2Jhc2VBc3NldEFtb3VudAMFBl9pc0FkZAQHbmV3QmFzZQkAZQIJAQZic0FzdFIABRBfYmFzZUFzc2V0QW1vdW50AwkAZwIAAAUHbmV3QmFzZQkAAgECKlR4IGxlYWQgdG8gYmFzZSBhc3NldCByZXNlcnZlIDw9IDAsIHJldmVydAkAlQoDCQBkAgkBBnF0QXN0UgAFEV9xdW90ZUFzc2V0QW1vdW50BQduZXdCYXNlCQBkAgkBEXRvdGFsUG9zaXRpb25TaXplAAUQX2Jhc2VBc3NldEFtb3VudAQIbmV3UXVvdGUJAGUCCQEGcXRBc3RSAAURX3F1b3RlQXNzZXRBbW91bnQDCQBnAgAABQhuZXdRdW90ZQkAAgECKlR4IGxlYWQgdG8gYmFzZSBxdW90ZSByZXNlcnZlIDw9IDAsIHJldmVydAkAlQoDBQhuZXdRdW90ZQkAZAIJAQZic0FzdFIABRBfYmFzZUFzc2V0QW1vdW50CQBlAgkBEXRvdGFsUG9zaXRpb25TaXplAAUQX2Jhc2VBc3NldEFtb3VudAENY2FsY0ludmFyaWFudAQHX3F0QXN0UgdfcXRBc3RXB19ic0FzdFIHX2JzQXN0VwQHYnF0QXN0UgkAtgIBBQdfcXRBc3RSBAdicXRBc3RXCQC2AgEFB19xdEFzdFcEB2Jic0FzdFIJALYCAQUHX2JzQXN0UgQHYmJzQXN0VwkAtgIBBQdfYnNBc3RXCQEFYm11bGQCCQEFYm11bGQCBQdicXRBc3RSBQdicXRBc3RXCQEFYm11bGQCBQdiYnNBc3RSBQdiYnNBc3RXAQlzd2FwSW5wdXQCBl9pc0FkZBFfcXVvdGVBc3NldEFtb3VudAQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAdfcXRBc3RXCQEGcXRBc3RXAAQHX2JzQXN0VwkBBmJzQXN0VwAEAWsJAQ1jYWxjSW52YXJpYW50BAUHX3F0QXN0UgUHX3F0QXN0VwUHX2JzQXN0UgUHX2JzQXN0VwQWcXVvdGVBc3NldFJlc2VydmVBZnRlcgMFBl9pc0FkZAkAZAIFB19xdEFzdFIFEV9xdW90ZUFzc2V0QW1vdW50CQBlAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQEFWJhc2VBc3NldFJlc2VydmVBZnRlcgkAoAMBCQEFYmRpdmQCBQFrCQC2AgEJAQRtdWxkAgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUHX3F0QXN0VwQYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzCQEEZGl2ZAIJAQNhYnMBCQBlAgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBQdfYnNBc3RSBQdfcXRBc3RXBBVhbW91bnRCYXNlQXNzZXRCb3VnaHQDBQZfaXNBZGQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwkBAS0BBRhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMEDSR0MDE2NjU1MTY4MTgJAQ11cGRhdGVSZXNlcnZlAwUGX2lzQWRkBRFfcXVvdGVBc3NldEFtb3VudAUYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzBBdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFDSR0MDE2NjU1MTY4MTgCXzEEFmJhc2VBc3NldFJlc2VydmVBZnRlcjEIBQ0kdDAxNjY1NTE2ODE4Al8yBBd0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyMQgFDSR0MDE2NjU1MTY4MTgCXzMEC3ByaWNlQmVmb3JlCQEEZGl2ZAIJAQRtdWxkAgUHX3F0QXN0UgUHX3F0QXN0VwkBBG11bGQCBQdfYnNBc3RSBQdfYnNBc3RXBAttYXJrZXRQcmljZQkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzBAlwcmljZURpZmYJAQNhYnMBCQBlAgULcHJpY2VCZWZvcmUFC21hcmtldFByaWNlBAtwcmljZUltcGFjdAkAZQIFDERFQ0lNQUxfVU5JVAkBBGRpdmQCBQtwcmljZUJlZm9yZQkAZAIFC3ByaWNlQmVmb3JlBQlwcmljZURpZmYEE21heFByaWNlSW1wYWN0VmFsdWUJAQ5tYXhQcmljZUltcGFjdAADCQBmAgULcHJpY2VJbXBhY3QFE21heFByaWNlSW1wYWN0VmFsdWUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDVByaWNlIGltcGFjdCAJAKQDAQULcHJpY2VJbXBhY3QCFCA+IG1heCBwcmljZSBpbXBhY3QgCQCkAwEFE21heFByaWNlSW1wYWN0VmFsdWUCFSBiZWZvcmUgcXVvdGUgYXNzZXQ6IAkApAMBBQdfcXRBc3RSAhQgYmVmb3JlIGJhc2UgYXNzZXQ6IAkApAMBBQdfYnNBc3RSAiEgcXVvdGUgYXNzZXQgYW1vdW50IHRvIGV4Y2hhbmdlOiAJAKQDAQURX3F1b3RlQXNzZXRBbW91bnQCDyBwcmljZSBiZWZvcmU6IAkApAMBBQtwcmljZUJlZm9yZQIOIG1hcmtldFByaWNlOiAJAKQDAQULbWFya2V0UHJpY2UJAJYKBAUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0BRdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQUWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQUXdG90YWxQb3NpdGlvblNpemVBZnRlcjEBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEEF9vbGRQb3NpdGlvblNpemUSX29sZFBvc2l0aW9uTWFyZ2luJV9vbGRQb3NpdGlvbkN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24MX21hcmdpbkRlbHRhBA5mdW5kaW5nUGF5bWVudAMJAQIhPQIFEF9vbGRQb3NpdGlvblNpemUAAAQgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24JAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUQX29sZFBvc2l0aW9uU2l6ZQkBBG11bGQCCQBlAgUgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FJV9vbGRQb3NpdGlvbkN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FEF9vbGRQb3NpdGlvblNpemUAAAQMc2lnbmVkTWFyZ2luCQBkAgkAZQIFDF9tYXJnaW5EZWx0YQUOZnVuZGluZ1BheW1lbnQFEl9vbGRQb3NpdGlvbk1hcmdpbgQNJHQwMTgzMDUxODQzMgMJAGYCAAAFDHNpZ25lZE1hcmdpbgkAlAoCAAAJAQNhYnMBBQxzaWduZWRNYXJnaW4JAJQKAgkBA2FicwEFDHNpZ25lZE1hcmdpbgAABAxyZW1haW5NYXJnaW4IBQ0kdDAxODMwNTE4NDMyAl8xBAdiYWREZWJ0CAUNJHQwMTgzMDUxODQzMgJfMgkAlQoDBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFDmZ1bmRpbmdQYXltZW50ARZzd2FwT3V0cHV0V2l0aFJlc2VydmVzBwZfaXNBZGQQX2Jhc2VBc3NldEFtb3VudBRfY2hlY2tNYXhQcmljZUltcGFjdBJfcXVvdGVBc3NldFJlc2VydmURX3F1b3RlQXNzZXRXZWlnaHQRX2Jhc2VBc3NldFJlc2VydmUQX2Jhc2VBc3NldFdlaWdodAQLcHJpY2VCZWZvcmUJAQRkaXZkAgkBBG11bGQCBRJfcXVvdGVBc3NldFJlc2VydmUFEV9xdW90ZUFzc2V0V2VpZ2h0CQEEbXVsZAIFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0V2VpZ2h0AwkAAAIFEF9iYXNlQXNzZXRBbW91bnQAAAkAAgECGUludmFsaWQgYmFzZSBhc3NldCBhbW91bnQEAWsJAQ1jYWxjSW52YXJpYW50BAUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfcXVvdGVBc3NldFdlaWdodAURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRXZWlnaHQEGGJhc2VBc3NldFBvb2xBbW91bnRBZnRlcgMFBl9pc0FkZAkAZAIFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0QW1vdW50CQBlAgURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRBbW91bnQED3F1b3RlQXNzZXRBZnRlcgkAoAMBCQEFYmRpdmQCBQFrCQC2AgEJAQRtdWxkAgUYYmFzZUFzc2V0UG9vbEFtb3VudEFmdGVyBRBfYmFzZUFzc2V0V2VpZ2h0BA5xdW90ZUFzc2V0U29sZAkBA2FicwEJAGUCBQ9xdW90ZUFzc2V0QWZ0ZXIJAQRtdWxkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfcXVvdGVBc3NldFdlaWdodAQTbWF4UHJpY2VJbXBhY3RWYWx1ZQkBDm1heFByaWNlSW1wYWN0AAQNJHQwMTk2MjAxOTc4MQkBDXVwZGF0ZVJlc2VydmUDCQEBIQEFBl9pc0FkZAUOcXVvdGVBc3NldFNvbGQFEF9iYXNlQXNzZXRBbW91bnQEF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTk2MjAxOTc4MQJfMQQWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFDSR0MDE5NjIwMTk3ODECXzIEF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxCAUNJHQwMTk2MjAxOTc4MQJfMwQLbWFya2V0UHJpY2UJAQRkaXZkAgUOcXVvdGVBc3NldFNvbGQFEF9iYXNlQXNzZXRBbW91bnQECXByaWNlRGlmZgkBA2FicwEJAGUCBQtwcmljZUJlZm9yZQULbWFya2V0UHJpY2UEC3ByaWNlSW1wYWN0CQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIFC3ByaWNlQmVmb3JlCQBkAgULcHJpY2VCZWZvcmUFCXByaWNlRGlmZgMDCQBmAgULcHJpY2VJbXBhY3QFE21heFByaWNlSW1wYWN0VmFsdWUFFF9jaGVja01heFByaWNlSW1wYWN0BwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgINUHJpY2UgaW1wYWN0IAkApAMBBQtwcmljZUltcGFjdAIUID4gbWF4IHByaWNlIGltcGFjdCAJAKQDAQUTbWF4UHJpY2VJbXBhY3RWYWx1ZQIVIGJlZm9yZSBxdW90ZSBhc3NldDogCQCkAwEFEl9xdW90ZUFzc2V0UmVzZXJ2ZQIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQURX2Jhc2VBc3NldFJlc2VydmUCICBiYXNlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEF9iYXNlQXNzZXRBbW91bnQCDyBwcmljZSBiZWZvcmU6IAkApAMBBQtwcmljZUJlZm9yZQIPIG1hcmtldCBwcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCZCgcFDnF1b3RlQXNzZXRTb2xkBRdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQUWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQUXdG90YWxQb3NpdGlvblNpemVBZnRlcjEJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMFBl9pc0FkZAkBA2FicwEFEF9iYXNlQXNzZXRBbW91bnQAAAkAZQIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAMJAQEhAQUGX2lzQWRkCQEDYWJzAQUQX2Jhc2VBc3NldEFtb3VudAAABQtwcmljZUltcGFjdAEKc3dhcE91dHB1dAMGX2lzQWRkEF9iYXNlQXNzZXRBbW91bnQUX2NoZWNrTWF4UHJpY2VJbXBhY3QJARZzd2FwT3V0cHV0V2l0aFJlc2VydmVzBwUGX2lzQWRkBRBfYmFzZUFzc2V0QW1vdW50BRRfY2hlY2tNYXhQcmljZUltcGFjdAkBBnF0QXN0UgAJAQZxdEFzdFcACQEGYnNBc3RSAAkBBmJzQXN0VwABEmdldE9yYWNsZVR3YXBQcmljZQAEBm9yYWNsZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFBWtfb3JhAgAECHByaWNlS2V5CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQlrX29yYV9rZXkECGJsb2NrS2V5CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQ9rX29yYV9ibG9ja19rZXkECWxhc3RWYWx1ZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBm9yYWNsZQUIcHJpY2VLZXkJAKwCAgkArAICCQCsAgICIkNhbiBub3QgZ2V0IG9yYWNsZSBwcmljZS4gT3JhY2xlOiAJAKUIAQUGb3JhY2xlAgYga2V5OiAFCHByaWNlS2V5BQlsYXN0VmFsdWUBGXJlcXVpcmVOb3RPdmVyU3ByZWFkTGltaXQCEl9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQQLb3JhY2xlUHJpY2UJARJnZXRPcmFjbGVUd2FwUHJpY2UABApwcmljZUFmdGVyCQEEZGl2ZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUEDGF2ZXJhZ2VQcmljZQkBBGRpdmQCCQBkAgULb3JhY2xlUHJpY2UFCnByaWNlQWZ0ZXIJAGgCAAIFDERFQ0lNQUxfVU5JVAQMYWJzUHJpY2VEaWZmCQEEZGl2ZAIJAQNhYnMBCQBlAgULb3JhY2xlUHJpY2UFCnByaWNlQWZ0ZXIFDGF2ZXJhZ2VQcmljZQMJAGYCBQxhYnNQcmljZURpZmYJAQ5tYXhQcmljZVNwcmVhZAAJAAIBCQCsAgIJAKwCAgkArAICAg1QcmljZSBzcHJlYWQgCQCkAwEFDGFic1ByaWNlRGlmZgIUID4gbWF4IHByaWNlIHNwcmVhZCAJAKQDAQkBDm1heFByaWNlU3ByZWFkAAYBHXJlcXVpcmVOb3RPdmVyTWF4T3Blbk5vdGlvbmFsAhFfbG9uZ09wZW5Ob3Rpb25hbBJfc2hvcnRPcGVuTm90aW9uYWwEEF9tYXhPcGVuTm90aW9uYWwJAQ9tYXhPcGVuTm90aW9uYWwAAwkAZgIFEV9sb25nT3Blbk5vdGlvbmFsBRBfbWF4T3Blbk5vdGlvbmFsCQACAQkArAICCQCsAgIJAKwCAgITTG9uZyBvcGVuIG5vdGlvbmFsIAkApAMBBRFfbG9uZ09wZW5Ob3Rpb25hbAIVID4gbWF4IG9wZW4gbm90aW9uYWwgCQCkAwEFEF9tYXhPcGVuTm90aW9uYWwDCQBmAgUSX3Nob3J0T3Blbk5vdGlvbmFsBRBfbWF4T3Blbk5vdGlvbmFsCQACAQkArAICCQCsAgIJAKwCAgIUU2hvcnQgb3BlbiBub3Rpb25hbCAJAKQDAQUSX3Nob3J0T3Blbk5vdGlvbmFsAhUgPiBtYXggb3BlbiBub3Rpb25hbCAJAKQDAQUQX21heE9wZW5Ob3Rpb25hbAYBDGdldFNwb3RQcmljZQAEEl9xdW90ZUFzc2V0UmVzZXJ2ZQkBBnF0QXN0UgAEEV9iYXNlQXNzZXRSZXNlcnZlCQEGYnNBc3RSAAQHX3F0QXN0VwkBBnF0QXN0VwAEB19ic0FzdFcJAQZic0FzdFcACQEEZGl2ZAIJAQRtdWxkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBQdfcXRBc3RXCQEEbXVsZAIFEV9iYXNlQXNzZXRSZXNlcnZlBQdfYnNBc3RXARZpc092ZXJGbHVjdHVhdGlvbkxpbWl0AAQLb3JhY2xlUHJpY2UJARJnZXRPcmFjbGVUd2FwUHJpY2UABAxjdXJyZW50UHJpY2UJAQxnZXRTcG90UHJpY2UACQBmAgkBBGRpdmQCCQEDYWJzAQkAZQIFC29yYWNsZVByaWNlBQxjdXJyZW50UHJpY2UFC29yYWNsZVByaWNlCQELc3ByZWFkTGltaXQAAR9nZXRQb3NpdGlvbkFkanVzdGVkT3Blbk5vdGlvbmFsBg1fcG9zaXRpb25TaXplB19vcHRpb24SX3F1b3RlQXNzZXRSZXNlcnZlEV9xdW90ZUFzc2V0V2VpZ2h0EV9iYXNlQXNzZXRSZXNlcnZlEF9iYXNlQXNzZXRXZWlnaHQED3Bvc2l0aW9uU2l6ZUFicwkBA2FicwEFDV9wb3NpdGlvblNpemUEB2lzU2hvcnQJAGYCAAAFDV9wb3NpdGlvblNpemUEEHBvc2l0aW9uTm90aW9uYWwDCQAAAgUHX29wdGlvbgUPUE5MX09QVElPTl9TUE9UBA0kdDAyMzY1NTIzODc1CQEWc3dhcE91dHB1dFdpdGhSZXNlcnZlcwcJAQEhAQUHaXNTaG9ydAUPcG9zaXRpb25TaXplQWJzBwUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfcXVvdGVBc3NldFdlaWdodAURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRXZWlnaHQEE291dFBvc2l0aW9uTm90aW9uYWwIBQ0kdDAyMzY1NTIzODc1Al8xBAJ4MQgFDSR0MDIzNjU1MjM4NzUCXzIEAngyCAUNJHQwMjM2NTUyMzg3NQJfMwQCeDMIBQ0kdDAyMzY1NTIzODc1Al80BRNvdXRQb3NpdGlvbk5vdGlvbmFsCQEEbXVsZAIFD3Bvc2l0aW9uU2l6ZUFicwkBEmdldE9yYWNsZVR3YXBQcmljZQAFEHBvc2l0aW9uTm90aW9uYWwBK2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sQnlWYWx1ZXMHDV9wb3NpdGlvblNpemUVX3Bvc2l0aW9uT3Blbk5vdGlvbmFsEl9xdW90ZUFzc2V0UmVzZXJ2ZRFfcXVvdGVBc3NldFdlaWdodBFfYmFzZUFzc2V0UmVzZXJ2ZRBfYmFzZUFzc2V0V2VpZ2h0B19vcHRpb24DCQAAAgUNX3Bvc2l0aW9uU2l6ZQAACQACAQIVSW52YWxpZCBwb3NpdGlvbiBzaXplBAdpc1Nob3J0CQBmAgAABQ1fcG9zaXRpb25TaXplBBBwb3NpdGlvbk5vdGlvbmFsCQEfZ2V0UG9zaXRpb25BZGp1c3RlZE9wZW5Ob3Rpb25hbAYFDV9wb3NpdGlvblNpemUFB19vcHRpb24FEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX3F1b3RlQXNzZXRXZWlnaHQFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0V2VpZ2h0BA11bnJlYWxpemVkUG5sAwUHaXNTaG9ydAkAZQIFFV9wb3NpdGlvbk9wZW5Ob3Rpb25hbAUQcG9zaXRpb25Ob3Rpb25hbAkAZQIFEHBvc2l0aW9uTm90aW9uYWwFFV9wb3NpdGlvbk9wZW5Ob3Rpb25hbAkAlAoCBRBwb3NpdGlvbk5vdGlvbmFsBQ11bnJlYWxpemVkUG5sASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIHX3RyYWRlcgdfb3B0aW9uBA0kdDAyNTMwMDI1NDI4CQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBAxwb3NpdGlvblNpemUIBQ0kdDAyNTMwMDI1NDI4Al8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDI1MzAwMjU0MjgCXzIEFHBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwMjUzMDAyNTQyOAJfMwQRcG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDAyNTMwMDI1NDI4Al80CQErZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmxCeVZhbHVlcwcFDHBvc2l0aW9uU2l6ZQUUcG9zaXRpb25PcGVuTm90aW9uYWwJAQZxdEFzdFIACQEGcXRBc3RXAAkBBmJzQXN0UgAJAQZic0FzdFcABQdfb3B0aW9uAQ9jYWxjTWFyZ2luUmF0aW8DDV9yZW1haW5NYXJnaW4IX2JhZERlYnQRX3Bvc2l0aW9uTm90aW9uYWwJAQRkaXZkAgkAZQIFDV9yZW1haW5NYXJnaW4FCF9iYWREZWJ0BRFfcG9zaXRpb25Ob3Rpb25hbAEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIHX3RyYWRlcgdfb3B0aW9uBA0kdDAyNTk0MTI2MDUyCQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBAxwb3NpdGlvblNpemUIBQ0kdDAyNTk0MTI2MDUyAl8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDI1OTQxMjYwNTICXzIEA3BvbggFDSR0MDI1OTQxMjYwNTICXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwMjU5NDEyNjA1MgJfNAQNJHQwMjYwNTgyNjE1MQkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgUHX3RyYWRlcgUHX29wdGlvbgQQcG9zaXRpb25Ob3Rpb25hbAgFDSR0MDI2MDU4MjYxNTECXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDAyNjA1ODI2MTUxAl8yBA0kdDAyNjE1NjI2MzIyCQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFDHBvc2l0aW9uU2l6ZQUOcG9zaXRpb25NYXJnaW4FEXBvc2l0aW9uTHN0VXBkQ1BGBQ11bnJlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDAyNjE1NjI2MzIyAl8xBAdiYWREZWJ0CAUNJHQwMjYxNTYyNjMyMgJfMgkBD2NhbGNNYXJnaW5SYXRpbwMFDHJlbWFpbk1hcmdpbgUHYmFkRGVidAUQcG9zaXRpb25Ob3Rpb25hbAEOZ2V0TWFyZ2luUmF0aW8BB190cmFkZXIJARZnZXRNYXJnaW5SYXRpb0J5T3B0aW9uAgUHX3RyYWRlcgUPUE5MX09QVElPTl9TUE9UARtnZXRQYXJ0aWFsTGlxdWlkYXRpb25BbW91bnQCB190cmFkZXINX3Bvc2l0aW9uU2l6ZQQMbWF4aW11bVJhdGlvCQEEdm1heAIJARdwYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwAJAGUCBQxERUNJTUFMX1VOSVQJAQRkaXZkAgkBDmdldE1hcmdpblJhdGlvAQUHX3RyYWRlcgkBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ABBhtYXhFeGNoYW5nZWRQb3NpdGlvblNpemUJAQRtdWxkAgkBA2FicwEFDV9wb3NpdGlvblNpemUFDG1heGltdW1SYXRpbwQKc3dhcFJlc3VsdAkBCnN3YXBPdXRwdXQDCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABRhtYXhFeGNoYW5nZWRQb3NpdGlvblNpemUHBBxtYXhFeGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAUKc3dhcFJlc3VsdAJfMQQLcHJpY2VJbXBhY3QIBQpzd2FwUmVzdWx0Al83AwkAZgIJAQ5tYXhQcmljZUltcGFjdAAFC3ByaWNlSW1wYWN0BRxtYXhFeGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BBVleGNoYW5nZWRQb3NpdGlvblNpemUJAQRtdWxkAgkBA2FicwEFDV9wb3NpdGlvblNpemUJARdwYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwAEGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQICQEKc3dhcE91dHB1dAMJAGYCBQ1fcG9zaXRpb25TaXplAAAFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQcCXzEFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIHX3RyYWRlchRfY2hlY2tNYXhQcmljZUltcGFjdAQNJHQwMjc1NjIyNzY5MAkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwMjc1NjIyNzY5MAJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAyNzU2MjI3NjkwAl8yBBRwb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDI3NTYyMjc2OTACXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwMjc1NjIyNzY5MAJfNAQNdW5yZWFsaXplZFBubAgJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAJfMgQNJHQwMjc3ODUyNzk1MwkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQxwb3NpdGlvblNpemUFDnBvc2l0aW9uTWFyZ2luBRFwb3NpdGlvbkxzdFVwZENQRgUNdW5yZWFsaXplZFBubAQMcmVtYWluTWFyZ2luCAUNJHQwMjc3ODUyNzk1MwJfMQQHYmFkRGVidAgFDSR0MDI3Nzg1Mjc5NTMCXzIEFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQkBAS0BBQxwb3NpdGlvblNpemUEC3JlYWxpemVkUG5sBQ11bnJlYWxpemVkUG5sBA1tYXJnaW5Ub1ZhdWx0CQEBLQEFDHJlbWFpbk1hcmdpbgQNJHQwMjgwODAyODM1NAkBCnN3YXBPdXRwdXQDCQBmAgUMcG9zaXRpb25TaXplAAAJAQNhYnMBBQxwb3NpdGlvblNpemUFFF9jaGVja01heFByaWNlSW1wYWN0BBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAUNJHQwMjgwODAyODM1NAJfMQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDI4MDgwMjgzNTQCXzIEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDI4MDgwMjgzNTQCXzMEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDAyODA4MDI4MzU0Al80BA50b3RhbExvbmdBZnRlcggFDSR0MDI4MDgwMjgzNTQCXzUED3RvdGFsU2hvcnRBZnRlcggFDSR0MDI4MDgwMjgzNTQCXzYEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIJAGUCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABRRwb3NpdGlvbk9wZW5Ob3Rpb25hbAkAnwoNBRVleGNoYW5nZWRQb3NpdGlvblNpemUFB2JhZERlYnQFC3JlYWxpemVkUG5sBQ1tYXJnaW5Ub1ZhdWx0BRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQFDnRvdGFsTG9uZ0FmdGVyBQ90b3RhbFNob3J0QWZ0ZXIJAGUCCQEQb3BlbkludGVyZXN0TG9uZwADCQBmAgUMcG9zaXRpb25TaXplAAAFFHBvc2l0aW9uT3Blbk5vdGlvbmFsAAAJAGUCCQERb3BlbkludGVyZXN0U2hvcnQAAwkAZgIAAAUMcG9zaXRpb25TaXplBRRwb3NpdGlvbk9wZW5Ob3Rpb25hbAAAARBnZXRUd2FwU3BvdFByaWNlAAQIbWludXRlSWQJAGkCCQBpAggFCWxhc3RCbG9jawl0aW1lc3RhbXAA6AcAPAQNc3RhcnRNaW51dGVJZAkAZQIFCG1pbnV0ZUlkBQ1UV0FQX0lOVEVSVkFMBAdsaXN0U3RyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFDWtfbGFzdERhdGFTdHICAAQEbGlzdAkAtQkCBQdsaXN0U3RyAgEsCgEIZmlsdGVyRm4CC2FjY3VtdWxhdG9yBG5leHQDCQBnAgUNc3RhcnRNaW51dGVJZAkBDXBhcnNlSW50VmFsdWUBBQRuZXh0CQDNCAIFC2FjY3VtdWxhdG9yCQENcGFyc2VJbnRWYWx1ZQEFBG5leHQFC2FjY3VtdWxhdG9yBAVsaXN0RgoAAiRsBQRsaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmaWx0ZXJGbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAhtYXhJbmRleAMJAGYCCQCQAwEFBWxpc3RGAAAJAJYDAQUFbGlzdEYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsaXN0AAAEDGxhc3RNaW51dGVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rX2xhc3RNaW51dGVJZAAABBZlbmRMYXN0Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBQxsYXN0TWludXRlSWQAAAQMZW5kTGFzdFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBRNrX3R3YXBEYXRhTGFzdFByaWNlAgFfCQCkAwEFDGxhc3RNaW51dGVJZAAABBJub3dDdW11bGF0aXZlUHJpY2UJAGQCBRZlbmRMYXN0Q3VtdWxhdGl2ZVByaWNlCQBoAgkAZQIFCG1pbnV0ZUlkBQxsYXN0TWludXRlSWQFDGVuZExhc3RQcmljZQQYc3RhcnRMYXN0Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBQhtYXhJbmRleAAABA5zdGFydExhc3RQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUTa190d2FwRGF0YUxhc3RQcmljZQIBXwkApAMBBQhtYXhJbmRleAAABBRzdGFydEN1bXVsYXRpdmVQcmljZQkAZAIFGHN0YXJ0TGFzdEN1bXVsYXRpdmVQcmljZQkAaAIJAGUCBQ1zdGFydE1pbnV0ZUlkBQhtYXhJbmRleAUOc3RhcnRMYXN0UHJpY2UJAGkCCQBlAgUSbm93Q3VtdWxhdGl2ZVByaWNlBRRzdGFydEN1bXVsYXRpdmVQcmljZQUNVFdBUF9JTlRFUlZBTAETZ2V0VGVybWluYWxBbW1TdGF0ZQAEDV9wb3NpdGlvblNpemUJARF0b3RhbFBvc2l0aW9uU2l6ZQADCQAAAgUNX3Bvc2l0aW9uU2l6ZQAACQCUCgIJAQZxdEFzdFIACQEGYnNBc3RSAAQJZGlyZWN0aW9uCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABA0kdDAzMDQ3NzMwNjU2CQEKc3dhcE91dHB1dAMFCWRpcmVjdGlvbgkBA2FicwEFDV9wb3NpdGlvblNpemUHBBVjdXJyZW50TmV0TWFya2V0VmFsdWUIBQ0kdDAzMDQ3NzMwNjU2Al8xBBl0ZXJtaW5hbFF1b3RlQXNzZXRSZXNlcnZlCAUNJHQwMzA0NzczMDY1NgJfMgQYdGVybWluYWxCYXNlQXNzZXRSZXNlcnZlCAUNJHQwMzA0NzczMDY1NgJfMwkAlAoCBRl0ZXJtaW5hbFF1b3RlQXNzZXRSZXNlcnZlBRh0ZXJtaW5hbEJhc2VBc3NldFJlc2VydmUBE2dldFF1b3RlQXNzZXRXZWlnaHQEEGJhc2VBc3NldFJlc2VydmURdG90YWxQb3NpdGlvblNpemURcXVvdGVBc3NldFJlc2VydmULdGFyZ2V0UHJpY2UEAWIJALYCAQUQYmFzZUFzc2V0UmVzZXJ2ZQQCc3oJALYCAQURdG90YWxQb3NpdGlvblNpemUEAXEJALYCAQURcXVvdGVBc3NldFJlc2VydmUEAXAJALYCAQULdGFyZ2V0UHJpY2UEA2JzMgkBBWJwb3dkAgkAtwICBQFiBQJzegkAtgIBCQBoAgACBQxERUNJTUFMX1VOSVQEBHFiczIJAQVibXVsZAIFAXEFA2JzMgQDcHM0CQC5AgIJALYCAQAECQEFYm11bGQCBQFwBQJzegQDc3FyCQEGYnNxcnRkAQkBBWJtdWxkAgUEcWJzMgkAuAICBQFxBQNwczQEAmJxCQEFYm11bGQCBQFiBQFxBAJxcwkBBWJtdWxkAgUBcQUCc3oEA3RvcAkAtwICCQC3AgIJAL4CAQUDc3FyBQJicQUCcXMEA2JvdAkAuQICCQC2AgEAAgkBBWJtdWxkAgUBcQUCc3oEBnJlc3VsdAkBBWJkaXZkAgUDdG9wBQNib3QJAKADAQUGcmVzdWx0ARRnZXRTeW5jVGVybWluYWxQcmljZQEOX3Rlcm1pbmFsUHJpY2UEDV9wb3NpdGlvblNpemUJARF0b3RhbFBvc2l0aW9uU2l6ZQADCQAAAgUNX3Bvc2l0aW9uU2l6ZQAABAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAECW5ld1F0QXN0VwkBBGRpdmQCCQEEbXVsZAIFDl90ZXJtaW5hbFByaWNlBQdfYnNBc3RSBQdfcXRBc3RSCQCVCgMFCW5ld1F0QXN0VwUMREVDSU1BTF9VTklUAAAECWRpcmVjdGlvbgkAZgIFDV9wb3NpdGlvblNpemUAAAQVY3VycmVudE5ldE1hcmtldFZhbHVlCAkBCnN3YXBPdXRwdXQDBQlkaXJlY3Rpb24JAQNhYnMBBQ1fcG9zaXRpb25TaXplBwJfMQQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAluZXdRdEFzdFcJARNnZXRRdW90ZUFzc2V0V2VpZ2h0BAUHX2JzQXN0UgUNX3Bvc2l0aW9uU2l6ZQUHX3F0QXN0UgUOX3Rlcm1pbmFsUHJpY2UECW5ld0JzQXN0VwUMREVDSU1BTF9VTklUBA1tYXJnaW5Ub1ZhdWx0CAkBK2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sQnlWYWx1ZXMHBQ1fcG9zaXRpb25TaXplBRVjdXJyZW50TmV0TWFya2V0VmFsdWUFB19xdEFzdFIFCW5ld1F0QXN0VwUHX2JzQXN0UgUJbmV3QnNBc3RXBQ9QTkxfT1BUSU9OX1NQT1QCXzIJAJUKAwUJbmV3UXRBc3RXBQluZXdCc0FzdFcFDW1hcmdpblRvVmF1bHQBCmdldEZ1bmRpbmcABA91bmRlcmx5aW5nUHJpY2UJARJnZXRPcmFjbGVUd2FwUHJpY2UABA1zcG90VHdhcFByaWNlCQEQZ2V0VHdhcFNwb3RQcmljZQAEB3ByZW1pdW0JAGUCBQ1zcG90VHdhcFByaWNlBQ91bmRlcmx5aW5nUHJpY2UDAwkAAAIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAAABgkAAAIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAAAJAJQKAgAAAAADCQBmAgAABQdwcmVtaXVtBBRzaG9ydFByZW1pdW1GcmFjdGlvbgkBBGRpdmQCCQEEbXVsZAIFB3ByZW1pdW0JARRmdW5kaW5nUGVyaW9kRGVjaW1hbAAFB09ORV9EQVkEE2xvbmdQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBRRzaG9ydFByZW1pdW1GcmFjdGlvbgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUACQEVdG90YWxMb25nUG9zaXRpb25TaXplAAkAlAoCBRRzaG9ydFByZW1pdW1GcmFjdGlvbgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgQTbG9uZ1ByZW1pdW1GcmFjdGlvbgkBBGRpdmQCCQEEbXVsZAIFB3ByZW1pdW0JARRmdW5kaW5nUGVyaW9kRGVjaW1hbAAFB09ORV9EQVkEFHNob3J0UHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIJAQRtdWxkAgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkAlAoCBRRzaG9ydFByZW1pdW1GcmFjdGlvbgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgEOZ2V0QWRqdXN0ZWRGZWUCC19hcnRpZmFjdElkEF9iYXNlRmVlRGlzY291bnQECmJhc2VGZWVSYXcJAQNmZWUABAdiYXNlRmVlCQEEbXVsZAIFCmJhc2VGZWVSYXcFEF9iYXNlRmVlRGlzY291bnQEDSR0MDMzNzU1MzQyNTADCQECIT0CBQtfYXJ0aWZhY3RJZAIABAxhcnRpZmFjdEtpbmQJAQRzdHJBAgkBEW5mdE1hbmFnZXJBZGRyZXNzAAkBDnRvQ29tcG9zaXRlS2V5AgUMa190b2tlbl90eXBlBQtfYXJ0aWZhY3RJZAMJAAACBQxhcnRpZmFjdEtpbmQFGEZFRV9SRURVQ1RJT05fVE9LRU5fVFlQRQQJcmVkdWN0aW9uCQEEaW50QQIJARFuZnRNYW5hZ2VyQWRkcmVzcwAJAQ50b0NvbXBvc2l0ZUtleQIFDWtfdG9rZW5fcGFyYW0FC19hcnRpZmFjdElkBAthZGp1c3RlZEZlZQkBBG11bGQCBQdiYXNlRmVlBQlyZWR1Y3Rpb24JAJQKAgULYWRqdXN0ZWRGZWUGCQACAQIZSW52YWxpZCBhdHRhY2hlZCBhcnRpZmFjdAkAlAoCBQdiYXNlRmVlBwQLYWRqdXN0ZWRGZWUIBQ0kdDAzMzc1NTM0MjUwAl8xBAxidXJuQXJ0aWZhY3QIBQ0kdDAzMzc1NTM0MjUwAl8yCQCUCgIFC2FkanVzdGVkRmVlBQxidXJuQXJ0aWZhY3QBDnVwZGF0ZVNldHRpbmdzChBfaW5pdE1hcmdpblJhdGlvBF9tbXIUX2xpcXVpZGF0aW9uRmVlUmF0aW8OX2Z1bmRpbmdQZXJpb2QEX2ZlZQxfc3ByZWFkTGltaXQPX21heFByaWNlSW1wYWN0GF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbw9fbWF4UHJpY2VTcHJlYWQQX21heE9wZW5Ob3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19pbml0TWFyZ2luUmF0aW8FEF9pbml0TWFyZ2luUmF0aW8JAMwIAgkBDEludGVnZXJFbnRyeQIFGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwUEX21tcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa19saXF1aWRhdGlvbkZlZVJhdGlvBRRfbGlxdWlkYXRpb25GZWVSYXRpbwkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa19mdW5kaW5nUGVyaW9kBQ5fZnVuZGluZ1BlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUFa19mZWUFBF9mZWUJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfc3ByZWFkTGltaXQFDF9zcHJlYWRMaW1pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa19tYXhQcmljZUltcGFjdAUPX21heFByaWNlSW1wYWN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBRhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8JAMwIAgkBDEludGVnZXJFbnRyeQIFEGtfbWF4UHJpY2VTcHJlYWQFD19tYXhQcmljZVNwcmVhZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19tYXhPcGVuTm90aW9uYWwFEF9tYXhPcGVuTm90aW9uYWwFA25pbAENdXBkYXRlRnVuZGluZwURX25leHRGdW5kaW5nQmxvY2skX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uJV9sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24QX2xvbmdGdW5kaW5nUmF0ZRFfc2hvcnRGdW5kaW5nUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa19uZXh0RnVuZGluZ0Jsb2NrBRFfbmV4dEZ1bmRpbmdCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgUla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUkX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBSZrX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUlX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19sb25nRnVuZGluZ1JhdGUFEF9sb25nRnVuZGluZ1JhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfc2hvcnRGdW5kaW5nUmF0ZQURX3Nob3J0RnVuZGluZ1JhdGUFA25pbAETdXBkYXRlUG9zaXRpb25Bc3NldAIIX2FkZHJlc3MIX2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUPa19wb3NpdGlvbkFzc2V0BQhfYWRkcmVzcwUIX2Fzc2V0SWQFA25pbAEfaW5jcmVtZW50UG9zaXRpb25TZXF1ZW5jZU51bWJlcgINaXNOZXdQb3NpdGlvbghfYWRkcmVzcwMFDWlzTmV3UG9zaXRpb24ED2N1cnJlbnRTZXF1ZW5jZQkBDGxhc3RTZXF1ZW5jZQAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEmtfcG9zaXRpb25TZXF1ZW5jZQUIX2FkZHJlc3MJAGQCBQ9jdXJyZW50U2VxdWVuY2UAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUKa19zZXF1ZW5jZQkAZAIFD2N1cnJlbnRTZXF1ZW5jZQABBQNuaWwFA25pbAEOdXBkYXRlUG9zaXRpb24FCF9hZGRyZXNzBV9zaXplB19tYXJnaW4NX29wZW5Ob3Rpb25hbCBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFCF9hZGRyZXNzBQVfc2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgUIX2FkZHJlc3MFB19tYXJnaW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFFmtfcG9zaXRpb25PcGVuTm90aW9uYWwFCF9hZGRyZXNzBQ1fb3Blbk5vdGlvbmFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBS5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQhfYWRkcmVzcwUgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FA25pbAEKYXBwZW5kVHdhcAEFcHJpY2UECG1pbnV0ZUlkCQBpAgkAaQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wAOgHADwEEHByZXZpb3VzTWludXRlSWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUOa19sYXN0TWludXRlSWQAAAMJAGYCBRBwcmV2aW91c01pbnV0ZUlkBQhtaW51dGVJZAkAAgECEVRXQVAgb3V0LW9mLW9yZGVyBAxsYXN0TWludXRlSWQDCQAAAgUQcHJldmlvdXNNaW51dGVJZAAABQhtaW51dGVJZAUQcHJldmlvdXNNaW51dGVJZAMJAGYCBQhtaW51dGVJZAUQcHJldmlvdXNNaW51dGVJZAQTcHJldkN1bXVsYXRpdmVQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UCAV8JAKQDAQUQcHJldmlvdXNNaW51dGVJZAAABAlwcmV2UHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIFE2tfdHdhcERhdGFMYXN0UHJpY2UCAV8JAKQDAQUQcHJldmlvdXNNaW51dGVJZAUFcHJpY2UEE2xhc3RDdW11bGF0aXZlUHJpY2UJAGQCBRNwcmV2Q3VtdWxhdGl2ZVByaWNlCQBoAgkAZQIFCG1pbnV0ZUlkBQxsYXN0TWludXRlSWQFCXByZXZQcmljZQQEbGlzdAkBC3B1c2hUb1F1ZXVlAwkBCXN0clRvTGlzdAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUNa19sYXN0RGF0YVN0cgIABQ1UV0FQX0lOVEVSVkFMCQCkAwEFCG1pbnV0ZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQkApAMBBQhtaW51dGVJZAUTbGFzdEN1bXVsYXRpdmVQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUTa190d2FwRGF0YUxhc3RQcmljZQkApAMBBQhtaW51dGVJZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFGmtfdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkCQCkAwEFCG1pbnV0ZUlkBRBwcmV2aW91c01pbnV0ZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5rX2xhc3RNaW51dGVJZAUIbWludXRlSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUNa19sYXN0RGF0YVN0cgkBCWxpc3RUb1N0cgEFBGxpc3QFA25pbAQYdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFGmtfdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkCQCkAwEFCG1pbnV0ZUlkAAAEE3ByZXZDdW11bGF0aXZlUHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UJAKQDAQUYdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkAAAECXByZXZQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRNrX3R3YXBEYXRhTGFzdFByaWNlCQCkAwEFGHR3YXBEYXRhUHJldmlvdXNNaW51dGVJZAUFcHJpY2UEE2xhc3RDdW11bGF0aXZlUHJpY2UJAGQCBRNwcmV2Q3VtdWxhdGl2ZVByaWNlCQBoAgkAZQIFCG1pbnV0ZUlkBRh0d2FwRGF0YVByZXZpb3VzTWludXRlSWQFCXByZXZQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UJAKQDAQUIbWludXRlSWQFE2xhc3RDdW11bGF0aXZlUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFE2tfdHdhcERhdGFMYXN0UHJpY2UJAKQDAQUIbWludXRlSWQFBXByaWNlBQNuaWwBEXVwZGF0ZUFtbVJlc2VydmVzAgdfcXRBc3RSB19ic0FzdFIJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tfcXVvdGVBc3NldFJlc2VydmUFB19xdEFzdFIJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfYmFzZUFzc2V0UmVzZXJ2ZQUHX2JzQXN0UgUDbmlsARB1cGRhdGVBbW1XZWlnaHRzAgdfcXRBc3RXB19ic0FzdFcJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfcXVvdGVBc3NldFdlaWdodAUHX3F0QXN0VwkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19iYXNlQXNzZXRXZWlnaHQFB19ic0FzdFcFA25pbAEJdXBkYXRlQW1tCAdfcXRBc3RSB19ic0FzdFIXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIVX29wZW5JbnRlcmVzdE5vdGlvbmFsFl90b3RhbExvbmdQb3NpdGlvblNpemUXX3RvdGFsU2hvcnRQb3NpdGlvblNpemUWX3RvdGFsTG9uZ09wZW5Ob3Rpb25hbBdfdG90YWxTaG9ydE9wZW5Ob3Rpb25hbAQHX3F0QXN0VwkBBnF0QXN0VwAEB19ic0FzdFcJAQZic0FzdFcAAwkBAiE9AgkAZQIFFl90b3RhbExvbmdQb3NpdGlvblNpemUFF190b3RhbFNob3J0UG9zaXRpb25TaXplBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhhJbnZhbGlkIEFNTSBzdGF0ZSBkYXRhOiAJAKQDAQUWX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQIEICsgIAkApAMBBRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQIEICE9IAkApAMBBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAzggCCQDOCAIJARF1cGRhdGVBbW1SZXNlcnZlcwIFB19xdEFzdFIFB19ic0FzdFIJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tfdG90YWxQb3NpdGlvblNpemUFF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZrX29wZW5JbnRlcmVzdE5vdGlvbmFsBRVfb3BlbkludGVyZXN0Tm90aW9uYWwJAMwIAgkBDEludGVnZXJFbnRyeQIFF2tfdG90YWxMb25nUG9zaXRpb25TaXplBRZfdG90YWxMb25nUG9zaXRpb25TaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUFF190b3RhbFNob3J0UG9zaXRpb25TaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrX29wZW5JbnRlcmVzdExvbmcFFl90b3RhbExvbmdPcGVuTm90aW9uYWwJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tfb3BlbkludGVyZXN0U2hvcnQFF190b3RhbFNob3J0T3Blbk5vdGlvbmFsBQNuaWwJAQphcHBlbmRUd2FwAQkBBGRpdmQCCQEEbXVsZAIFB19xdEFzdFIFB19xdEFzdFcJAQRtdWxkAgUHX2JzQXN0UgUHX2JzQXN0VwEOZGVsZXRlUG9zaXRpb24BCF9hZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uTWFyZ2luBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBS5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBQ9rX3Bvc2l0aW9uQXNzZXQFCF9hZGRyZXNzBQNuaWwBCHdpdGhkcmF3AghfYWRkcmVzcwdfYW1vdW50BAdiYWxhbmNlCQDwBwIFBHRoaXMJAQpxdW90ZUFzc2V0AAMJAGYCBQdfYW1vdW50BQdiYWxhbmNlCQACAQkArAICCQCsAgIJAKwCAgITVW5hYmxlIHRvIHdpdGhkcmF3IAkApAMBBQdfYW1vdW50AhcgZnJvbSBjb250cmFjdCBiYWxhbmNlIAkApAMBBQdiYWxhbmNlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCF9hZGRyZXNzBQdfYW1vdW50CQEKcXVvdGVBc3NldAAFA25pbAENdXBkYXRlQmFsYW5jZQEBaQMJAGYCAAAFAWkJAAIBAgdCYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrX2JhbGFuY2UFAWkFA25pbAELdHJhbnNmZXJGZWUBAWkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBDnN0YWtpbmdBZGRyZXNzAAUBaQkBCnF1b3RlQXNzZXQABQNuaWwBDmRvQnVybkFydGlmYWN0Ag1fYnVybkFydGlmYWN0AWkDBQ1fYnVybkFydGlmYWN0CQDMCAIJAQRCdXJuAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAkAkQMCCAUBaQhwYXltZW50cwABB2Fzc2V0SWQCEEludmFsaWQgYXJ0aWZhY3QAAQUDbmlsBQNuaWwBF2lzU2FtZUFzc2V0T3JOb1Bvc2l0aW9uAgdfdHJhZGVyCF9hc3NldElkBA9vbGRQb3NpdGlvblNpemUICQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyAl8xAwkAAAIFD29sZFBvc2l0aW9uU2l6ZQAABgkAAAIJARBnZXRQb3NpdGlvbkFzc2V0AQUHX3RyYWRlcgUIX2Fzc2V0SWQBC2lzU2FtZUFzc2V0AgdfdHJhZGVyCF9hc3NldElkCQAAAgkBEGdldFBvc2l0aW9uQXNzZXQBBQdfdHJhZGVyBQhfYXNzZXRJZAEeZ2V0Qm9ycm93ZWRCeVRyYWRlckluTWFya2V0S2V5AwRfYW1tCF9hc3NldElkB190cmFkZXIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFIGtfdHJhZGVyX21hcmtldF9hc3NldF9jb2xsYXRlcmFsAgFfBQRfYW1tAgFfBQhfYXNzZXRJZAIBXwUHX3RyYWRlcgETZ2V0Qm9ycm93ZWRCeVRyYWRlcgEHX3RyYWRlcgQNcG9zaXRpb25Bc3NldAkBEGdldFBvc2l0aW9uQXNzZXQBBQdfdHJhZGVyAwkAAAIFDXBvc2l0aW9uQXNzZXQJANgEAQkBCnF1b3RlQXNzZXQACQCUCgIAAAUNcG9zaXRpb25Bc3NldAQDa2V5CQEeZ2V0Qm9ycm93ZWRCeVRyYWRlckluTWFya2V0S2V5AwkApQgBBQR0aGlzBQ1wb3NpdGlvbkFzc2V0BQdfdHJhZGVyBAZib3Jyb3cJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBEWNvbGxhdGVyYWxBZGRyZXNzAAUDa2V5AAAJAJQKAgUGYm9ycm93BQ1wb3NpdGlvbkFzc2V0ARhnZXRGb3JUcmFkZXJXaXRoQXJ0aWZhY3QCB190cmFkZXILX2FydGlmYWN0SWQEEGRvR2V0RmVlRGlzY291bnQJAPwHBAkBDG1pbmVyQWRkcmVzcwACEmNvbXB1dGVGZWVEaXNjb3VudAkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBRBkb0dldEZlZURpc2NvdW50BRBkb0dldEZlZURpc2NvdW50BAtmZWVEaXNjb3VudAQHJG1hdGNoMAUQZG9HZXRGZWVEaXNjb3VudAMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgJAAIBAiFJbnZhbGlkIGNvbXB1dGVGZWVEaXNjb3VudCByZXN1bHQEDSR0MDQyNTgzNDI2NTcJAQ5nZXRBZGp1c3RlZEZlZQIFC19hcnRpZmFjdElkBQtmZWVEaXNjb3VudAQLYWRqdXN0ZWRGZWUIBQ0kdDA0MjU4MzQyNjU3Al8xBAxidXJuQXJ0aWZhY3QIBQ0kdDA0MjU4MzQyNjU3Al8yCQCUCgIFC2FkanVzdGVkRmVlBQxidXJuQXJ0aWZhY3QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDWdldEFydGlmYWN0SWQBAWkECmFydGlmYWN0SWQDCQBmAgkAkAMBCAUBaQhwYXltZW50cwABCQDYBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkAhJJbnZhbGlkIGFydGlmYWN0SWQCAAUKYXJ0aWZhY3RJZBcBaQEFcGF1c2UAAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECFEludmFsaWQgcGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAYFA25pbAFpAQd1bnBhdXNlAAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhZJbnZhbGlkIHVucGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAcFA25pbAFpAQxzZXRDbG9zZU9ubHkAAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECG0ludmFsaWQgc2V0Q2xvc2VPbmx5IHBhcmFtcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgULa19jbG9zZU9ubHkGBQNuaWwBaQEOdW5zZXRDbG9zZU9ubHkAAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECHUludmFsaWQgdW5zZXRDbG9zZU9ubHkgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQtrX2Nsb3NlT25seQcFA25pbAFpAQxhZGRMaXF1aWRpdHkBEV9xdW90ZUFzc2V0QW1vdW50AwMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAGCQBnAgAABRFfcXVvdGVBc3NldEFtb3VudAkAAgECG0ludmFsaWQgYWRkTGlxdWlkaXR5IHBhcmFtcwQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAdfcXRBc3RXCQEGcXRBc3RXAAQHX2JzQXN0VwkBBmJzQXN0VwAEBXByaWNlCQEEZGl2ZAIJAQRtdWxkAgUHX3F0QXN0UgUHX3F0QXN0VwkBBG11bGQCBQdfYnNBc3RSBQdfYnNBc3RXBBRiYXNlQXNzZXRBbW91bnRUb0FkZAkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUFcHJpY2UEC3F0QXN0UkFmdGVyCQBkAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQEC2JzQXN0UkFmdGVyCQBkAgUHX2JzQXN0UgUUYmFzZUFzc2V0QW1vdW50VG9BZGQJARF1cGRhdGVBbW1SZXNlcnZlcwIFC3F0QXN0UkFmdGVyBQtic0FzdFJBZnRlcgFpAQ9yZW1vdmVMaXF1aWRpdHkBEV9xdW90ZUFzc2V0QW1vdW50AwMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAGCQBnAgAABRFfcXVvdGVBc3NldEFtb3VudAkAAgECHkludmFsaWQgcmVtb3ZlTGlxdWlkaXR5IHBhcmFtcwQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAdfcXRBc3RXCQEGcXRBc3RXAAQHX2JzQXN0VwkBBmJzQXN0VwAEBXByaWNlCQEEZGl2ZAIJAQRtdWxkAgUHX3F0QXN0UgUHX3F0QXN0VwkBBG11bGQCBQdfYnNBc3RSBQdfYnNBc3RXBBdiYXNlQXNzZXRBbW91bnRUb1JlbW92ZQkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUFcHJpY2UEC3F0QXN0UkFmdGVyCQBlAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQEC2JzQXN0UkFmdGVyCQBlAgUHX2JzQXN0UgUXYmFzZUFzc2V0QW1vdW50VG9SZW1vdmUJARF1cGRhdGVBbW1SZXNlcnZlcwIFC3F0QXN0UkFmdGVyBQtic0FzdFJBZnRlcgFpAQ5jaGFuZ2VTZXR0aW5ncwoQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvDl9mdW5kaW5nUGVyaW9kBF9mZWUMX3NwcmVhZExpbWl0D19tYXhQcmljZUltcGFjdBhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8PX21heFByaWNlU3ByZWFkEF9tYXhPcGVuTm90aW9uYWwDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIdSW52YWxpZCBjaGFuZ2VTZXR0aW5ncyBwYXJhbXMJAQ51cGRhdGVTZXR0aW5ncwoFEF9pbml0TWFyZ2luUmF0aW8FBF9tbXIFFF9saXF1aWRhdGlvbkZlZVJhdGlvBQ5fZnVuZGluZ1BlcmlvZAUEX2ZlZQUMX3NwcmVhZExpbWl0BQ9fbWF4UHJpY2VJbXBhY3QFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwUPX21heFByaWNlU3ByZWFkBRBfbWF4T3Blbk5vdGlvbmFsAWkBCmluaXRpYWxpemUPB19xdEFzdFIHX2JzQXN0Ug5fZnVuZGluZ1BlcmlvZBBfaW5pdE1hcmdpblJhdGlvBF9tbXIUX2xpcXVpZGF0aW9uRmVlUmF0aW8EX2ZlZQdfb3JhY2xlCl9vcmFjbGVLZXkMX2Nvb3JkaW5hdG9yDF9zcHJlYWRMaW1pdA9fbWF4UHJpY2VJbXBhY3QYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvD19tYXhQcmljZVNwcmVhZBBfbWF4T3Blbk5vdGlvbmFsAwMDAwMDAwMDAwMDAwkAZwIAAAUHX3F0QXN0UgYJAGcCAAAFB19ic0FzdFIGCQBnAgAABQ5fZnVuZGluZ1BlcmlvZAYJAGcCAAAFEF9pbml0TWFyZ2luUmF0aW8GCQBnAgAABQRfbW1yBgkAZwIAAAUUX2xpcXVpZGF0aW9uRmVlUmF0aW8GCQBnAgAABQRfZmVlBgkAZwIAAAUMX3NwcmVhZExpbWl0BgkAZwIAAAUPX21heFByaWNlSW1wYWN0BgkAZwIAAAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBgkAZwIAAAUPX21heFByaWNlU3ByZWFkBgkAZwIAAAUQX21heE9wZW5Ob3Rpb25hbAYJAQtpbml0aWFsaXplZAAJAAIBAh1JbnZhbGlkIGluaXRpYWxpemUgcGFyYW1ldGVycwkAzggCCQDOCAIJAM4IAgkAzggCCQEJdXBkYXRlQW1tCAUHX3F0QXN0UgUHX2JzQXN0UgAAAAAAAAAAAAAAAAkBDnVwZGF0ZVNldHRpbmdzCgUQX2luaXRNYXJnaW5SYXRpbwUEX21tcgUUX2xpcXVpZGF0aW9uRmVlUmF0aW8FDl9mdW5kaW5nUGVyaW9kBQRfZmVlBQxfc3ByZWFkTGltaXQFD19tYXhQcmljZUltcGFjdAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBQ9fbWF4UHJpY2VTcHJlYWQFEF9tYXhPcGVuTm90aW9uYWwJAQ11cGRhdGVGdW5kaW5nBQkAZAIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQ5fZnVuZGluZ1BlcmlvZAAAAAAAAAAACQENdXBkYXRlQmFsYW5jZQEAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa19pbml0aWFsaXplZAYJAMwIAgkBC1N0cmluZ0VudHJ5AgUFa19vcmEFB19vcmFjbGUJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa19vcmFfa2V5BQpfb3JhY2xlS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzBQxfY29vcmRpbmF0b3IFA25pbAFpARBkZWNyZWFzZVBvc2l0aW9uAwdfYW1vdW50CV9sZXZlcmFnZRNfbWluQmFzZUFzc2V0QW1vdW50BARzeW5jCQD8BwQFBHRoaXMCGXN5bmNUZXJtaW5hbFByaWNlVG9PcmFjbGUFA25pbAUDbmlsAwkAAAIFBHN5bmMFBHN5bmMEB190cmFkZXIJAQ9nZXRBY3R1YWxDYWxsZXIBBQFpAwMDAwMJAGcCAAAFB19hbW91bnQGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEJARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwkBBGRpdmQCBQxERUNJTUFMX1VOSVQFCV9sZXZlcmFnZQkBD2luaXRNYXJnaW5SYXRpbwAGBgkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgEFB190cmFkZXIGCQEGcGF1c2VkAAkAAgECI0ludmFsaWQgZGVjcmVhc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBA0kdDA0NzM0NzQ3NDg3CQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBA9vbGRQb3NpdGlvblNpemUIBQ0kdDA0NzM0NzQ3NDg3Al8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDQ3MzQ3NDc0ODcCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNDczNDc0NzQ4NwJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDA0NzM0NzQ3NDg3Al80BApfZGlyZWN0aW9uAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAABQlESVJfU0hPUlQFCERJUl9MT05HBAVpc0FkZAkAAAIFCl9kaXJlY3Rpb24FCERJUl9MT05HBAxvcGVuTm90aW9uYWwJAQRtdWxkAgUHX2Ftb3VudAUJX2xldmVyYWdlBA0kdDA0NzY2MDQ3NzY0CQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCBQdfdHJhZGVyBQ9QTkxfT1BUSU9OX1NQT1QEE29sZFBvc2l0aW9uTm90aW9uYWwIBQ0kdDA0NzY2MDQ3NzY0Al8xBA11bnJlYWxpemVkUG5sCAUNJHQwNDc2NjA0Nzc2NAJfMgQNJHQwNDc3NzA1MDQyOAMJAGYCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwEDSR0MDQ4MTg1NDgzNjkJAQlzd2FwSW5wdXQCBQVpc0FkZAUMb3Blbk5vdGlvbmFsBBVleGNoYW5nZWRQb3NpdGlvblNpemUIBQ0kdDA0ODE4NTQ4MzY5Al8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNDgxODU0ODM2OQJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNDgxODU0ODM2OQJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDQ4MTg1NDgzNjkCXzQEGGV4Y2hhbmdlZFBvc2l0aW9uU2l6ZUFicwkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQMDCQECIT0CBRNfbWluQmFzZUFzc2V0QW1vdW50AAAJAGYCBRNfbWluQmFzZUFzc2V0QW1vdW50BRhleGNoYW5nZWRQb3NpdGlvblNpemVBYnMHCQACAQkArAICCQCsAgIJAKwCAgIlVG9vIGxpdHRsZSBiYXNlIGFzc2V0IGV4Y2hhbmdlZCwgZ290IAkApAMBBRhleGNoYW5nZWRQb3NpdGlvblNpemVBYnMCCiBleHBlY3RlZCAJAKQDAQUTX21pbkJhc2VBc3NldEFtb3VudAQLcmVhbGl6ZWRQbmwJAQRkaXZkAgkBBG11bGQCBQ11bnJlYWxpemVkUG5sBRhleGNoYW5nZWRQb3NpdGlvblNpemVBYnMJAQNhYnMBBQ9vbGRQb3NpdGlvblNpemUEDSR0MDQ4ODA2NDkwNTEJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFC3JlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDA0ODgwNjQ5MDUxAl8xBAdiYWREZWJ0CAUNJHQwNDg4MDY0OTA1MQJfMgQOZnVuZGluZ1BheW1lbnQIBQ0kdDA0ODgwNjQ5MDUxAl8zBBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BQxvcGVuTm90aW9uYWwEEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIFDXVucmVhbGl6ZWRQbmwFC3JlYWxpemVkUG5sBBJyZW1haW5PcGVuTm90aW9uYWwDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQBlAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkAZAIFEnVucmVhbGl6ZWRQbmxBZnRlcgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQPbmV3UG9zaXRpb25TaXplCQBkAgUPb2xkUG9zaXRpb25TaXplBRVleGNoYW5nZWRQb3NpdGlvblNpemUJAJ4KDAUPbmV3UG9zaXRpb25TaXplBQxyZW1haW5NYXJnaW4JAQNhYnMBBRJyZW1haW5PcGVuTm90aW9uYWwJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAGUCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABQxvcGVuTm90aW9uYWwJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMJAGYCBQ9uZXdQb3NpdGlvblNpemUAAAkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQAACQBlAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAwkAZgIAAAUPbmV3UG9zaXRpb25TaXplCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEQb3BlbkludGVyZXN0TG9uZwADCQBmAgUPbmV3UG9zaXRpb25TaXplAAAFDG9wZW5Ob3Rpb25hbAAACQBlAgkBEW9wZW5JbnRlcmVzdFNob3J0AAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQUMb3Blbk5vdGlvbmFsAAAJAAIBAhRDbG9zZSBwb3NpdGlvbiBmaXJzdAQPbmV3UG9zaXRpb25TaXplCAUNJHQwNDc3NzA1MDQyOAJfMQQXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4IBQ0kdDA0Nzc3MDUwNDI4Al8yBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDQ3NzcwNTA0MjgCXzMEFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCAUNJHQwNDc3NzA1MDQyOAJfNAQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNDc3NzA1MDQyOAJfNQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDQ3NzcwNTA0MjgCXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA0Nzc3MDUwNDI4Al83BBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCAUNJHQwNDc3NzA1MDQyOAJfOAQOdG90YWxMb25nQWZ0ZXIIBQ0kdDA0Nzc3MDUwNDI4Al85BA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDA0Nzc3MDUwNDI4A18xMAQadG90YWxMb25nT3BlbkludGVyZXN0QWZ0ZXIIBQ0kdDA0Nzc3MDUwNDI4A18xMQQbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNDc3NzA1MDQyOANfMTIEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQUHX3RyYWRlcgUPbmV3UG9zaXRpb25TaXplBRduZXdQb3NpdGlvblJlbWFpbk1hcmdpbgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCQEJdXBkYXRlQW1tCAUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyBRp0b3RhbExvbmdPcGVuSW50ZXJlc3RBZnRlcgUbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGluY3JlYXNlUG9zaXRpb24ECl9kaXJlY3Rpb24JX2xldmVyYWdlE19taW5CYXNlQXNzZXRBbW91bnQIX3JlZkxpbmsEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQHX3RyYWRlcgkBD2dldEFjdHVhbENhbGxlcgEFAWkECl9yYXdBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAhfYXNzZXRJZAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAtfYXNzZXRJZFN0cgkA2AQBCQEFdmFsdWUBBQhfYXNzZXRJZAQMaXNRdW90ZUFzc2V0CQAAAgUIX2Fzc2V0SWQJAQpxdW90ZUFzc2V0AAQRaXNDb2xsYXRlcmFsQXNzZXQJARBpc1doaXRlbGlzdEFzc2V0AQULX2Fzc2V0SWRTdHIDAwMDAwMDAwMJAQIhPQIFCl9kaXJlY3Rpb24FCERJUl9MT05HCQECIT0CBQpfZGlyZWN0aW9uBQlESVJfU0hPUlQHBgkAZwIAAAUKX3Jhd0Ftb3VudAYJAQEhAQkBC2luaXRpYWxpemVkAAYDCQEBIQEFDGlzUXVvdGVBc3NldAkBASEBBRFpc0NvbGxhdGVyYWxBc3NldAcGCQEBIQEJARdpc1NhbWVBc3NldE9yTm9Qb3NpdGlvbgIFB190cmFkZXIFC19hc3NldElkU3RyBgkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMJAQRkaXZkAgUMREVDSU1BTF9VTklUBQlfbGV2ZXJhZ2UJAQ9pbml0TWFyZ2luUmF0aW8ABgYJAQZwYXVzZWQABgkBCWNsb3NlT25seQAJAAIBAiNJbnZhbGlkIGluY3JlYXNlUG9zaXRpb24gcGFyYW1ldGVycwQNJHQwNTE4NjY1MTk1MQkBGGdldEZvclRyYWRlcldpdGhBcnRpZmFjdAIFB190cmFkZXIJAQ1nZXRBcnRpZmFjdElkAQUBaQQLYWRqdXN0ZWRGZWUIBQ0kdDA1MTg2NjUxOTUxAl8xBAxidXJuQXJ0aWZhY3QIBQ0kdDA1MTg2NjUxOTUxAl8yBAxyYXdGZWVBbW91bnQJAQRtdWxkAgUKX3Jhd0Ftb3VudAULYWRqdXN0ZWRGZWUEB19hbW91bnQJAGUCBQpfcmF3QW1vdW50BQxyYXdGZWVBbW91bnQEE2Rpc3RyaWJ1dGVGZWVBbW91bnQDBRFpc0NvbGxhdGVyYWxBc3NldAQIZG9Cb3Jyb3cJAPwHBAkBEWNvbGxhdGVyYWxBZGRyZXNzAAIGYm9ycm93CQDMCAIFB190cmFkZXIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIX2Fzc2V0SWQFB19hbW91bnQFA25pbAMJAAACBQhkb0JvcnJvdwUIZG9Cb3Jyb3cEDWJhbGFuY2VCZWZvcmUJAPAHAgUEdGhpcwkBCnF1b3RlQXNzZXQAAwkAAAIFDWJhbGFuY2VCZWZvcmUFDWJhbGFuY2VCZWZvcmUEBmRvU3dhcAkA/AcECQELc3dhcEFkZHJlc3MAAgRzd2FwCQDMCAIJANgEAQkBCnF1b3RlQXNzZXQACQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQhfYXNzZXRJZAUMcmF3RmVlQW1vdW50BQNuaWwDCQAAAgUGZG9Td2FwBQZkb1N3YXAEDGJhbGFuY2VBZnRlcgkA8AcCBQR0aGlzCQEKcXVvdGVBc3NldAADCQAAAgUMYmFsYW5jZUFmdGVyBQxiYWxhbmNlQWZ0ZXIED2V4Y2hhbmdlZEFtb3VudAkAZQIFDGJhbGFuY2VBZnRlcgUNYmFsYW5jZUJlZm9yZQMJAAACBQ9leGNoYW5nZWRBbW91bnQFD2V4Y2hhbmdlZEFtb3VudAUPZXhjaGFuZ2VkQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQxyYXdGZWVBbW91bnQDCQAAAgUTZGlzdHJpYnV0ZUZlZUFtb3VudAUTZGlzdHJpYnV0ZUZlZUFtb3VudAQOcmVmZXJyZXJGZWVBbnkJAPwHBAkBD3JlZmVycmFsQWRkcmVzcwACFWFjY2VwdFBheW1lbnRXaXRoTGluawkAzAgCBQdfdHJhZGVyCQDMCAIFCF9yZWZMaW5rBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUTZGlzdHJpYnV0ZUZlZUFtb3VudAUDbmlsAwkAAAIFDnJlZmVycmVyRmVlQW55BQ5yZWZlcnJlckZlZUFueQQLcmVmZXJyZXJGZWUEByRtYXRjaDAFDnJlZmVycmVyRmVlQW55AwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAkAAgECE0ludmFsaWQgcmVmZXJyZXJGZWUECWZlZUFtb3VudAkAZQIFE2Rpc3RyaWJ1dGVGZWVBbW91bnQFC3JlZmVycmVyRmVlBA0kdDA1MzI2NzUzNDA3CQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBA9vbGRQb3NpdGlvblNpemUIBQ0kdDA1MzI2NzUzNDA3Al8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDUzMjY3NTM0MDcCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNTMyNjc1MzQwNwJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDA1MzI2NzUzNDA3Al80BA1pc05ld1Bvc2l0aW9uCQAAAgUPb2xkUG9zaXRpb25TaXplAAAED2lzU2FtZURpcmVjdGlvbgMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAkAAAIFCl9kaXJlY3Rpb24FCERJUl9MT05HCQAAAgUKX2RpcmVjdGlvbgUJRElSX1NIT1JUBA5leHBhbmRFeGlzdGluZwMJAQEhAQUNaXNOZXdQb3NpdGlvbgUPaXNTYW1lRGlyZWN0aW9uBwQFaXNBZGQJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwQNJHQwNTM2OTY1NjczNwMDBQ1pc05ld1Bvc2l0aW9uBgUOZXhwYW5kRXhpc3RpbmcEDG9wZW5Ob3Rpb25hbAkBBG11bGQCBQdfYW1vdW50BQlfbGV2ZXJhZ2UEDSR0MDU0MTU4NTQzMzEJAQlzd2FwSW5wdXQCBQVpc0FkZAUMb3Blbk5vdGlvbmFsBBVhbW91bnRCYXNlQXNzZXRCb3VnaHQIBQ0kdDA1NDE1ODU0MzMxAl8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNTQxNTg1NDMzMQJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNTQxNTg1NDMzMQJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDU0MTU4NTQzMzECXzQDAwkBAiE9AgUTX21pbkJhc2VBc3NldEFtb3VudAAACQBmAgUTX21pbkJhc2VBc3NldEFtb3VudAkBA2FicwEFFWFtb3VudEJhc2VBc3NldEJvdWdodAcJAAIBCQCsAgIJAKwCAgkArAICAg1MaW1pdCBlcnJvcjogCQCkAwEJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQCAyA8IAkApAMBBRNfbWluQmFzZUFzc2V0QW1vdW50BA9uZXdQb3NpdGlvblNpemUJAGQCBQ9vbGRQb3NpdGlvblNpemUFFWFtb3VudEJhc2VBc3NldEJvdWdodAQadG90YWxMb25nT3BlbkludGVyZXN0QWZ0ZXIJAGQCCQEQb3BlbkludGVyZXN0TG9uZwADCQBmAgUPbmV3UG9zaXRpb25TaXplAAAFDG9wZW5Ob3Rpb25hbAAABBt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIJAGQCCQERb3BlbkludGVyZXN0U2hvcnQAAwkAZgIAAAUPbmV3UG9zaXRpb25TaXplBQxvcGVuTm90aW9uYWwAAAQZaW5jcmVhc2VNYXJnaW5SZXF1aXJlbWVudAkBBGRpdmQCBQxvcGVuTm90aW9uYWwFCV9sZXZlcmFnZQQNJHQwNTQ5Mzk1NTE3OAkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgUZaW5jcmVhc2VNYXJnaW5SZXF1aXJlbWVudAQMcmVtYWluTWFyZ2luCAUNJHQwNTQ5Mzk1NTE3OAJfMQQCeDEIBQ0kdDA1NDkzOTU1MTc4Al8yBAJ4MggFDSR0MDU0OTM5NTUxNzgCXzMDCQEBIQEJARlyZXF1aXJlTm90T3ZlclNwcmVhZExpbWl0AgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCQACAQIVT3ZlciBtYXggc3ByZWFkIGxpbWl0AwkBASEBCQEdcmVxdWlyZU5vdE92ZXJNYXhPcGVuTm90aW9uYWwCBRp0b3RhbExvbmdPcGVuSW50ZXJlc3RBZnRlcgUbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCQACAQIWT3ZlciBtYXggb3BlbiBub3Rpb25hbAkAngoMBQ9uZXdQb3NpdGlvblNpemUFDHJlbWFpbk1hcmdpbgkAZAIFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAGQCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABQxvcGVuTm90aW9uYWwJAGQCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMJAGYCBQ9uZXdQb3NpdGlvblNpemUAAAkBA2FicwEFFWFtb3VudEJhc2VBc3NldEJvdWdodAAACQBkAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAwkAZgIAAAUPbmV3UG9zaXRpb25TaXplCQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AAAFGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyBRt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIEDG9wZW5Ob3Rpb25hbAkBBG11bGQCBQdfYW1vdW50BQlfbGV2ZXJhZ2UEDSR0MDU2NDM3NTY1NTMJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIJAKUIAQgFAWkGY2FsbGVyBQ9QTkxfT1BUSU9OX1NQT1QEE29sZFBvc2l0aW9uTm90aW9uYWwIBQ0kdDA1NjQzNzU2NTUzAl8xBA11bnJlYWxpemVkUG5sCAUNJHQwNTY0Mzc1NjU1MwJfMgMJAGYCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwJAAIBAi5Vc2UgZGVjcmVhc2VQb3NpdGlvbiB0byBkZWNyZWFzZSBwb3NpdGlvbiBzaXplCQACAQIUQ2xvc2UgcG9zaXRpb24gZmlyc3QED25ld1Bvc2l0aW9uU2l6ZQgFDSR0MDUzNjk2NTY3MzcCXzEEF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luCAUNJHQwNTM2OTY1NjczNwJfMgQXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA1MzY5NjU2NzM3Al8zBBRuZXdQb3NpdGlvbkxhdGVzdENQRggFDSR0MDUzNjk2NTY3MzcCXzQEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDUzNjk2NTY3MzcCXzUEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA1MzY5NjU2NzM3Al82BBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNTM2OTY1NjczNwJfNwQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDUzNjk2NTY3MzcCXzgEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNTM2OTY1NjczNwJfOQQPdG90YWxTaG9ydEFmdGVyCAUNJHQwNTM2OTY1NjczNwNfMTAEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNTM2OTY1NjczNwNfMTEEG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDUzNjk2NTY3MzcDXzEyBAxmZWVUb1N0YWtlcnMJAGkCBQlmZWVBbW91bnQAAgQOZmVlVG9JbnN1cmFuY2UJAGUCBQlmZWVBbW91bnQFDGZlZVRvU3Rha2VycwQFc3Rha2UJAPwHBAkBDHZhdWx0QWRkcmVzcwACCWFkZExvY2tlZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFB19hbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBDHZhdWx0QWRkcmVzcwACB2FkZEZyZWUFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5mZWVUb0luc3VyYW5jZQUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UECW5vdGlmeUZlZQkA/AcECQEMbWluZXJBZGRyZXNzAAIKbm90aWZ5RmVlcwkAzAgCBQdfdHJhZGVyCQDMCAIFCWZlZUFtb3VudAUDbmlsBQNuaWwDCQAAAgUJbm90aWZ5RmVlBQlub3RpZnlGZWUEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUFB190cmFkZXIFD25ld1Bvc2l0aW9uU2l6ZQUXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxhdGVzdENQRgkBH2luY3JlbWVudFBvc2l0aW9uU2VxdWVuY2VOdW1iZXICBQ1pc05ld1Bvc2l0aW9uBQdfdHJhZGVyCQETdXBkYXRlUG9zaXRpb25Bc3NldAIFB190cmFkZXIFC19hc3NldElkU3RyCQEJdXBkYXRlQW1tCAUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyBRp0b3RhbExvbmdPcGVuSW50ZXJlc3RBZnRlcgUbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFB19hbW91bnQJAQ5kb0J1cm5BcnRpZmFjdAIFDGJ1cm5BcnRpZmFjdAUBaQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlhZGRNYXJnaW4ABARzeW5jCQD8BwQFBHRoaXMCGXN5bmNUZXJtaW5hbFByaWNlVG9PcmFjbGUFA25pbAUDbmlsAwkAAAIFBHN5bmMFBHN5bmMEB190cmFkZXIJAKUIAQgFAWkGY2FsbGVyBApfcmF3QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQIX2Fzc2V0SWQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLX2Fzc2V0SWRTdHIJANgEAQkBBXZhbHVlAQUIX2Fzc2V0SWQEDGlzUXVvdGVBc3NldAkAAAIFCF9hc3NldElkCQEKcXVvdGVBc3NldAAEEWlzQ29sbGF0ZXJhbEFzc2V0CQEQaXNXaGl0ZWxpc3RBc3NldAEFC19hc3NldElkU3RyAwMDAwMDAwkBASEBBQxpc1F1b3RlQXNzZXQJAQEhAQURaXNDb2xsYXRlcmFsQXNzZXQHBgkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBgkBASEBCQELaXNTYW1lQXNzZXQCBQdfdHJhZGVyBQtfYXNzZXRJZFN0cgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQABgkBCWNsb3NlT25seQAJAAIBAhxJbnZhbGlkIGFkZE1hcmdpbiBwYXJhbWV0ZXJzBA0kdDA1ODY3OTU4NzY0CQEYZ2V0Rm9yVHJhZGVyV2l0aEFydGlmYWN0AgUHX3RyYWRlcgkBDWdldEFydGlmYWN0SWQBBQFpBAthZGp1c3RlZEZlZQgFDSR0MDU4Njc5NTg3NjQCXzEEDGJ1cm5BcnRpZmFjdAgFDSR0MDU4Njc5NTg3NjQCXzIEDHJhd0ZlZUFtb3VudAkBBG11bGQCBQpfcmF3QW1vdW50BQthZGp1c3RlZEZlZQQHX2Ftb3VudAkAZQIFCl9yYXdBbW91bnQFDHJhd0ZlZUFtb3VudAQTZGlzdHJpYnV0ZUZlZUFtb3VudAMFEWlzQ29sbGF0ZXJhbEFzc2V0BAhkb0JvcnJvdwkA/AcECQERY29sbGF0ZXJhbEFkZHJlc3MAAgZib3Jyb3cJAMwIAgUHX3RyYWRlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQhfYXNzZXRJZAUHX2Ftb3VudAUDbmlsAwkAAAIFCGRvQm9ycm93BQhkb0JvcnJvdwQNYmFsYW5jZUJlZm9yZQkA8AcCBQR0aGlzCQEKcXVvdGVBc3NldAADCQAAAgUNYmFsYW5jZUJlZm9yZQUNYmFsYW5jZUJlZm9yZQQGZG9Td2FwCQD8BwQJAQtzd2FwQWRkcmVzcwACBHN3YXAJAMwIAgkA2AQBCQEKcXVvdGVBc3NldAAJAMwIAgAABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCF9hc3NldElkBQxyYXdGZWVBbW91bnQFA25pbAMJAAACBQZkb1N3YXAFBmRvU3dhcAQMYmFsYW5jZUFmdGVyCQDwBwIFBHRoaXMJAQpxdW90ZUFzc2V0AAMJAAACBQxiYWxhbmNlQWZ0ZXIFDGJhbGFuY2VBZnRlcgQPZXhjaGFuZ2VkQW1vdW50CQBlAgUMYmFsYW5jZUFmdGVyBQ1iYWxhbmNlQmVmb3JlAwkAAAIFD2V4Y2hhbmdlZEFtb3VudAUPZXhjaGFuZ2VkQW1vdW50BQ9leGNoYW5nZWRBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FDHJhd0ZlZUFtb3VudAMJAAACBRNkaXN0cmlidXRlRmVlQW1vdW50BRNkaXN0cmlidXRlRmVlQW1vdW50BA5yZWZlcnJlckZlZUFueQkA/AcECQEPcmVmZXJyYWxBZGRyZXNzAAINYWNjZXB0UGF5bWVudAkAzAgCBQdfdHJhZGVyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUTZGlzdHJpYnV0ZUZlZUFtb3VudAUDbmlsAwkAAAIFDnJlZmVycmVyRmVlQW55BQ5yZWZlcnJlckZlZUFueQQLcmVmZXJyZXJGZWUEByRtYXRjaDAFDnJlZmVycmVyRmVlQW55AwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAkAAgECE0ludmFsaWQgcmVmZXJyZXJGZWUECWZlZUFtb3VudAkAZQIFE2Rpc3RyaWJ1dGVGZWVBbW91bnQFC3JlZmVycmVyRmVlBA0kdDA2MDA2MzYwMjAzCQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBA9vbGRQb3NpdGlvblNpemUIBQ0kdDA2MDA2MzYwMjAzAl8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDYwMDYzNjAyMDMCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNjAwNjM2MDIwMwJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDA2MDA2MzYwMjAzAl80BAxmZWVUb1N0YWtlcnMJAGkCBQlmZWVBbW91bnQAAgQOZmVlVG9JbnN1cmFuY2UJAGUCBQlmZWVBbW91bnQFDGZlZVRvU3Rha2VycwQFc3Rha2UJAPwHBAkBDHZhdWx0QWRkcmVzcwACCWFkZExvY2tlZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFB19hbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBDHZhdWx0QWRkcmVzcwACB2FkZEZyZWUFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5mZWVUb0luc3VyYW5jZQUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UECW5vdGlmeUZlZQkA/AcECQEMbWluZXJBZGRyZXNzAAIKbm90aWZ5RmVlcwkAzAgCBQdfdHJhZGVyCQDMCAIFCWZlZUFtb3VudAUDbmlsBQNuaWwDCQAAAgUJbm90aWZ5RmVlBQlub3RpZnlGZWUJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUFB190cmFkZXIFD29sZFBvc2l0aW9uU2l6ZQkAZAIFEW9sZFBvc2l0aW9uTWFyZ2luBQdfYW1vdW50BRdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAUUb2xkUG9zaXRpb25Mc3RVcGRDUEYJAQt0cmFuc2ZlckZlZQEFDGZlZVRvU3Rha2VycwkBDXVwZGF0ZUJhbGFuY2UBCQBkAgkBCGNiYWxhbmNlAAUHX2Ftb3VudAkBDmRvQnVybkFydGlmYWN0AgUMYnVybkFydGlmYWN0BQFpCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHJlbW92ZU1hcmdpbgEHX2Ftb3VudAQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBAdfdHJhZGVyCQClCAEIBQFpBmNhbGxlcgMDAwMJAGcCAAAFB19hbW91bnQGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAQUHX3RyYWRlcgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQACQACAQIfSW52YWxpZCByZW1vdmVNYXJnaW4gcGFyYW1ldGVycwQNJHQwNjEzMDk2MTQ0OQkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQPb2xkUG9zaXRpb25TaXplCAUNJHQwNjEzMDk2MTQ0OQJfMQQRb2xkUG9zaXRpb25NYXJnaW4IBQ0kdDA2MTMwOTYxNDQ5Al8yBBdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDYxMzA5NjE0NDkCXzMEFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNjEzMDk2MTQ0OQJfNAQLbWFyZ2luRGVsdGEJAQEtAQUHX2Ftb3VudAQNJHQwNjE0ODY2MTY2NQkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgULbWFyZ2luRGVsdGEEDHJlbWFpbk1hcmdpbggFDSR0MDYxNDg2NjE2NjUCXzEEB2JhZERlYnQIBQ0kdDA2MTQ4NjYxNjY1Al8yAwkBAiE9AgUHYmFkRGVidAAACQACAQIdSW52YWxpZCByZW1vdmVkIG1hcmdpbiBhbW91bnQEC21hcmdpblJhdGlvCQEPY2FsY01hcmdpblJhdGlvAwUMcmVtYWluTWFyZ2luBQdiYWREZWJ0BRdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAMJAQEhAQkBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DBQttYXJnaW5SYXRpbwkBD2luaXRNYXJnaW5SYXRpbwAGCQACAQkArAICCQCsAgIJAKwCAgIZVG9vIG11Y2ggbWFyZ2luIHJlbW92ZWQ6IAkApAMBBQttYXJnaW5SYXRpbwIDIDwgCQCkAwEJAQ9pbml0TWFyZ2luUmF0aW8ABA1xdW90ZUFzc2V0U3RyCQDYBAEJAQpxdW90ZUFzc2V0AAQNJHQwNjIxMDk2MjE2MwkBE2dldEJvcnJvd2VkQnlUcmFkZXIBBQdfdHJhZGVyBAhib3Jyb3dlZAgFDSR0MDYyMTA5NjIxNjMCXzEEB2Fzc2V0SWQIBQ0kdDA2MjEwOTYyMTYzAl8yBAd0b1JlcGF5AwkAZgIFB19hbW91bnQFCGJvcnJvd2VkBQhib3Jyb3dlZAUHX2Ftb3VudAQKdG9XaXRoZHJhdwMJAGYCBQhib3Jyb3dlZAUHX2Ftb3VudAAACQBlAgUHX2Ftb3VudAUIYm9ycm93ZWQEC2ZpbmFsQm9ycm93CQBlAgUIYm9ycm93ZWQFB3RvUmVwYXkEFXN3aXRjaFBvc2l0aW9uVG9RdW90ZQMJAGYCBQtmaW5hbEJvcnJvdwAABQNuaWwJARN1cGRhdGVQb3NpdGlvbkFzc2V0AgUHX3RyYWRlcgUNcXVvdGVBc3NldFN0cgQNZG9TYW5pdHlDaGVjawMJAQIhPQIJAGQCBQd0b1JlcGF5BQp0b1dpdGhkcmF3BQdfYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCHRvUmVwYXk9CQCkAwEFB3RvUmVwYXkCDiArIHRvV2l0aGRyYXc9CQCkAwEFCnRvV2l0aGRyYXcCBCAhPSAJAKQDAQUHX2Ftb3VudAUDbmlsAwkAAAIFDWRvU2FuaXR5Q2hlY2sFDWRvU2FuaXR5Q2hlY2sECWRvVW5zdGFrZQkA/AcECQEMdmF1bHRBZGRyZXNzAAIOd2l0aGRyYXdMb2NrZWQJAMwIAgUHX2Ftb3VudAUDbmlsBQNuaWwDCQAAAgUJZG9VbnN0YWtlBQlkb1Vuc3Rha2UEFnJldHVybkNvbGxhdGVyYWxBY3Rpb24DCQBmAgUHdG9SZXBheQAABAdkb1JlcGF5CQD8BwQJARFjb2xsYXRlcmFsQWRkcmVzcwACBXJlcGF5CQDMCAIFB190cmFkZXIJAMwIAgUHYXNzZXRJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFB3RvUmVwYXkFA25pbAMJAAACBQdkb1JlcGF5BQdkb1JlcGF5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHdG9SZXBheQkA2QQBBQdhc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBRZyZXR1cm5Db2xsYXRlcmFsQWN0aW9uBRZyZXR1cm5Db2xsYXRlcmFsQWN0aW9uCQDOCAIJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUFB190cmFkZXIFD29sZFBvc2l0aW9uU2l6ZQUMcmVtYWluTWFyZ2luBRdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9vbGRQb3NpdGlvblNpemUDCQBmAgUKdG9XaXRoZHJhdwAACQEId2l0aGRyYXcCCAUBaQZjYWxsZXIFCnRvV2l0aGRyYXcFA25pbAkBDXVwZGF0ZUJhbGFuY2UBCQBlAgkBCGNiYWxhbmNlAAUHX2Ftb3VudAUVc3dpdGNoUG9zaXRpb25Ub1F1b3RlBRZyZXR1cm5Db2xsYXRlcmFsQWN0aW9uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWNsb3NlUG9zaXRpb24CBV9zaXplFF9taW5RdW90ZUFzc2V0QW1vdW50BARzeW5jCQD8BwQFBHRoaXMCGXN5bmNUZXJtaW5hbFByaWNlVG9PcmFjbGUFA25pbAUDbmlsAwkAAAIFBHN5bmMFBHN5bmMEB190cmFkZXIJAQ9nZXRBY3R1YWxDYWxsZXIBBQFpBA5fdHJhZGVyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFB190cmFkZXICDkludmFsaWQgY2FsbGVyAwMDAwMJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BBQdfdHJhZGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAGCQBnAgAABQVfc2l6ZQYJAGYCAAAFFF9taW5RdW90ZUFzc2V0QW1vdW50CQACAQIgSW52YWxpZCBjbG9zZVBvc2l0aW9uIHBhcmFtZXRlcnMEDSR0MDY0MjkzNjQ0MzMJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDY0MjkzNjQ0MzMCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNjQyOTM2NDQzMwJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA2NDI5MzY0NDMzAl8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDY0MjkzNjQ0MzMCXzQEDSR0MDY0NDM5Njg4MTEDCQBmAgkBA2FicwEFD29sZFBvc2l0aW9uU2l6ZQUFX3NpemUECl9kaXJlY3Rpb24DCQBmAgUPb2xkUG9zaXRpb25TaXplAAAFCURJUl9TSE9SVAUIRElSX0xPTkcEBWlzQWRkCQAAAgUKX2RpcmVjdGlvbgUIRElSX0xPTkcEDSR0MDY1MDMwNjUyNTIJAQpzd2FwT3V0cHV0AwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAABQVfc2l6ZQYEGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQIBQ0kdDA2NTAzMDY1MjUyAl8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNjUwMzA2NTI1MgJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNjUwMzA2NTI1MgJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDY1MDMwNjUyNTICXzQEFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAkBAS0BBQVfc2l6ZQUFX3NpemUEDSR0MDY1MzQzNjU0OTcJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQTb2xkUG9zaXRpb25Ob3Rpb25hbAgFDSR0MDY1MzQzNjU0OTcCXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDA2NTM0MzY1NDk3Al8yBA1yZWFsaXplZFJhdGlvCQEEZGl2ZAIJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUJAQNhYnMBBQ9vbGRQb3NpdGlvblNpemUEC3JlYWxpemVkUG5sCQEEbXVsZAIFDXVucmVhbGl6ZWRQbmwFDXJlYWxpemVkUmF0aW8EDSR0MDY1NzExNjU5NDkJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFC3JlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDA2NTcxMTY1OTQ5Al8xBA9wb3NpdGlvbkJhZERlYnQIBQ0kdDA2NTcxMTY1OTQ5Al8yBA5mdW5kaW5nUGF5bWVudAgFDSR0MDY1NzExNjU5NDkCXzMEEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIFDXVucmVhbGl6ZWRQbmwFC3JlYWxpemVkUG5sBBJyZW1haW5PcGVuTm90aW9uYWwDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQBlAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkAZAIFEnVucmVhbGl6ZWRQbmxBZnRlcgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQRbmV3UG9zaXRpb25NYXJnaW4JAQRtdWxkAgUMcmVtYWluTWFyZ2luBQ1yZWFsaXplZFJhdGlvBA9uZXdQb3NpdGlvblNpemUJAGQCBQ9vbGRQb3NpdGlvblNpemUFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQQXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwJAQNhYnMBBRJyZW1haW5PcGVuTm90aW9uYWwEFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCQEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEFD25ld1Bvc2l0aW9uU2l6ZQQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgkAZQIJARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQDAwkBAiE9AgUUX21pblF1b3RlQXNzZXRBbW91bnQAAAkAZgIFFF9taW5RdW90ZUFzc2V0QW1vdW50BRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BwkAAgEJAKwCAgkArAICCQCsAgICDUxpbWl0IGVycm9yOiAJAKQDAQUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAIDIDwgCQCkAwEFFF9taW5RdW90ZUFzc2V0QW1vdW50CQChCg8FD25ld1Bvc2l0aW9uU2l6ZQURbmV3UG9zaXRpb25NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxzdFVwZENQRgUPcG9zaXRpb25CYWREZWJ0BQtyZWFsaXplZFBubAkAZAIJAQNhYnMBCQBlAgUMcmVtYWluTWFyZ2luBRFuZXdQb3NpdGlvbk1hcmdpbgULcmVhbGl6ZWRQbmwFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgkAZQIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAACQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQBmAgAABQ9uZXdQb3NpdGlvblNpemUJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUAAAkAZQIJARBvcGVuSW50ZXJlc3RMb25nAAMJAGYCBQ9uZXdQb3NpdGlvblNpemUAAAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAAACQBlAgkBEW9wZW5JbnRlcmVzdFNob3J0AAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAAAAwkAZgIFBV9zaXplCQEDYWJzAQUPb2xkUG9zaXRpb25TaXplCQACAQIgSW52YWxpZCBjbG9zZVBvc2l0aW9uIHBhcmFtZXRlcnMEDSR0MDY3NzUyNjgxNzEJARVpbnRlcm5hbENsb3NlUG9zaXRpb24CBQdfdHJhZGVyBgQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDY3NzUyNjgxNzECXzEED3Bvc2l0aW9uQmFkRGVidAgFDSR0MDY3NzUyNjgxNzECXzIEC3JlYWxpemVkUG5sCAUNJHQwNjc3NTI2ODE3MQJfMwQNbWFyZ2luVG9WYXVsdAgFDSR0MDY3NzUyNjgxNzECXzQEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA2Nzc1MjY4MTcxAl81BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA2Nzc1MjY4MTcxAl82BBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNjc3NTI2ODE3MQJfNwQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDY3NzUyNjgxNzECXzgEAngyCAUNJHQwNjc3NTI2ODE3MQJfOQQOdG90YWxMb25nQWZ0ZXIIBQ0kdDA2Nzc1MjY4MTcxA18xMAQPdG90YWxTaG9ydEFmdGVyCAUNJHQwNjc3NTI2ODE3MQNfMTEEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNjc3NTI2ODE3MQNfMTIEG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDY3NzUyNjgxNzEDXzEzAwMJAQIhPQIFFF9taW5RdW90ZUFzc2V0QW1vdW50AAAJAGYCBRRfbWluUXVvdGVBc3NldEFtb3VudAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAcJAAIBCQCsAgIJAKwCAgkArAICAg1MaW1pdCBlcnJvcjogCQCkAwEFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQCAyA8IAkApAMBBRRfbWluUXVvdGVBc3NldEFtb3VudAkAoQoPAAAAAAAAAAAFD3Bvc2l0aW9uQmFkRGVidAULcmVhbGl6ZWRQbmwFDW1hcmdpblRvVmF1bHQFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgUadG90YWxMb25nT3BlbkludGVyZXN0QWZ0ZXIFG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcgQPbmV3UG9zaXRpb25TaXplCAUNJHQwNjQ0Mzk2ODgxMQJfMQQRbmV3UG9zaXRpb25NYXJnaW4IBQ0kdDA2NDQzOTY4ODExAl8yBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDY0NDM5Njg4MTECXzMEFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNjQ0Mzk2ODgxMQJfNAQPcG9zaXRpb25CYWREZWJ0CAUNJHQwNjQ0Mzk2ODgxMQJfNQQLcmVhbGl6ZWRQbmwIBQ0kdDA2NDQzOTY4ODExAl82BA1tYXJnaW5Ub1ZhdWx0CAUNJHQwNjQ0Mzk2ODgxMQJfNwQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDY0NDM5Njg4MTECXzgEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDY0NDM5Njg4MTECXzkEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA2NDQzOTY4ODExA18xMAQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDY0NDM5Njg4MTEDXzExBA50b3RhbExvbmdBZnRlcggFDSR0MDY0NDM5Njg4MTEDXzEyBA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDA2NDQzOTY4ODExA18xMwQadG90YWxMb25nT3BlbkludGVyZXN0QWZ0ZXIIBQ0kdDA2NDQzOTY4ODExA18xNAQbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNjQ0Mzk2ODgxMQNfMTUDCQBmAgUPcG9zaXRpb25CYWREZWJ0AAAJAAIBAiZVbmFibGUgdG8gY2xvc2UgcG9zaXRpb24gd2l0aCBiYWQgZGVidAQOd2l0aGRyYXdBbW91bnQJAQNhYnMBBQ1tYXJnaW5Ub1ZhdWx0BAphbW1CYWxhbmNlCQBlAgkBCGNiYWxhbmNlAAUOd2l0aGRyYXdBbW91bnQEDSR0MDY5MDIwNjkxNDkDCQBmAgAABQphbW1CYWxhbmNlCQCUCgIAAAkBA2FicwEFCmFtbUJhbGFuY2UJAJQKAgUKYW1tQmFsYW5jZQAABA1hbW1OZXdCYWxhbmNlCAUNJHQwNjkwMjA2OTE0OQJfMQQDeDExCAUNJHQwNjkwMjA2OTE0OQJfMgQHdW5zdGFrZQkA/AcECQEMdmF1bHRBZGRyZXNzAAIOd2l0aGRyYXdMb2NrZWQJAMwIAgUOd2l0aGRyYXdBbW91bnQFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UEDSR0MDY5MzYxNjk0MTUJARNnZXRCb3Jyb3dlZEJ5VHJhZGVyAQUHX3RyYWRlcgQIYm9ycm93ZWQIBQ0kdDA2OTM2MTY5NDE1Al8xBAdhc3NldElkCAUNJHQwNjkzNjE2OTQxNQJfMgQNJHQwNjk0MzA3MDM0NwMJAGYCBQhib3Jyb3dlZAAAAwkAZwIFDndpdGhkcmF3QW1vdW50BQhib3Jyb3dlZAQHZG9SZXBheQkA/AcECQERY29sbGF0ZXJhbEFkZHJlc3MAAgVyZXBheQkAzAgCBQdfdHJhZGVyCQDMCAIFB2Fzc2V0SWQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQhib3Jyb3dlZAUDbmlsAwkAAAIFB2RvUmVwYXkFB2RvUmVwYXkJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5fdHJhZGVyQWRkcmVzcwUIYm9ycm93ZWQJANkEAQUHYXNzZXRJZAUDbmlsCQBlAgUOd2l0aGRyYXdBbW91bnQFCGJvcnJvd2VkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA9yZWFsaXplQW5kQ2xvc2UJAPwHBAkBEWNvbGxhdGVyYWxBZGRyZXNzAAIYcmVhbGl6ZVBhcnRpYWxseUFuZENsb3NlCQDMCAIFB190cmFkZXIJAMwIAgUHYXNzZXRJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDndpdGhkcmF3QW1vdW50BQNuaWwDCQAAAgUPcmVhbGl6ZUFuZENsb3NlBQ9yZWFsaXplQW5kQ2xvc2UJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5fdHJhZGVyQWRkcmVzcwUOd2l0aGRyYXdBbW91bnQJANkEAQUHYXNzZXRJZAUDbmlsAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUDbmlsBQ53aXRoZHJhd0Ftb3VudAMJAAACBQ0kdDA2OTQzMDcwMzQ3BQ0kdDA2OTQzMDcwMzQ3BBNxdW90ZVdpdGhkcmF3QW1vdW50CAUNJHQwNjk0MzA3MDM0NwJfMgQUc2VuZENvbGxhdGVyYWxBY3Rpb24IBQ0kdDA2OTQzMDcwMzQ3Al8xBA5ub3RpZnlOb3Rpb25hbAkA/AcECQEMbWluZXJBZGRyZXNzAAIObm90aWZ5Tm90aW9uYWwJAMwIAgUHX3RyYWRlcgkAzAgCAAAFA25pbAUDbmlsAwkAAAIFDm5vdGlmeU5vdGlvbmFsBQ5ub3RpZnlOb3Rpb25hbAkAzggCCQDOCAIJAM4IAgkAzggCAwkAAAIFD25ld1Bvc2l0aW9uU2l6ZQAACQEOZGVsZXRlUG9zaXRpb24BBQdfdHJhZGVyCQEOdXBkYXRlUG9zaXRpb24FBQdfdHJhZGVyBQ9uZXdQb3NpdGlvblNpemUFEW5ld1Bvc2l0aW9uTWFyZ2luBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUUbmV3UG9zaXRpb25Mc3RVcGRDUEYJAQl1cGRhdGVBbW0IBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIFDnRvdGFsTG9uZ0FmdGVyBQ90b3RhbFNob3J0QWZ0ZXIFGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyBRt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIDCQBmAgUTcXVvdGVXaXRoZHJhd0Ftb3VudAAACQEId2l0aGRyYXcCBQ5fdHJhZGVyQWRkcmVzcwUTcXVvdGVXaXRoZHJhd0Ftb3VudAUDbmlsCQENdXBkYXRlQmFsYW5jZQEFDWFtbU5ld0JhbGFuY2UFFHNlbmRDb2xsYXRlcmFsQWN0aW9uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWxpcXVpZGF0ZQEHX3RyYWRlcgQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBA9zcG90TWFyZ2luUmF0aW8JARZnZXRNYXJnaW5SYXRpb0J5T3B0aW9uAgUHX3RyYWRlcgUPUE5MX09QVElPTl9TUE9UBAttYXJnaW5SYXRpbwMJARZpc092ZXJGbHVjdHVhdGlvbkxpbWl0AAQRb3JhY2xlTWFyZ2luUmF0aW8JARZnZXRNYXJnaW5SYXRpb0J5T3B0aW9uAgUHX3RyYWRlcgURUE5MX09QVElPTl9PUkFDTEUJAQR2bWF4AgUPc3BvdE1hcmdpblJhdGlvBRFvcmFjbGVNYXJnaW5SYXRpbwUPc3BvdE1hcmdpblJhdGlvAwMDAwkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMFC21hcmdpblJhdGlvCQEWbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwAHBgkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgEFB190cmFkZXIGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAkAAgECE1VuYWJsZSB0byBsaXF1aWRhdGUDAwMJAGYCBQ9zcG90TWFyZ2luUmF0aW8JARNsaXF1aWRhdGlvbkZlZVJhdGlvAAkAZgIJARdwYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwAAAAcJAGYCBQxERUNJTUFMX1VOSVQJARdwYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwAHBA0kdDA3MjM5NjcyNTQ2CQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBA9vbGRQb3NpdGlvblNpemUIBQ0kdDA3MjM5NjcyNTQ2Al8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDcyMzk2NzI1NDYCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNzIzOTY3MjU0NgJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDA3MjM5NjcyNTQ2Al80BApfZGlyZWN0aW9uAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAABQlESVJfU0hPUlQFCERJUl9MT05HBAVpc0FkZAkAAAIFCl9kaXJlY3Rpb24FCERJUl9MT05HBBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CQEbZ2V0UGFydGlhbExpcXVpZGF0aW9uQW1vdW50AgUHX3RyYWRlcgUPb2xkUG9zaXRpb25TaXplBA0kdDA3Mjc3MTcyODc1CQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCBQdfdHJhZGVyBQ9QTkxfT1BUSU9OX1NQT1QEE29sZFBvc2l0aW9uTm90aW9uYWwIBQ0kdDA3Mjc3MTcyODc1Al8xBA11bnJlYWxpemVkUG5sCAUNJHQwNzI3NzE3Mjg3NQJfMgQNJHQwNzI4ODM3MzA3MAkBCXN3YXBJbnB1dAIFBWlzQWRkBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BBVleGNoYW5nZWRQb3NpdGlvblNpemUIBQ0kdDA3Mjg4MzczMDcwAl8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNzI4ODM3MzA3MAJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNzI4ODM3MzA3MAJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDcyODgzNzMwNzACXzQEEGxpcXVpZGF0aW9uUmF0aW8JAQRkaXZkAgkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQkBA2FicwEFD29sZFBvc2l0aW9uU2l6ZQQLcmVhbGl6ZWRQbmwJAQRtdWxkAgUNdW5yZWFsaXplZFBubAUQbGlxdWlkYXRpb25SYXRpbwQNJHQwNzMzNTk3MzU5MgkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgULcmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDczMzU5NzM1OTICXzEEB2JhZERlYnQIBQ0kdDA3MzM1OTczNTkyAl8yBA5mdW5kaW5nUGF5bWVudAgFDSR0MDczMzU5NzM1OTICXzMEEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIFDXVucmVhbGl6ZWRQbmwFC3JlYWxpemVkUG5sBBJyZW1haW5PcGVuTm90aW9uYWwDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQBlAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkAZAIFEnVucmVhbGl6ZWRQbmxBZnRlcgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQSbGlxdWlkYXRpb25QZW5hbHR5CQEEbXVsZAIFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJARNsaXF1aWRhdGlvbkZlZVJhdGlvAAQPZmVlVG9MaXF1aWRhdG9yCQBpAgUSbGlxdWlkYXRpb25QZW5hbHR5AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUSbGlxdWlkYXRpb25QZW5hbHR5BQ9mZWVUb0xpcXVpZGF0b3IEEW5ld1Bvc2l0aW9uTWFyZ2luCQBlAgUMcmVtYWluTWFyZ2luBRJsaXF1aWRhdGlvblBlbmFsdHkED25ld1Bvc2l0aW9uU2l6ZQkAZAIFD29sZFBvc2l0aW9uU2l6ZQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAkBA2FicwEFEnJlbWFpbk9wZW5Ob3Rpb25hbAQUbmV3UG9zaXRpb25Mc3RVcGRDUEYJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplBBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCQBlAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNJHQwNzQ3NjU3NDg5NAMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDW5ld0FtbUJhbGFuY2UIBQ0kdDA3NDc2NTc0ODk0Al8xBAN4MTEIBQ0kdDA3NDc2NTc0ODk0Al8yBA0kdDA3NDkwMjc0OTU2CQETZ2V0Qm9ycm93ZWRCeVRyYWRlcgEFB190cmFkZXIECGJvcnJvd2VkCAUNJHQwNzQ5MDI3NDk1NgJfMQQHYXNzZXRJZAgFDSR0MDc0OTAyNzQ5NTYCXzIEFWRvTGlxdWlkYXRlQ29sbGF0ZXJhbAMJAGYCBQhib3Jyb3dlZAAABBBjb2xsYXRlcmFsVG9TZWxsCQEEbXVsZAIFCGJvcnJvd2VkBRBsaXF1aWRhdGlvblJhdGlvBA9yZWFsaXplQW5kQ2xvc2UJAPwHBAkBEWNvbGxhdGVyYWxBZGRyZXNzAAIQcmVhbGl6ZVBhcnRpYWxseQkAzAgCBQdfdHJhZGVyCQDMCAIFB2Fzc2V0SWQJAMwIAgUQY29sbGF0ZXJhbFRvU2VsbAUDbmlsBQNuaWwDCQAAAgUPcmVhbGl6ZUFuZENsb3NlBQ9yZWFsaXplQW5kQ2xvc2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFFWRvTGlxdWlkYXRlQ29sbGF0ZXJhbAUVZG9MaXF1aWRhdGVDb2xsYXRlcmFsBAd1bnN0YWtlCQD8BwQJAQx2YXVsdEFkZHJlc3MAAg53aXRoZHJhd0xvY2tlZAkAzAgCBRJsaXF1aWRhdGlvblBlbmFsdHkFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBDHZhdWx0QWRkcmVzcwACB2FkZEZyZWUFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5mZWVUb0luc3VyYW5jZQUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUFB190cmFkZXIFD25ld1Bvc2l0aW9uU2l6ZQURbmV3UG9zaXRpb25NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxzdFVwZENQRgkBCXVwZGF0ZUFtbQgFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgkAZQIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAACQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQBmAgAABQ9uZXdQb3NpdGlvblNpemUJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUAAAkAZQIJARBvcGVuSW50ZXJlc3RMb25nAAMJAGYCBQ9uZXdQb3NpdGlvblNpemUAAAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAAACQBlAgkBEW9wZW5JbnRlcmVzdFNob3J0AAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAAACQEId2l0aGRyYXcCCAUBaQZjYWxsZXIFD2ZlZVRvTGlxdWlkYXRvcgkBDXVwZGF0ZUJhbGFuY2UBBQ1uZXdBbW1CYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDA3NjY1NTc3MTUwCQEVaW50ZXJuYWxDbG9zZVBvc2l0aW9uAgUHX3RyYWRlcgcEAngxCAUNJHQwNzY2NTU3NzE1MAJfMQQHYmFkRGVidAgFDSR0MDc2NjU1NzcxNTACXzIEAngyCAUNJHQwNzY2NTU3NzE1MAJfMwQCeDMIBQ0kdDA3NjY1NTc3MTUwAl80BBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNzY2NTU3NzE1MAJfNQQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNzY2NTU3NzE1MAJfNgQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDc2NjU1NzcxNTACXzcEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDA3NjY1NTc3MTUwAl84BBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAUNJHQwNzY2NTU3NzE1MAJfOQQOdG90YWxMb25nQWZ0ZXIIBQ0kdDA3NjY1NTc3MTUwA18xMAQPdG90YWxTaG9ydEFmdGVyCAUNJHQwNzY2NTU3NzE1MANfMTEEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNzY2NTU3NzE1MANfMTIEG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDc2NjU1NzcxNTADXzEzBBJsaXF1aWRhdGlvblBlbmFsdHkJAQRtdWxkAgUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAkBE2xpcXVpZGF0aW9uRmVlUmF0aW8ABA9mZWVUb0xpcXVpZGF0b3IJAGkCBRJsaXF1aWRhdGlvblBlbmFsdHkAAgQOZmVlVG9JbnN1cmFuY2UJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFD2ZlZVRvTGlxdWlkYXRvcgQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNJHQwNzc1NjI3NzY5MQMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDW5ld0FtbUJhbGFuY2UIBQ0kdDA3NzU2Mjc3NjkxAl8xBAN4MTEIBQ0kdDA3NzU2Mjc3NjkxAl8yBA0kdDA3NzY5OTc3NzUzCQETZ2V0Qm9ycm93ZWRCeVRyYWRlcgEFB190cmFkZXIECGJvcnJvd2VkCAUNJHQwNzc2OTk3Nzc1MwJfMQQHYXNzZXRJZAgFDSR0MDc3Njk5Nzc3NTMCXzIEFWRvTGlxdWlkYXRlQ29sbGF0ZXJhbAMJAGYCBQhib3Jyb3dlZAAABA9yZWFsaXplQW5kQ2xvc2UJAPwHBAkBEWNvbGxhdGVyYWxBZGRyZXNzAAIYcmVhbGl6ZVBhcnRpYWxseUFuZENsb3NlCQDMCAIFB190cmFkZXIJAMwIAgUHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUPcmVhbGl6ZUFuZENsb3NlBQ9yZWFsaXplQW5kQ2xvc2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFFWRvTGlxdWlkYXRlQ29sbGF0ZXJhbAUVZG9MaXF1aWRhdGVDb2xsYXRlcmFsBAF4AwkAZgIFB2JhZERlYnQAAAQLbG9ja0JhZERlYnQJAPwHBAkBDHZhdWx0QWRkcmVzcwACFWV4Y2hhbmdlRnJlZUFuZExvY2tlZAkAzAgCBQdiYWREZWJ0BQNuaWwFA25pbAMJAAACBQtsb2NrQmFkRGVidAULbG9ja0JhZERlYnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFAXgFAXgEB3Vuc3Rha2UJAPwHBAkBDHZhdWx0QWRkcmVzcwACDndpdGhkcmF3TG9ja2VkCQDMCAIFEmxpcXVpZGF0aW9uUGVuYWx0eQUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQQQZGVwb3NpdEluc3VyYW5jZQkA/AcECQEMdmF1bHRBZGRyZXNzAAIHYWRkRnJlZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDmZlZVRvSW5zdXJhbmNlBQNuaWwDCQAAAgUQZGVwb3NpdEluc3VyYW5jZQUQZGVwb3NpdEluc3VyYW5jZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFB190cmFkZXIJAMwIAgAABQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ5kZWxldGVQb3NpdGlvbgEFB190cmFkZXIJAQl1cGRhdGVBbW0IBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIFDnRvdGFsTG9uZ0FmdGVyBQ90b3RhbFNob3J0QWZ0ZXIFGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyBRt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIJAQh3aXRoZHJhdwIIBQFpBmNhbGxlcgUPZmVlVG9MaXF1aWRhdG9yCQENdXBkYXRlQmFsYW5jZQEFDW5ld0FtbUJhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKcGF5RnVuZGluZwAEFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAkBGW5leHRGdW5kaW5nQmxvY2tUaW1lc3RhbXAAAwMDCQBmAgUVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQACQACAQkArAICCQCsAgIJAKwCAgIhSW52YWxpZCBmdW5kaW5nIGJsb2NrIHRpbWVzdGFtcDogCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wAgMgPCAJAKQDAQUVZnVuZGluZ0Jsb2NrVGltZXN0YW1wBA91bmRlcmx5aW5nUHJpY2UJARJnZXRPcmFjbGVUd2FwUHJpY2UABA0kdDA3OTU2MDc5NjIyCQEKZ2V0RnVuZGluZwAEFHNob3J0UHJlbWl1bUZyYWN0aW9uCAUNJHQwNzk1NjA3OTYyMgJfMQQTbG9uZ1ByZW1pdW1GcmFjdGlvbggFDSR0MDc5NTYwNzk2MjICXzIJAQ11cGRhdGVGdW5kaW5nBQkAZAIFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAkBFGZ1bmRpbmdQZXJpb2RTZWNvbmRzAAkAZAIJASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAFE2xvbmdQcmVtaXVtRnJhY3Rpb24JAGQCCQEkbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUPdW5kZXJseWluZ1ByaWNlCQEEZGl2ZAIFFHNob3J0UHJlbWl1bUZyYWN0aW9uBQ91bmRlcmx5aW5nUHJpY2UBaQEZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQAEDSR0MDgwMDA0ODAxMjUJARRnZXRTeW5jVGVybWluYWxQcmljZQEJARJnZXRPcmFjbGVUd2FwUHJpY2UABBNuZXdRdW90ZUFzc2V0V2VpZ2h0CAUNJHQwODAwMDQ4MDEyNQJfMQQSbmV3QmFzZUFzc2V0V2VpZ2h0CAUNJHQwODAwMDQ4MDEyNQJfMgQNbWFyZ2luVG9WYXVsdAgFDSR0MDgwMDA0ODAxMjUCXzMEC2xvY2tCYWREZWJ0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAhVleGNoYW5nZUZyZWVBbmRMb2NrZWQJAMwIAgUNbWFyZ2luVG9WYXVsdAUDbmlsBQNuaWwDCQAAAgULbG9ja0JhZERlYnQFC2xvY2tCYWREZWJ0CQEQdXBkYXRlQW1tV2VpZ2h0cwIFE25ld1F1b3RlQXNzZXRXZWlnaHQFEm5ld0Jhc2VBc3NldFdlaWdodAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpASd2aWV3X2NhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQBB190cmFkZXIEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQNJHQwODA1MDI4MDYwMwkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwODA1MDI4MDYwMwJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDA4MDUwMjgwNjAzAl8yBANwb24IBQ0kdDA4MDUwMjgwNjAzAl8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDgwNTAyODA2MDMCXzQEDSR0MDgwNjA2ODA3MDcJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQQcG9zaXRpb25Ob3Rpb25hbAgFDSR0MDgwNjA2ODA3MDcCXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDA4MDYwNjgwNzA3Al8yBA0kdDA4MDcxMDgwODgyCQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFDHBvc2l0aW9uU2l6ZQUOcG9zaXRpb25NYXJnaW4FEXBvc2l0aW9uTHN0VXBkQ1BGBQ11bnJlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDA4MDcxMDgwODgyAl8xBAdiYWREZWJ0CAUNJHQwODA3MTA4MDg4MgJfMgQOZnVuZGluZ1BheW1lbnQIBQ0kdDA4MDcxMDgwODgyAl8zCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAQFzAQUMcmVtYWluTWFyZ2luCQEBcwEFDmZ1bmRpbmdQYXltZW50CQEBcwEJAQ5nZXRNYXJnaW5SYXRpbwEFB190cmFkZXIJAQFzAQUNdW5yZWFsaXplZFBubAkBAXMBBQdiYWREZWJ0CQEBcwEFEHBvc2l0aW9uTm90aW9uYWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVdmlld19nZXRQZWdBZGp1c3RDb3N0AQZfcHJpY2UEBnJlc3VsdAkBFGdldFN5bmNUZXJtaW5hbFByaWNlAQUGX3ByaWNlCQACAQkApAMBCAUGcmVzdWx0Al8zAWkBGHZpZXdfZ2V0VGVybWluYWxBbW1QcmljZQAEDSR0MDgxMjI5ODEzMTAJARNnZXRUZXJtaW5hbEFtbVN0YXRlAAQZdGVybWluYWxRdW90ZUFzc2V0UmVzZXJ2ZQgFDSR0MDgxMjI5ODEzMTACXzEEGHRlcm1pbmFsQmFzZUFzc2V0UmVzZXJ2ZQgFDSR0MDgxMjI5ODEzMTACXzIEBXByaWNlCQEEZGl2ZAIJAQRtdWxkAgUZdGVybWluYWxRdW90ZUFzc2V0UmVzZXJ2ZQkBBnF0QXN0VwAJAQRtdWxkAgUYdGVybWluYWxCYXNlQXNzZXRSZXNlcnZlCQEGYnNBc3RXAAkAAgEJAKQDAQUFcHJpY2UBaQEPdmlld19nZXRGdW5kaW5nAAQPdW5kZXJseWluZ1ByaWNlCQESZ2V0T3JhY2xlVHdhcFByaWNlAAQNJHQwODE1Mjk4MTU5MQkBCmdldEZ1bmRpbmcABBRzaG9ydFByZW1pdW1GcmFjdGlvbggFDSR0MDgxNTI5ODE1OTECXzEEE2xvbmdQcmVtaXVtRnJhY3Rpb24IBQ0kdDA4MTUyOTgxNTkxAl8yBAtsb25nRnVuZGluZwkBBGRpdmQCBRNsb25nUHJlbWl1bUZyYWN0aW9uBQ91bmRlcmx5aW5nUHJpY2UEDHNob3J0RnVuZGluZwkBBGRpdmQCBRRzaG9ydFByZW1pdW1GcmFjdGlvbgUPdW5kZXJseWluZ1ByaWNlCQACAQkArAICCQCsAgIJAKwCAgkBAXMBBQtsb25nRnVuZGluZwkBAXMBBQxzaG9ydEZ1bmRpbmcJAQFzAQkBEGdldFR3YXBTcG90UHJpY2UACQEBcwEJARJnZXRPcmFjbGVUd2FwUHJpY2UAAWkBGHZpZXdfZ2V0Qm9ycm93ZWRCeVRyYWRlcgEHX3RyYWRlcgQNJHQwODE4ODE4MTkzNQkBE2dldEJvcnJvd2VkQnlUcmFkZXIBBQdfdHJhZGVyBAhib3Jyb3dlZAgFDSR0MDgxODgxODE5MzUCXzEEB2Fzc2V0SWQIBQ0kdDA4MTg4MTgxOTM1Al8yCQACAQkArAICCQEBcwEFCGJvcnJvd2VkBQdhc3NldElkAWkBEGNvbXB1dGVTcG90UHJpY2UABAZyZXN1bHQJAQxnZXRTcG90UHJpY2UACQCUCgIFA25pbAUGcmVzdWx0AWkBH2NvbXB1dGVGZWVGb3JUcmFkZXJXaXRoQXJ0aWZhY3QCB190cmFkZXILX2FydGlmYWN0SWQEBnJlc3VsdAkBGGdldEZvclRyYWRlcldpdGhBcnRpZmFjdAIFB190cmFkZXIFC19hcnRpZmFjdElkCQCUCgIFA25pbAUGcmVzdWx0AQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkBDmFkbWluUHVibGljS2V5AEfFPW0=", "height": 2351140, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7fdsf7EVU5bmorExRwuSifrekRHkDh25t9iX9biFML3m Next: none Diff:
OldNewDifferences
99
1010 let d = "k_balance"
1111
12-let e = "k_positionSize"
12+let e = "k_sequence"
1313
14-let f = "k_positionMargin"
14+let f = "k_positionSize"
1515
16-let g = "k_positionOpenNotional"
16+let g = "k_positionMargin"
1717
18-let h = "k_positionFraction"
18+let h = "k_positionOpenNotional"
1919
20-let i = "k_positionClosedDate"
20+let i = "k_positionFraction"
2121
22-let j = "k_positionAsset"
22+let j = "k_positionSequence"
2323
24-let k = "k_initialized"
24+let k = "k_positionAsset"
2525
26-let l = "k_paused"
26+let l = "k_initialized"
2727
28-let m = "k_fee"
28+let m = "k_paused"
2929
30-let n = "k_fundingPeriod"
30+let n = "k_closeOnly"
3131
32-let o = "k_initMarginRatio"
32+let o = "k_fee"
3333
34-let p = "k_mmr"
34+let p = "k_fundingPeriod"
3535
36-let q = "k_liquidationFeeRatio"
36+let q = "k_initMarginRatio"
3737
38-let r = "k_partLiquidationRatio"
38+let r = "k_mmr"
3939
40-let s = "k_spreadLimit"
40+let s = "k_liquidationFeeRatio"
4141
42-let t = "k_maxPriceImpact"
42+let t = "k_partLiquidationRatio"
4343
44-let u = "k_maxPriceSpread"
44+let u = "k_spreadLimit"
4545
46-let v = "k_lastDataStr"
46+let v = "k_maxPriceImpact"
4747
48-let w = "k_lastMinuteId"
48+let w = "k_maxPriceSpread"
4949
50-let x = "k_twapDataLastCumulativePrice"
50+let x = "k_maxOpenNotional"
5151
52-let y = "k_twapDataLastPrice"
52+let y = "k_lastDataStr"
5353
54-let z = "k_twapDataPreviousMinuteId"
54+let z = "k_lastMinuteId"
5555
56-let A = "k_latestLongPremiumFraction"
56+let A = "k_twapDataLastCumulativePrice"
5757
58-let B = "k_latestShortPremiumFraction"
58+let B = "k_twapDataLastPrice"
5959
60-let C = "k_nextFundingBlockMinTimestamp"
60+let C = "k_twapDataPreviousMinuteId"
6161
62-let D = "k_longFundingRate"
62+let D = "k_latestLongPremiumFraction"
6363
64-let E = "k_shortFundingRate"
64+let E = "k_latestShortPremiumFraction"
6565
66-let F = "k_qtAstR"
66+let F = "k_nextFundingBlockMinTimestamp"
6767
68-let G = "k_bsAstR"
68+let G = "k_longFundingRate"
6969
70-let H = "k_totalPositionSize"
70+let H = "k_shortFundingRate"
7171
72-let I = "k_totalLongPositionSize"
72+let I = "k_qtAstR"
7373
74-let J = "k_totalShortPositionSize"
74+let J = "k_bsAstR"
7575
76-let K = "k_cumulativeNotional"
76+let K = "k_qtAstW"
7777
78-let L = "k_openInterestNotional"
78+let L = "k_bsAstW"
7979
80-let M = "k_coordinatorAddress"
80+let M = "k_totalPositionSize"
8181
82-let N = "k_insurance_address"
82+let N = "k_totalLongPositionSize"
8383
84-let O = "k_admin_address"
84+let O = "k_totalShortPositionSize"
8585
86-let P = "k_admin_public_key"
86+let P = "k_openInterestNotional"
8787
88-let Q = "k_quote_asset"
88+let Q = "k_openInterestShort"
8989
90-let R = "k_quote_staking"
90+let R = "k_openInterestLong"
9191
92-let S = "k_staking_address"
92+let S = "k_coordinatorAddress"
9393
94-let T = "k_miner_address"
94+let T = "k_vault_address"
9595
96-let U = "k_orders_address"
96+let U = "k_admin_address"
9797
98-let V = "k_referral_address"
98+let V = "k_admin_public_key"
9999
100-let W = "k_manager_address"
100+let W = "k_quote_asset"
101101
102-let X = "k_collateral_address"
102+let X = "k_quote_staking"
103103
104-let Y = "k_exchange_address"
104+let Y = "k_staking_address"
105105
106-let Z = "k_nft_manager_address"
106+let Z = "k_miner_address"
107107
108-let aa = "k_trader_market_asset_collateral"
108+let aa = "k_orders_address"
109109
110-func ab (ac,ad) = ((ac + "_") + ad)
110+let ab = "k_referral_address"
111+
112+let ac = "k_collateral_address"
113+
114+let ad = "k_exchange_address"
115+
116+let ae = "k_nft_manager_address"
117+
118+let af = "k_trader_market_asset_collateral"
119+
120+func ag (ah,ai) = ((ah + "_") + ai)
111121
112122
113-func ae () = valueOrErrorMessage(addressFromString(getStringValue(this, M)), "Coordinator not set")
123+func aj () = valueOrErrorMessage(addressFromString(getStringValue(this, S)), "Coordinator not set")
114124
115125
116-func af () = addressFromString(getStringValue(ae(), O))
126+func ak () = addressFromString(getStringValue(aj(), U))
117127
118128
119-func ag () = fromBase58String(getStringValue(ae(), P))
129+func al () = fromBase58String(getStringValue(aj(), V))
120130
121131
122-func ah () = fromBase58String(getStringValue(ae(), Q))
132+func am () = fromBase58String(getStringValue(aj(), W))
123133
124134
125-func ai () = valueOrErrorMessage(addressFromString(getStringValue(ae(), R)), "Quote asset staking not set")
135+func an () = valueOrErrorMessage(addressFromString(getStringValue(aj(), X)), "Quote asset staking not set")
126136
127137
128-func aj () = valueOrErrorMessage(addressFromString(getStringValue(ae(), S)), "Staking not set")
138+func ao () = valueOrErrorMessage(addressFromString(getStringValue(aj(), Y)), "Staking not set")
129139
130140
131-func ak () = valueOrErrorMessage(addressFromString(getStringValue(ae(), N)), "Insurance not set")
141+func ap () = valueOrErrorMessage(addressFromString(getStringValue(aj(), T)), "Vault not set")
132142
133143
134-func al () = valueOrErrorMessage(addressFromString(getStringValue(ae(), T)), "Miner not set")
144+func aq () = valueOrErrorMessage(addressFromString(getStringValue(aj(), Z)), "Miner not set")
135145
136146
137-func am () = valueOrErrorMessage(addressFromString(getStringValue(ae(), U)), "Orders not set")
147+func ar () = valueOrErrorMessage(addressFromString(getStringValue(aj(), aa)), "Orders not set")
138148
139149
140-func an () = valueOrErrorMessage(addressFromString(getStringValue(ae(), V)), "Referral not set")
150+func as () = valueOrErrorMessage(addressFromString(getStringValue(aj(), ab)), "Referral not set")
141151
142152
143-func ao () = valueOrErrorMessage(addressFromString(getStringValue(ae(), W)), "Manager not set")
153+func at () = valueOrErrorMessage(addressFromString(getStringValue(aj(), ae)), "NFT Manager not set")
144154
145155
146-func ap () = valueOrErrorMessage(addressFromString(getStringValue(ae(), Z)), "NFT Manager not set")
156+func au () = valueOrErrorMessage(addressFromString(getStringValue(aj(), ac)), "Collateral Manager not set")
147157
148158
149-func aq () = valueOrErrorMessage(addressFromString(getStringValue(ae(), X)), "Collateral Manager not set")
159+func av () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(aj(), ad), "No swap address")), "Invalid swap address")
150160
151161
152-func ar () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ae(), Y), "No swap address")), "Invalid swap address")
162+let aw = "k_whitelist_asset"
163+
164+func ax (ay) = valueOrElse(getBoolean(au(), ag(aw, ay)), false)
153165
154166
155-let as = "k_whitelist_asset"
167+let az = "k_token_param"
156168
157-func at (au) = valueOrElse(getBoolean(aq(), ab(as, au)), false)
169+let aA = "k_token_type"
170+
171+let aB = "fee_reduction"
172+
173+let aC = 1
174+
175+let aD = 2
176+
177+let aE = 15
178+
179+let aF = 15
180+
181+let aG = 1000
182+
183+let aH = 6
184+
185+let aI = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
186+
187+let aJ = (86400 * aI)
188+
189+let aK = 100
190+
191+let aL = 1
192+
193+let aM = 2
194+
195+func aN (aO) = (toString(aO) + ",")
158196
159197
160-let av = "k_token_param"
161-
162-let aw = "k_token_type"
163-
164-let ax = "fee_reduction"
165-
166-let ay = 1
167-
168-let az = 2
169-
170-let aA = 15
171-
172-let aB = 15
173-
174-let aC = 1000
175-
176-let aD = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
177-
178-let aE = (86400 * aD)
179-
180-let aF = 100
181-
182-let aG = 1
183-
184-let aH = 2
185-
186-func aI (aJ) = (toString(aJ) + ",")
198+func aP (aO,aQ) = fraction(aO, aI, aQ, HALFEVEN)
187199
188200
189-func aK (aJ,aL) = fraction(aJ, aD, aL, HALFEVEN)
201+func aR (aO,aQ) = fraction(aO, aQ, aI, HALFEVEN)
190202
191203
192-func aM (aJ,aL) = fraction(aJ, aL, aD, HALFEVEN)
204+func aS (aO) = sqrt(aO, aH, aH, HALFEVEN)
193205
194206
195-func aN (aJ) = if ((aJ > 0))
196- then aJ
197- else -(aJ)
207+func aT (aO,aQ) = pow(aO, aH, aQ, aH, aH, HALFEVEN)
198208
199209
200-func aO (aJ,aL) = if ((aJ >= aL))
201- then aJ
202- else aL
210+func aU (aO,aQ) = fraction(aO, toBigInt(aI), aQ, HALFEVEN)
203211
204212
205-func aP (aQ) = {
206- func aR (aS,aT) = ((aS + aT) + ",")
213+func aV (aO,aQ) = fraction(aO, aQ, toBigInt(aI), HALFEVEN)
207214
208- let aU = {
209- let aV = aQ
210- let aW = size(aV)
211- let aX = ""
212- func aY (aZ,ba) = if ((ba >= aW))
213- then aZ
214- else aR(aZ, aV[ba])
215215
216- func bb (aZ,ba) = if ((ba >= aW))
217- then aZ
216+func aW (aO) = sqrtBigInt(aO, aH, aH, HALFEVEN)
217+
218+
219+func aX (aO,aQ) = pow(aO, aH, aQ, aH, aH, HALFEVEN)
220+
221+
222+func aY (aO) = if ((aO > 0))
223+ then aO
224+ else -(aO)
225+
226+
227+func aZ (aO,aQ) = if ((aO >= aQ))
228+ then aO
229+ else aQ
230+
231+
232+func ba (bb) = {
233+ func bc (bd,be) = ((bd + be) + ",")
234+
235+ let bf = {
236+ let bg = bb
237+ let bh = size(bg)
238+ let bi = ""
239+ func bj (bk,bl) = if ((bl >= bh))
240+ then bk
241+ else bc(bk, bg[bl])
242+
243+ func bm (bk,bl) = if ((bl >= bh))
244+ then bk
218245 else throw("List size exceeds 20")
219246
220- bb(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aX, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
247+ bm(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bi, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
221248 }
222- let bc = dropRight(aU, 1)
223- let bd = if ((take(bc, 1) == ","))
224- then drop(bc, 1)
225- else bc
226- bd
249+ let bn = dropRight(bf, 1)
250+ let bo = if ((take(bn, 1) == ","))
251+ then drop(bn, 1)
252+ else bn
253+ bo
227254 }
228255
229256
230-func be (bf) = split(bf, ",")
257+func bp (bq) = split(bq, ",")
231258
232259
233-func bg (aQ,bh,bi) = if ((size(aQ) > bh))
234- then (removeByIndex(aQ, 0) :+ bi)
235- else (aQ :+ bi)
260+func br (bb,bs,bt) = if ((size(bb) > bs))
261+ then (removeByIndex(bb, 0) :+ bt)
262+ else (bb :+ bt)
236263
237264
238-func bj (bk) = valueOrErrorMessage(getInteger(this, bk), ("no value for " + bk))
265+func bu (bv) = valueOrErrorMessage(getInteger(this, bv), ("no value for " + bv))
239266
240267
241-func bl (ad,ac) = {
242- let aT = valueOrErrorMessage(getString(ad, ac), ("No value for key " + ac))
243- aT
268+func bw (bv,bx) = valueOrElse(getInteger(this, bv), bx)
269+
270+
271+func by (ai,ah) = {
272+ let be = valueOrErrorMessage(getString(ai, ah), ("No value for key " + ah))
273+ be
244274 }
245275
246276
247-func bm (ad,ac) = {
248- let aT = valueOrErrorMessage(getInteger(ad, ac), ("No value for key " + ac))
249- aT
277+func bz (ai,ah) = {
278+ let be = valueOrErrorMessage(getInteger(ai, ah), ("No value for key " + ah))
279+ be
250280 }
251281
252282
253-func bn () = bj(d)
283+func bA () = bu(d)
254284
255285
256-func bo () = bj(m)
286+func bB () = bu(o)
257287
258288
259-func bp () = bj(o)
289+func bC () = bu(q)
260290
261291
262-func bq () = bj(F)
292+func bD () = bu(I)
263293
264294
265-func br () = bj(G)
295+func bE () = bu(J)
266296
267297
268-func bs () = bj(H)
298+func bF () = bw(K, aI)
269299
270300
271-func bt () = bj(K)
301+func bG () = bw(L, aI)
272302
273303
274-func bu () = bj(L)
304+func bH () = bu(M)
275305
276306
277-func bv () = bj(C)
307+func bI () = bu(P)
278308
279309
280-func bw () = bj(n)
310+func bJ () = bu(Q)
281311
282312
283-func bx () = (bw() * aD)
313+func bK () = bu(R)
284314
285315
286-func by () = (bw() * aC)
316+func bL () = bu(F)
287317
288318
289-func bz () = bj(p)
319+func bM () = bu(p)
290320
291321
292-func bA () = bj(q)
322+func bN () = (bM() * aI)
293323
294324
295-func bB () = bj(r)
325+func bO () = (bM() * aG)
296326
297327
298-func bC () = bj(s)
328+func bP () = bu(r)
299329
300330
301-func bD () = bj(t)
331+func bQ () = bu(s)
302332
303333
304-func bE () = bj(u)
334+func bR () = bu(t)
305335
306336
307-func bF () = bj(A)
337+func bS () = bu(u)
308338
309339
310-func bG () = bj(B)
340+func bT () = bu(v)
311341
312342
313-func bH () = bj(J)
343+func bU () = bu(w)
314344
315345
316-func bI () = bj(I)
346+func bV () = bu(x)
317347
318348
319-func bJ (bK) = valueOrElse(getString(am(), "k_sender"), toString(bK.caller))
349+func bW () = bu(D)
320350
321351
322-func bL (bM,bN,bO) = {
323- let bP = (bM - bN)
324- if (if (bO)
325- then (0 > bP)
352+func bX () = bu(E)
353+
354+
355+func bY () = bu(O)
356+
357+
358+func bZ () = bu(N)
359+
360+
361+func ca () = bw(e, 0)
362+
363+
364+func cb (cc) = valueOrElse(getString(ar(), "k_sender"), toString(cc.caller))
365+
366+
367+func cd (ce,cf,cg) = {
368+ let ch = (ce - cf)
369+ if (if (cg)
370+ then (0 > ch)
326371 else false)
327372 then throw("Invalid margin")
328- else if (if (!(bO))
329- then (bP >= 0)
373+ else if (if (!(cg))
374+ then (ch >= 0)
330375 else false)
331376 then throw("Invalid margin")
332377 else true
333378 }
334379
335380
336-func bQ (bR) = if ((bR == 0))
381+func ci (cj) = if ((cj == 0))
337382 then throw("Should not be called with _positionSize == 0")
338- else if ((bR > 0))
339- then bF()
340- else bG()
383+ else if ((cj > 0))
384+ then bW()
385+ else bX()
341386
342387
343-func bS (bT) = {
344- let bU = getInteger(this, ab(e, bT))
345- let bV = bU
346- if ($isInstanceOf(bV, "Int"))
388+func ck (cl) = {
389+ let cm = getInteger(this, ag(f, cl))
390+ let cn = cm
391+ if ($isInstanceOf(cn, "Int"))
347392 then {
348- let bW = bV
349- $Tuple4(bW, getIntegerValue(this, ab(f, bT)), getIntegerValue(this, ab(g, bT)), getIntegerValue(this, ab(h, bT)))
393+ let co = cn
394+ $Tuple4(co, getIntegerValue(this, ag(g, cl)), getIntegerValue(this, ag(h, cl)), getIntegerValue(this, ag(i, cl)))
350395 }
351396 else $Tuple4(0, 0, 0, 0)
352397 }
353398
354399
355-func bX (bT) = {
356- let bY = getString(this, ab(j, bT))
357- let bV = bY
358- if ($isInstanceOf(bV, "String"))
400+func cp (cl) = {
401+ let cq = getString(this, ag(k, cl))
402+ let cn = cq
403+ if ($isInstanceOf(cn, "String"))
359404 then {
360- let bZ = bV
361- bZ
405+ let cr = cn
406+ cr
362407 }
363- else toBase58String(ah())
408+ else toBase58String(am())
364409 }
365410
366411
367-func ca (bT) = if ((bS(bT)._1 == 0))
412+func cs (cl) = if ((ck(cl)._1 == 0))
368413 then throw("No open position")
369414 else true
370415
371416
372-func cb () = valueOrElse(getBoolean(this, k), false)
417+func ct () = valueOrElse(getBoolean(this, l), false)
373418
374419
375-func cc () = valueOrElse(getBoolean(this, l), false)
420+func cu () = valueOrElse(getBoolean(this, m), false)
376421
377422
378-func cd (ce,cf,cg) = if (ce)
423+func cv () = valueOrElse(getBoolean(this, n), false)
424+
425+
426+func cw (cx,cy,cz) = if (cx)
379427 then {
380- let ch = (br() - cg)
381- if ((0 >= ch))
428+ let cA = (bE() - cz)
429+ if ((0 >= cA))
382430 then throw("Tx lead to base asset reserve <= 0, revert")
383- else $Tuple4((bq() + cf), ch, (bs() + cg), (bt() + cf))
431+ else $Tuple3((bD() + cy), cA, (bH() + cz))
384432 }
385433 else {
386- let ci = (bq() - cf)
387- if ((0 >= ci))
434+ let cB = (bD() - cy)
435+ if ((0 >= cB))
388436 then throw("Tx lead to base quote reserve <= 0, revert")
389- else $Tuple4(ci, (br() + cg), (bs() - cg), (bt() - cf))
437+ else $Tuple3(cB, (bE() + cz), (bH() - cz))
390438 }
391439
392440
393-func cj (ce,cf) = {
394- let ck = bq()
395- let cl = br()
396- let bk = aM(ck, cl)
397- let cm = if (ce)
398- then (ck + cf)
399- else (ck - cf)
400- let cn = aK(bk, cm)
401- let co = aN((cn - cl))
402- let cp = if (ce)
403- then co
404- else -(co)
405- let cq = cd(ce, cf, co)
406- let cr = cq._1
407- let cs = cq._2
408- let ct = cq._3
409- let cu = cq._4
410- let cv = aK(ck, cl)
411- let cw = aK(cf, co)
412- let cx = aN((cv - cw))
413- let cy = (aD - aK(cv, (cv + cx)))
414- let cz = bD()
415- if ((cy > cz))
416- then throw(((((((((((((("Price impact " + toString(cy)) + " > max price impact ") + toString(cz)) + " before quote asset: ") + toString(ck)) + " before base asset: ") + toString(cl)) + " quote asset amount to exchange: ") + toString(cf)) + " price before: ") + toString(cv)) + " marketPrice: ") + toString(cw)))
417- else $Tuple5(cp, cr, cs, ct, cu)
441+func cC (cD,cE,cF,cG) = {
442+ let cH = toBigInt(cD)
443+ let cI = toBigInt(cE)
444+ let cJ = toBigInt(cF)
445+ let cK = toBigInt(cG)
446+ aV(aV(cH, cI), aV(cJ, cK))
418447 }
419448
420449
421-func cA (cB,cC,cD,cE) = {
422- let cF = if ((cB != 0))
423- then {
424- let cG = bQ(cB)
425- aM((cG - cD), cB)
426- }
427- else 0
428- let cH = ((cE - cF) + cC)
429- let cI = if ((0 > cH))
430- then $Tuple2(0, aN(cH))
431- else $Tuple2(aN(cH), 0)
432- let cJ = cI._1
433- let cK = cI._2
434- $Tuple3(cJ, cK, cF)
450+func cL (cx,cy) = {
451+ let cD = bD()
452+ let cF = bE()
453+ let cE = bF()
454+ let cG = bG()
455+ let bv = cC(cD, cE, cF, cG)
456+ let cM = if (cx)
457+ then (cD + cy)
458+ else (cD - cy)
459+ let cN = toInt(aU(bv, toBigInt(aR(cM, cE))))
460+ let cO = aP(aY((cN - cF)), cE)
461+ let cP = if (cx)
462+ then cO
463+ else -(cO)
464+ let cQ = cw(cx, cy, cO)
465+ let cR = cQ._1
466+ let cS = cQ._2
467+ let cT = cQ._3
468+ let cU = aP(aR(cD, cE), aR(cF, cG))
469+ let cV = aP(cy, cO)
470+ let cW = aY((cU - cV))
471+ let cX = (aI - aP(cU, (cU + cW)))
472+ let cY = bT()
473+ if ((cX > cY))
474+ then throw(((((((((((((("Price impact " + toString(cX)) + " > max price impact ") + toString(cY)) + " before quote asset: ") + toString(cD)) + " before base asset: ") + toString(cF)) + " quote asset amount to exchange: ") + toString(cy)) + " price before: ") + toString(cU)) + " marketPrice: ") + toString(cV)))
475+ else $Tuple4(cP, cR, cS, cT)
435476 }
436477
437478
438-func cL (ce,cg,cM,cN,cO) = {
439- let cv = aK(cN, cO)
440- if ((cg == 0))
479+func cZ (da,db,dc,dd) = {
480+ let de = if ((da != 0))
481+ then {
482+ let df = ci(da)
483+ aR((df - dc), da)
484+ }
485+ else 0
486+ let dg = ((dd - de) + db)
487+ let dh = if ((0 > dg))
488+ then $Tuple2(0, aY(dg))
489+ else $Tuple2(aY(dg), 0)
490+ let di = dh._1
491+ let dj = dh._2
492+ $Tuple3(di, dj, de)
493+ }
494+
495+
496+func dk (cx,cz,dl,dm,dn,do,dp) = {
497+ let cU = aP(aR(dm, dn), aR(do, dp))
498+ if ((cz == 0))
441499 then throw("Invalid base asset amount")
442500 else {
443- let bk = aM(cN, cO)
444- let cP = if (ce)
445- then (cO + cg)
446- else (cO - cg)
447- let cQ = aK(bk, cP)
448- let cR = aN((cQ - cN))
449- let cz = bD()
450- let cS = cd(!(ce), cR, cg)
451- let cr = cS._1
452- let cs = cS._2
453- let ct = cS._3
454- let cu = cS._4
455- let cw = aK(cR, cg)
456- let cx = aN((cv - cw))
457- let cy = (aD - aK(cv, (cv + cx)))
458- if (if ((cy > cz))
459- then cM
501+ let bv = cC(dm, dn, do, dp)
502+ let dq = if (cx)
503+ then (do + cz)
504+ else (do - cz)
505+ let dr = toInt(aU(bv, toBigInt(aR(dq, dp))))
506+ let ds = aY((dr - aR(dm, dn)))
507+ let cY = bT()
508+ let dt = cw(!(cx), ds, cz)
509+ let cR = dt._1
510+ let cS = dt._2
511+ let cT = dt._3
512+ let cV = aP(ds, cz)
513+ let cW = aY((cU - cV))
514+ let cX = (aI - aP(cU, (cU + cW)))
515+ if (if ((cX > cY))
516+ then dl
460517 else false)
461- then throw(((((((((((((("Price impact " + toString(cy)) + " > max price impact ") + toString(cz)) + " before quote asset: ") + toString(cN)) + " before base asset: ") + toString(cO)) + " base asset amount to exchange: ") + toString(cg)) + " price before: ") + toString(cv)) + " market price: ") + toString(cw)))
462- else $Tuple8(cR, cr, cs, ct, cu, (bI() - (if (ce)
463- then aN(cg)
464- else 0)), (bH() - (if (!(ce))
465- then aN(cg)
466- else 0)), cy)
518+ then throw(((((((((((((("Price impact " + toString(cX)) + " > max price impact ") + toString(cY)) + " before quote asset: ") + toString(dm)) + " before base asset: ") + toString(do)) + " base asset amount to exchange: ") + toString(cz)) + " price before: ") + toString(cU)) + " market price: ") + toString(cV)))
519+ else $Tuple7(ds, cR, cS, cT, (bZ() - (if (cx)
520+ then aY(cz)
521+ else 0)), (bY() - (if (!(cx))
522+ then aY(cz)
523+ else 0)), cX)
467524 }
468525 }
469526
470527
471-func cT (ce,cg,cM) = cL(ce, cg, cM, bq(), br())
528+func du (cx,cz,dl) = dk(cx, cz, dl, bD(), bF(), bE(), bG())
472529
473530
474-func cU () = {
475- let cV = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
476- let cW = getStringValue(this, a)
477- let cX = getStringValue(this, b)
478- let cY = valueOrErrorMessage(getInteger(cV, cW), ((("Can not get oracle price. Oracle: " + toString(cV)) + " key: ") + cW))
479- cY
531+func dv () = {
532+ let dw = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
533+ let dx = getStringValue(this, a)
534+ let dy = getStringValue(this, b)
535+ let dz = valueOrErrorMessage(getInteger(dw, dx), ((("Can not get oracle price. Oracle: " + toString(dw)) + " key: ") + dx))
536+ dz
480537 }
481538
482539
483-func cZ (cN,cO) = {
484- let da = cU()
485- let db = aK(cN, cO)
486- let dc = aK((da + db), (2 * aD))
487- let dd = aK(aN((da - db)), dc)
488- if ((dd > bE()))
489- then throw(((("Price spread " + toString(dd)) + " > max price spread ") + toString(bE())))
540+func dA (dm,do) = {
541+ let dB = dv()
542+ let dC = aP(dm, do)
543+ let dD = aP((dB + dC), (2 * aI))
544+ let dE = aP(aY((dB - dC)), dD)
545+ if ((dE > bU()))
546+ then throw(((("Price spread " + toString(dE)) + " > max price spread ") + toString(bU())))
490547 else true
491548 }
492549
493550
494-func de () = {
495- let cN = bq()
496- let cO = br()
497- aK(cN, cO)
551+func dF (dG,dH) = {
552+ let dI = bV()
553+ if ((dG > dI))
554+ then throw(((("Long open notional " + toString(dG)) + " > max open notional ") + toString(dI)))
555+ else if ((dH > dI))
556+ then throw(((("Short open notional " + toString(dH)) + " > max open notional ") + toString(dI)))
557+ else true
498558 }
499559
500560
501-func df () = {
502- let da = cU()
503- let dg = de()
504- (aK(aN((da - dg)), da) > bC())
561+func dJ () = {
562+ let dm = bD()
563+ let do = bE()
564+ let cE = bF()
565+ let cG = bG()
566+ aP(aR(dm, cE), aR(do, cG))
505567 }
506568
507569
508-func dh (bR,di,cN,cO) = {
509- let dj = aN(bR)
510- let dk = (0 > bR)
511- let dl = if ((di == aG))
512- then {
513- let dm = cL(!(dk), dj, false, cN, cO)
514- let dn = dm._1
515- let do = dm._2
516- let dp = dm._3
517- let dq = dm._4
518- dn
519- }
520- else aM(dj, cU())
521- dl
570+func dK () = {
571+ let dB = dv()
572+ let dL = dJ()
573+ (aP(aY((dB - dL)), dB) > bS())
522574 }
523575
524576
525-func dr (bR,ds,cN,cO,di) = if ((bR == 0))
577+func dM (cj,dN,dm,dn,do,dp) = {
578+ let dO = aY(cj)
579+ let dP = (0 > cj)
580+ let dQ = if ((dN == aL))
581+ then {
582+ let dR = dk(!(dP), dO, false, dm, dn, do, dp)
583+ let dS = dR._1
584+ let dT = dR._2
585+ let dU = dR._3
586+ let dV = dR._4
587+ dS
588+ }
589+ else aR(dO, dv())
590+ dQ
591+ }
592+
593+
594+func dW (cj,dX,dm,dn,do,dp,dN) = if ((cj == 0))
526595 then throw("Invalid position size")
527596 else {
528- let dk = (0 > bR)
529- let dl = dh(bR, di, cN, cO)
530- let dt = if (dk)
531- then (ds - dl)
532- else (dl - ds)
533- $Tuple2(dl, dt)
597+ let dP = (0 > cj)
598+ let dQ = dM(cj, dN, dm, dn, do, dp)
599+ let dY = if (dP)
600+ then (dX - dQ)
601+ else (dQ - dX)
602+ $Tuple2(dQ, dY)
534603 }
535604
536605
537-func du (bT,di) = {
538- let dv = bS(bT)
539- let bW = dv._1
540- let dw = dv._2
541- let dx = dv._3
542- let dy = dv._4
543- dr(bW, dx, bq(), br(), di)
606+func dZ (cl,dN) = {
607+ let ea = ck(cl)
608+ let co = ea._1
609+ let eb = ea._2
610+ let ec = ea._3
611+ let ed = ea._4
612+ dW(co, ec, bD(), bF(), bE(), bG(), dN)
544613 }
545614
546615
547-func dz (dA,dB,dC) = aK((dA - dB), dC)
616+func ee (ef,eg,eh) = aP((ef - eg), eh)
548617
549618
550-func dD (bT,di) = {
551- let dE = bS(bT)
552- let bW = dE._1
553- let dw = dE._2
554- let dF = dE._3
555- let dy = dE._4
556- let dG = du(bT, di)
557- let dl = dG._1
558- let dt = dG._2
559- let dH = cA(bW, dw, dy, dt)
560- let cJ = dH._1
561- let cK = dH._2
562- dz(cJ, cK, dl)
619+func ei (cl,dN) = {
620+ let ej = ck(cl)
621+ let co = ej._1
622+ let eb = ej._2
623+ let ek = ej._3
624+ let ed = ej._4
625+ let el = dZ(cl, dN)
626+ let dQ = el._1
627+ let dY = el._2
628+ let em = cZ(co, eb, ed, dY)
629+ let di = em._1
630+ let dj = em._2
631+ ee(di, dj, dQ)
563632 }
564633
565634
566-func dI (bT) = dD(bT, aG)
635+func en (cl) = ei(cl, aL)
567636
568637
569-func dJ (bT,bR) = {
570- let dK = aO(bB(), (aD - aK(dI(bT), bz())))
571- let dL = aM(aN(bR), dK)
572- let dM = cT((bR > 0), dL, false)
573- let dN = dM._1
574- let cy = dM._8
575- if ((bD() > cy))
576- then dN
638+func eo (cl,cj) = {
639+ let ep = aZ(bR(), (aI - aP(en(cl), bP())))
640+ let eq = aR(aY(cj), ep)
641+ let er = du((cj > 0), eq, false)
642+ let es = er._1
643+ let cX = er._7
644+ if ((bT() > cX))
645+ then es
577646 else {
578- let dO = aM(aN(bR), bB())
579- let dP = cT((bR > 0), dO, false)._1
580- dP
647+ let et = aR(aY(cj), bR())
648+ let eu = du((cj > 0), et, false)._1
649+ eu
581650 }
582651 }
583652
584653
585-func dQ (bT,cM) = {
586- let dR = bS(bT)
587- let bW = dR._1
588- let dw = dR._2
589- let dx = dR._3
590- let dy = dR._4
591- let dt = du(bT, aG)._2
592- let dS = cA(bW, dw, dy, dt)
593- let cJ = dS._1
594- let cK = dS._2
595- let dO = -(bW)
596- let dT = dt
597- let dU = -(cJ)
598- let dV = cT((bW > 0), aN(bW), cM)
599- let dP = dV._1
600- let cm = dV._2
601- let cn = dV._3
602- let dW = dV._4
603- let dX = dV._5
604- let dY = dV._6
605- let dZ = dV._7
606- let ea = (bu() - dx)
607- $Tuple12(dO, cK, dT, dU, cm, cn, dW, dX, ea, dP, dY, dZ)
654+func ev (cl,dl) = {
655+ let ew = ck(cl)
656+ let co = ew._1
657+ let eb = ew._2
658+ let ec = ew._3
659+ let ed = ew._4
660+ let dY = dZ(cl, aL)._2
661+ let ex = cZ(co, eb, ed, dY)
662+ let di = ex._1
663+ let dj = ex._2
664+ let et = -(co)
665+ let ey = dY
666+ let ez = -(di)
667+ let eA = du((co > 0), aY(co), dl)
668+ let eu = eA._1
669+ let cM = eA._2
670+ let cN = eA._3
671+ let eB = eA._4
672+ let eC = eA._5
673+ let eD = eA._6
674+ let eE = (bI() - ec)
675+ $Tuple13(et, dj, ey, ez, cM, cN, eB, eE, eu, eC, eD, (bK() - (if ((co > 0))
676+ then ec
677+ else 0)), (bJ() - (if ((0 > co))
678+ then ec
679+ else 0)))
608680 }
609681
610682
611-func eb () = {
612- let ec = ((lastBlock.timestamp / 1000) / 60)
613- let ed = (ec - aA)
614- let ee = valueOrElse(getString(this, v), "")
615- let ef = split(ee, ",")
616- func eg (aS,eh) = if ((ed >= parseIntValue(eh)))
617- then (aS :+ parseIntValue(eh))
618- else aS
683+func eF () = {
684+ let eG = ((lastBlock.timestamp / 1000) / 60)
685+ let eH = (eG - aE)
686+ let eI = valueOrElse(getString(this, y), "")
687+ let eJ = split(eI, ",")
688+ func eK (bd,eL) = if ((eH >= parseIntValue(eL)))
689+ then (bd :+ parseIntValue(eL))
690+ else bd
619691
620- let ei = {
621- let aV = ef
622- let aW = size(aV)
623- let aX = nil
624- func aY (aZ,ba) = if ((ba >= aW))
625- then aZ
626- else eg(aZ, aV[ba])
692+ let eM = {
693+ let bg = eJ
694+ let bh = size(bg)
695+ let bi = nil
696+ func bj (bk,bl) = if ((bl >= bh))
697+ then bk
698+ else eK(bk, bg[bl])
627699
628- func bb (aZ,ba) = if ((ba >= aW))
629- then aZ
700+ func bm (bk,bl) = if ((bl >= bh))
701+ then bk
630702 else throw("List size exceeds 20")
631703
632- bb(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aX, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
704+ bm(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bi, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
633705 }
634- let ej = if ((size(ei) > 0))
635- then max(ei)
636- else parseIntValue(ef[0])
637- let ek = valueOrElse(getInteger(this, w), 0)
638- let el = valueOrElse(getInteger(this, ((x + "_") + toString(ek))), 0)
639- let em = valueOrElse(getInteger(this, ((y + "_") + toString(ek))), 0)
640- let en = (el + ((ec - ek) * em))
641- let eo = valueOrElse(getInteger(this, ((x + "_") + toString(ej))), 0)
642- let ep = valueOrElse(getInteger(this, ((y + "_") + toString(ej))), 0)
643- let eq = (eo + ((ed - ej) * ep))
644- ((en - eq) / aA)
706+ let eN = if ((size(eM) > 0))
707+ then max(eM)
708+ else parseIntValue(eJ[0])
709+ let eO = valueOrElse(getInteger(this, z), 0)
710+ let eP = valueOrElse(getInteger(this, ((A + "_") + toString(eO))), 0)
711+ let eQ = valueOrElse(getInteger(this, ((B + "_") + toString(eO))), 0)
712+ let eR = (eP + ((eG - eO) * eQ))
713+ let eS = valueOrElse(getInteger(this, ((A + "_") + toString(eN))), 0)
714+ let eT = valueOrElse(getInteger(this, ((B + "_") + toString(eN))), 0)
715+ let eU = (eS + ((eH - eN) * eT))
716+ ((eR - eU) / aE)
645717 }
646718
647719
648-func er (es) = {
649- let bR = bs()
650- let et = (bR > 0)
651- let eu = cT(et, aN(bR), false)._1
652- let ev = br()
653- let ew = aM(ev, es)
654- let ex = dr(bR, eu, ew, ev, aG)._2
655- $Tuple2(ew, ex)
720+func eV () = {
721+ let cj = bH()
722+ if ((cj == 0))
723+ then $Tuple2(bD(), bE())
724+ else {
725+ let eW = (cj > 0)
726+ let eX = du(eW, aY(cj), false)
727+ let eY = eX._1
728+ let eZ = eX._2
729+ let fa = eX._3
730+ $Tuple2(eZ, fa)
731+ }
656732 }
657733
658734
659-func ey () = {
660- let ez = cU()
661- let eA = eb()
662- let eB = (eA - ez)
663- if (if ((bH() == 0))
735+func fb (fc,bH,fd,fe) = {
736+ let ff = toBigInt(fc)
737+ let fg = toBigInt(bH)
738+ let fh = toBigInt(fd)
739+ let fi = toBigInt(fe)
740+ let fj = aX((ff + fg), toBigInt((2 * aI)))
741+ let fk = aV(fh, fj)
742+ let fl = (toBigInt(4) * aV(fi, fg))
743+ let fm = aW(aV(fk, (fh - fl)))
744+ let fn = aV(ff, fh)
745+ let fo = aV(fh, fg)
746+ let fp = ((-(fm) + fn) + fo)
747+ let fq = (toBigInt(2) * aV(fh, fg))
748+ let fr = aU(fp, fq)
749+ toInt(fr)
750+ }
751+
752+
753+func fs (ft) = {
754+ let cj = bH()
755+ if ((cj == 0))
756+ then {
757+ let cD = bD()
758+ let cF = bE()
759+ let fu = aP(aR(ft, cF), cD)
760+ $Tuple3(fu, aI, 0)
761+ }
762+ else {
763+ let eW = (cj > 0)
764+ let eY = du(eW, aY(cj), false)._1
765+ let cD = bD()
766+ let cF = bE()
767+ let fu = fb(cF, cj, cD, ft)
768+ let fv = aI
769+ let ez = dW(cj, eY, cD, fu, cF, fv, aL)._2
770+ $Tuple3(fu, fv, ez)
771+ }
772+ }
773+
774+
775+func fw () = {
776+ let fx = dv()
777+ let fy = eF()
778+ let fz = (fy - fx)
779+ if (if ((bY() == 0))
664780 then true
665- else (bI() == 0))
781+ else (bZ() == 0))
666782 then $Tuple2(0, 0)
667- else if ((0 > eB))
783+ else if ((0 > fz))
668784 then {
669- let eC = aK(aM(eB, bx()), aE)
670- let eD = aK(aM(eC, bH()), bI())
671- $Tuple2(eC, eD)
785+ let fA = aP(aR(fz, bN()), aJ)
786+ let fB = aP(aR(fA, bY()), bZ())
787+ $Tuple2(fA, fB)
672788 }
673789 else {
674- let eD = aK(aM(eB, bx()), aE)
675- let eC = aK(aM(eD, bI()), bH())
676- $Tuple2(eC, eD)
790+ let fB = aP(aR(fz, bN()), aJ)
791+ let fA = aP(aR(fB, bZ()), bY())
792+ $Tuple2(fA, fB)
677793 }
678794 }
679795
680796
681-func eE (bK) = {
682- let eF = bo()
683- let eG = if ((size(bK.payments) > 1))
797+func fC (fD,fE) = {
798+ let fF = bB()
799+ let fG = aR(fF, fE)
800+ let fH = if ((fD != ""))
684801 then {
685- let eH = toBase58String(valueOrErrorMessage(bK.payments[1].assetId, "Invalid attached artifact"))
686- let eI = bl(ap(), ab(aw, eH))
687- if ((eI == ax))
802+ let fI = by(at(), ag(aA, fD))
803+ if ((fI == aB))
688804 then {
689- let eJ = bm(ap(), ab(av, eH))
690- let eK = aM(eF, eJ)
691- $Tuple2(eK, true)
805+ let fJ = bz(at(), ag(az, fD))
806+ let fK = aR(fG, fJ)
807+ $Tuple2(fK, true)
692808 }
693809 else throw("Invalid attached artifact")
694810 }
695- else $Tuple2(eF, false)
696- let eK = eG._1
697- let eL = eG._2
698- $Tuple2(eK, eL)
811+ else $Tuple2(fG, false)
812+ let fK = fH._1
813+ let fL = fH._2
814+ $Tuple2(fK, fL)
699815 }
700816
701817
702-func eM (eN,eO,eP,eQ,eR,eS,eT,eU,eV) = [IntegerEntry(o, eN), IntegerEntry(p, eO), IntegerEntry(q, eP), IntegerEntry(n, eQ), IntegerEntry(m, eR), IntegerEntry(s, eS), IntegerEntry(t, eT), IntegerEntry(r, eU), IntegerEntry(u, eV)]
818+func fM (fN,fO,fP,fQ,fR,fS,fT,fU,fV,dI) = [IntegerEntry(q, fN), IntegerEntry(r, fO), IntegerEntry(s, fP), IntegerEntry(p, fQ), IntegerEntry(o, fR), IntegerEntry(u, fS), IntegerEntry(v, fT), IntegerEntry(t, fU), IntegerEntry(w, fV), IntegerEntry(x, dI)]
703819
704820
705-func eW (eX,eY,eZ,fa,fb) = [IntegerEntry(C, eX), IntegerEntry(A, eY), IntegerEntry(B, eZ), IntegerEntry(D, fa), IntegerEntry(E, fb)]
821+func fW (fX,fY,fZ,ga,gb) = [IntegerEntry(F, fX), IntegerEntry(D, fY), IntegerEntry(E, fZ), IntegerEntry(G, ga), IntegerEntry(H, gb)]
706822
707823
708-func fc (ad,au) = [StringEntry(ab(j, ad), au)]
824+func gc (ai,ay) = [StringEntry(ag(k, ai), ay)]
709825
710826
711-func fd (ad,fe,ff,fg,cG) = [IntegerEntry(ab(e, ad), fe), IntegerEntry(ab(f, ad), ff), IntegerEntry(ab(g, ad), fg), IntegerEntry(ab(h, ad), cG)]
827+func gd (ge,ai) = if (ge)
828+ then {
829+ let gf = ca()
830+[IntegerEntry(ag(j, ai), (gf + 1)), IntegerEntry(e, (gf + 1))]
831+ }
832+ else nil
712833
713834
714-func fh (fi) = {
715- let ec = ((lastBlock.timestamp / 1000) / 60)
716- let fj = valueOrElse(getInteger(this, w), 0)
717- if ((fj > ec))
835+func gg (ai,gh,gi,gj,df) = [IntegerEntry(ag(f, ai), gh), IntegerEntry(ag(g, ai), gi), IntegerEntry(ag(h, ai), gj), IntegerEntry(ag(i, ai), df)]
836+
837+
838+func gk (gl) = {
839+ let eG = ((lastBlock.timestamp / 1000) / 60)
840+ let gm = valueOrElse(getInteger(this, z), 0)
841+ if ((gm > eG))
718842 then throw("TWAP out-of-order")
719843 else {
720- let ek = if ((fj == 0))
721- then ec
722- else fj
723- if ((ec > fj))
844+ let eO = if ((gm == 0))
845+ then eG
846+ else gm
847+ if ((eG > gm))
724848 then {
725- let fk = valueOrElse(getInteger(this, ((x + "_") + toString(fj))), 0)
726- let fl = valueOrElse(getInteger(this, ((y + "_") + toString(fj))), fi)
727- let fm = (fk + ((ec - ek) * fl))
728- let ef = bg(be(valueOrElse(getString(this, v), "")), aA, toString(ec))
729-[IntegerEntry(ab(x, toString(ec)), fm), IntegerEntry(ab(y, toString(ec)), fi), IntegerEntry(ab(z, toString(ec)), fj), IntegerEntry(w, ec), StringEntry(v, aP(ef))]
849+ let gn = valueOrElse(getInteger(this, ((A + "_") + toString(gm))), 0)
850+ let go = valueOrElse(getInteger(this, ((B + "_") + toString(gm))), gl)
851+ let gp = (gn + ((eG - eO) * go))
852+ let eJ = br(bp(valueOrElse(getString(this, y), "")), aE, toString(eG))
853+[IntegerEntry(ag(A, toString(eG)), gp), IntegerEntry(ag(B, toString(eG)), gl), IntegerEntry(ag(C, toString(eG)), gm), IntegerEntry(z, eG), StringEntry(y, ba(eJ))]
730854 }
731855 else {
732- let fn = valueOrElse(getInteger(this, ab(z, toString(ec))), 0)
733- let fk = valueOrElse(getInteger(this, ab(x, toString(fn))), 0)
734- let fl = valueOrElse(getInteger(this, ab(y, toString(fn))), fi)
735- let fm = (fk + ((ec - fn) * fl))
736-[IntegerEntry(ab(x, toString(ec)), fm), IntegerEntry(ab(y, toString(ec)), fi)]
856+ let gq = valueOrElse(getInteger(this, ag(C, toString(eG))), 0)
857+ let gn = valueOrElse(getInteger(this, ag(A, toString(gq))), 0)
858+ let go = valueOrElse(getInteger(this, ag(B, toString(gq))), gl)
859+ let gp = (gn + ((eG - gq) * go))
860+[IntegerEntry(ag(A, toString(eG)), gp), IntegerEntry(ag(B, toString(eG)), gl)]
737861 }
738862 }
739863 }
740864
741865
742-func fo (ck,cl) = [IntegerEntry(F, ck), IntegerEntry(G, cl)]
866+func gr (cD,cF) = [IntegerEntry(I, cD), IntegerEntry(J, cF)]
743867
744868
745-func fp (ck,cl,fq,fr,fs,ft,fu) = if (((ft - fu) != fq))
746- then throw(((((("Invalid AMM state data: " + toString(ft)) + " + ") + toString(fu)) + " != ") + toString(fq)))
747- else ((fo(ck, cl) ++ [IntegerEntry(H, fq), IntegerEntry(K, fr), IntegerEntry(L, fs), IntegerEntry(I, ft), IntegerEntry(J, fu)]) ++ fh(aK(ck, cl)))
869+func gs (cE,cG) = [IntegerEntry(K, cE), IntegerEntry(L, cG)]
748870
749871
750-func fv (ad) = [DeleteEntry(ab(e, ad)), DeleteEntry(ab(f, ad)), DeleteEntry(ab(g, ad)), DeleteEntry(ab(h, ad)), DeleteEntry(ab(j, ad)), IntegerEntry(ab(i, ad), lastBlock.timestamp)]
751-
752-
753-func fw (ad,fx) = {
754- let fy = assetBalance(this, ah())
755- if ((fx > fy))
756- then throw(((("Unable to withdraw " + toString(fx)) + " from contract balance ") + toString(fy)))
757- else [ScriptTransfer(ad, fx, ah())]
872+func gt (cD,cF,gu,gv,gw,gx,gy,gz) = {
873+ let cE = bF()
874+ let cG = bG()
875+ if (((gw - gx) != gu))
876+ then throw(((((("Invalid AMM state data: " + toString(gw)) + " + ") + toString(gx)) + " != ") + toString(gu)))
877+ else ((gr(cD, cF) ++ [IntegerEntry(M, gu), IntegerEntry(P, gv), IntegerEntry(N, gw), IntegerEntry(O, gx), IntegerEntry(R, gy), IntegerEntry(Q, gz)]) ++ gk(aP(aR(cD, cE), aR(cF, cG))))
758878 }
759879
760880
761-func fz (bK) = if ((0 > bK))
762- then throw("Balance")
763- else [IntegerEntry(d, bK)]
881+func gA (ai) = [DeleteEntry(ag(f, ai)), DeleteEntry(ag(g, ai)), DeleteEntry(ag(h, ai)), DeleteEntry(ag(i, ai)), DeleteEntry(ag(k, ai))]
764882
765883
766-func fA (bK) = [ScriptTransfer(aj(), bK, ah())]
884+func gB (ai,gC) = {
885+ let gD = assetBalance(this, am())
886+ if ((gC > gD))
887+ then throw(((("Unable to withdraw " + toString(gC)) + " from contract balance ") + toString(gD)))
888+ else [ScriptTransfer(ai, gC, am())]
889+ }
767890
768891
769-func fB (fC,bK) = if (fC)
770- then [Burn(valueOrErrorMessage(bK.payments[1].assetId, "Invalid artifact"), 1)]
892+func gE (cc) = if ((0 > cc))
893+ then throw("Balance")
894+ else [IntegerEntry(d, cc)]
895+
896+
897+func gF (cc) = [ScriptTransfer(ao(), cc, am())]
898+
899+
900+func gG (gH,cc) = if (gH)
901+ then [Burn(valueOrErrorMessage(cc.payments[1].assetId, "Invalid artifact"), 1)]
771902 else nil
772903
773904
774-func fD (bT,au) = {
775- let fE = bS(bT)._1
776- if ((fE == 0))
905+func gI (cl,ay) = {
906+ let gJ = ck(cl)._1
907+ if ((gJ == 0))
777908 then true
778- else (bX(bT) == au)
909+ else (cp(cl) == ay)
779910 }
780911
781912
782-func fF (bT,au) = (bX(bT) == au)
913+func gK (cl,ay) = (cp(cl) == ay)
783914
784915
785-func fG (fH,au,bT) = ((((((aa + "_") + fH) + "_") + au) + "_") + bT)
916+func gL (gM,ay,cl) = ((((((af + "_") + gM) + "_") + ay) + "_") + cl)
786917
787918
788-func fI (bT) = {
789- let bZ = bX(bT)
790- if ((bZ == toBase58String(ah())))
791- then $Tuple2(0, bZ)
919+func gN (cl) = {
920+ let cr = cp(cl)
921+ if ((cr == toBase58String(am())))
922+ then $Tuple2(0, cr)
792923 else {
793- let fJ = fG(toString(this), bZ, bT)
794- let fK = valueOrElse(getInteger(aq(), fJ), 0)
795- $Tuple2(fK, bZ)
924+ let gO = gL(toString(this), cr, cl)
925+ let gP = valueOrElse(getInteger(au(), gO), 0)
926+ $Tuple2(gP, cr)
796927 }
797928 }
798929
799930
800-@Callable(bK)
801-func pause () = if ((bK.caller != af()))
802- then throw("Invalid togglePause params")
803- else [BooleanEntry(l, true)]
931+func gQ (cl,fD) = {
932+ let gR = invoke(aq(), "computeFeeDiscount", [cl], nil)
933+ if ((gR == gR))
934+ then {
935+ let gS = {
936+ let cn = gR
937+ if ($isInstanceOf(cn, "Int"))
938+ then {
939+ let gT = cn
940+ gT
941+ }
942+ else throw("Invalid computeFeeDiscount result")
943+ }
944+ let gU = fC(fD, gS)
945+ let fK = gU._1
946+ let fL = gU._2
947+ $Tuple2(fK, fL)
948+ }
949+ else throw("Strict value is not equal to itself.")
950+ }
951+
952+
953+func gV (cc) = {
954+ let gW = if ((size(cc.payments) > 1))
955+ then toBase58String(valueOrErrorMessage(cc.payments[1].assetId, "Invalid artifactId"))
956+ else ""
957+ gW
958+ }
959+
960+
961+@Callable(cc)
962+func pause () = if ((cc.caller != ak()))
963+ then throw("Invalid pause params")
964+ else [BooleanEntry(m, true)]
804965
805966
806967
807-@Callable(bK)
808-func unpause () = if ((bK.caller != af()))
809- then throw("Invalid togglePause params")
810- else [BooleanEntry(l, false)]
968+@Callable(cc)
969+func unpause () = if ((cc.caller != ak()))
970+ then throw("Invalid unpause params")
971+ else [BooleanEntry(m, false)]
811972
812973
813974
814-@Callable(bK)
815-func addLiquidity (cf) = if (if ((bK.caller != af()))
975+@Callable(cc)
976+func setCloseOnly () = if ((cc.caller != ak()))
977+ then throw("Invalid setCloseOnly params")
978+ else [BooleanEntry(n, true)]
979+
980+
981+
982+@Callable(cc)
983+func unsetCloseOnly () = if ((cc.caller != ak()))
984+ then throw("Invalid unsetCloseOnly params")
985+ else [BooleanEntry(n, false)]
986+
987+
988+
989+@Callable(cc)
990+func addLiquidity (cy) = if (if ((cc.caller != ak()))
816991 then true
817- else (0 >= cf))
992+ else (0 >= cy))
818993 then throw("Invalid addLiquidity params")
819994 else {
820- let ck = bq()
821- let cl = br()
822- let fi = aK(ck, cl)
823- let fL = aK(cf, fi)
824- let fM = (ck + cf)
825- let fN = (cl + fL)
826- fo(fM, fN)
995+ let cD = bD()
996+ let cF = bE()
997+ let cE = bF()
998+ let cG = bG()
999+ let gl = aP(aR(cD, cE), aR(cF, cG))
1000+ let gX = aP(cy, gl)
1001+ let gY = (cD + cy)
1002+ let gZ = (cF + gX)
1003+ gr(gY, gZ)
8271004 }
8281005
8291006
8301007
831-@Callable(bK)
832-func removeLiquidity (cf) = if (if ((bK.caller != af()))
1008+@Callable(cc)
1009+func removeLiquidity (cy) = if (if ((cc.caller != ak()))
8331010 then true
834- else (0 >= cf))
1011+ else (0 >= cy))
8351012 then throw("Invalid removeLiquidity params")
8361013 else {
837- let ck = bq()
838- let cl = br()
839- let fi = aK(ck, cl)
840- let fO = aK(cf, fi)
841- let fM = (ck - cf)
842- let fN = (cl - fO)
843- fo(fM, fN)
1014+ let cD = bD()
1015+ let cF = bE()
1016+ let cE = bF()
1017+ let cG = bG()
1018+ let gl = aP(aR(cD, cE), aR(cF, cG))
1019+ let ha = aP(cy, gl)
1020+ let gY = (cD - cy)
1021+ let gZ = (cF - ha)
1022+ gr(gY, gZ)
8441023 }
8451024
8461025
8471026
848-@Callable(bK)
849-func changeSettings (eN,eO,eP,eQ,eR,eS,eT,eU,eV) = if ((bK.caller != af()))
1027+@Callable(cc)
1028+func changeSettings (fN,fO,fP,fQ,fR,fS,fT,fU,fV,dI) = if ((cc.caller != ak()))
8501029 then throw("Invalid changeSettings params")
851- else eM(eN, eO, eP, eQ, eR, eS, eT, eU, eV)
1030+ else fM(fN, fO, fP, fQ, fR, fS, fT, fU, fV, dI)
8521031
8531032
8541033
855-@Callable(bK)
856-func initialize (ck,cl,eQ,eN,eO,eP,eR,fP,fQ,fR,eS,eT,eU,eV) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= ck))
1034+@Callable(cc)
1035+func initialize (cD,cF,fQ,fN,fO,fP,fR,hb,hc,hd,fS,fT,fU,fV,dI) = if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= cD))
8571036 then true
858- else (0 >= cl))
1037+ else (0 >= cF))
8591038 then true
860- else (0 >= eQ))
1039+ else (0 >= fQ))
8611040 then true
862- else (0 >= eN))
1041+ else (0 >= fN))
8631042 then true
864- else (0 >= eO))
1043+ else (0 >= fO))
8651044 then true
866- else (0 >= eP))
1045+ else (0 >= fP))
8671046 then true
868- else (0 >= eR))
1047+ else (0 >= fR))
8691048 then true
870- else (0 >= eS))
1049+ else (0 >= fS))
8711050 then true
872- else (0 >= eT))
1051+ else (0 >= fT))
8731052 then true
874- else (0 >= eU))
1053+ else (0 >= fU))
8751054 then true
876- else (0 >= eV))
1055+ else (0 >= fV))
8771056 then true
878- else cb())
1057+ else (0 >= dI))
1058+ then true
1059+ else ct())
8791060 then throw("Invalid initialize parameters")
880- else ((((fp(ck, cl, 0, 0, 0, 0, 0) ++ eM(eN, eO, eP, eQ, eR, eS, eT, eU, eV)) ++ eW((lastBlock.timestamp + eQ), 0, 0, 0, 0)) ++ fz(0)) ++ [BooleanEntry(k, true), StringEntry(c, fP), StringEntry(a, fQ), StringEntry(M, fR)])
1061+ else ((((gt(cD, cF, 0, 0, 0, 0, 0, 0) ++ fM(fN, fO, fP, fQ, fR, fS, fT, fU, fV, dI)) ++ fW((lastBlock.timestamp + fQ), 0, 0, 0, 0)) ++ gE(0)) ++ [BooleanEntry(l, true), StringEntry(c, hb), StringEntry(a, hc), StringEntry(S, hd)])
8811062
8821063
8831064
884-@Callable(bK)
885-func setInitMarginRatio (eN) = if (if ((0 >= eN))
886- then true
887- else !(cb()))
888- then throw("Invalid setInitMarginRatio parameters")
889- else eM(eN, bz(), bA(), bw(), bo(), bC(), bD(), bB(), bE())
1065+@Callable(cc)
1066+func decreasePosition (gC,he,hf) = {
1067+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1068+ if ((hg == hg))
1069+ then {
1070+ let cl = cb(cc)
1071+ if (if (if (if (if ((0 >= gC))
1072+ then true
1073+ else !(ct()))
1074+ then true
1075+ else !(cd(aP(aI, he), bC(), true)))
1076+ then true
1077+ else !(cs(cl)))
1078+ then true
1079+ else cu())
1080+ then throw("Invalid decreasePosition parameters")
1081+ else {
1082+ let hh = ck(cl)
1083+ let gJ = hh._1
1084+ let hi = hh._2
1085+ let hj = hh._3
1086+ let hk = hh._4
1087+ let hl = if ((gJ > 0))
1088+ then aD
1089+ else aC
1090+ let hm = (hl == aC)
1091+ let hn = aR(gC, he)
1092+ let ho = dZ(cl, aL)
1093+ let hp = ho._1
1094+ let dY = ho._2
1095+ let hq = if ((hp > hn))
1096+ then {
1097+ let hr = cL(hm, hn)
1098+ let et = hr._1
1099+ let cM = hr._2
1100+ let cN = hr._3
1101+ let eB = hr._4
1102+ let hs = aY(et)
1103+ if (if ((hf != 0))
1104+ then (hf > hs)
1105+ else false)
1106+ then throw(((("Too little base asset exchanged, got " + toString(hs)) + " expected ") + toString(hf)))
1107+ else {
1108+ let ey = aP(aR(dY, hs), aY(gJ))
1109+ let ht = cZ(gJ, hi, hk, ey)
1110+ let di = ht._1
1111+ let dj = ht._2
1112+ let de = ht._3
1113+ let eu = hn
1114+ let hu = (dY - ey)
1115+ let hv = if ((gJ > 0))
1116+ then ((hp - eu) - hu)
1117+ else ((hu + hp) - eu)
1118+ let hw = (gJ + et)
1119+ $Tuple12(hw, di, aY(hv), ci(hw), cN, cM, eB, (bI() - hn), (bZ() - (if ((hw > 0))
1120+ then aY(et)
1121+ else 0)), (bY() - (if ((0 > hw))
1122+ then aY(et)
1123+ else 0)), (bK() - (if ((hw > 0))
1124+ then hn
1125+ else 0)), (bJ() - (if ((0 > hw))
1126+ then hn
1127+ else 0)))
1128+ }
1129+ }
1130+ else throw("Close position first")
1131+ let hw = hq._1
1132+ let hx = hq._2
1133+ let hy = hq._3
1134+ let hz = hq._4
1135+ let cN = hq._5
1136+ let cM = hq._6
1137+ let eB = hq._7
1138+ let eE = hq._8
1139+ let eC = hq._9
1140+ let eD = hq._10
1141+ let hA = hq._11
1142+ let hB = hq._12
1143+ let hC = invoke(aq(), "notifyNotional", [cl, hy], nil)
1144+ if ((hC == hC))
1145+ then (gg(cl, hw, hx, hy, hz) ++ gt(cM, cN, eB, eE, eC, eD, hA, hB))
1146+ else throw("Strict value is not equal to itself.")
1147+ }
1148+ }
1149+ else throw("Strict value is not equal to itself.")
1150+ }
8901151
8911152
8921153
893-@Callable(bK)
894-func decreasePosition (fx,fS,fT) = if (if (if (if (if ((0 >= fx))
895- then true
896- else !(cb()))
897- then true
898- else !(bL(aK(aD, fS), bp(), true)))
899- then true
900- else !(ca(toString(bK.caller))))
901- then true
902- else cc())
903- then throw("Invalid decreasePosition parameters")
904- else {
905- let fU = bS(toString(bK.caller))
906- let fE = fU._1
907- let fV = fU._2
908- let fW = fU._3
909- let fX = fU._4
910- let fY = if ((fE > 0))
911- then az
912- else ay
913- let fZ = (fY == ay)
914- let ga = aM(fx, fS)
915- let gb = du(toString(bK.caller), aG)
916- let gc = gb._1
917- let dt = gb._2
918- let gd = if ((gc > ga))
919- then {
920- let ge = cj(fZ, ga)
921- let dO = ge._1
922- let cm = ge._2
923- let cn = ge._3
924- let dW = ge._4
925- let dX = ge._5
926- let gf = aN(dO)
927- if (if ((fT != 0))
928- then (fT > gf)
1154+@Callable(cc)
1155+func increasePosition (hl,he,hf,hD) = {
1156+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1157+ if ((hg == hg))
1158+ then {
1159+ let cl = cb(cc)
1160+ let hE = cc.payments[0].amount
1161+ let ay = cc.payments[0].assetId
1162+ let hF = toBase58String(value(ay))
1163+ let hG = (ay == am())
1164+ let hH = ax(hF)
1165+ if (if (if (if (if (if (if (if (if ((hl != aC))
1166+ then (hl != aD)
1167+ else false)
1168+ then true
1169+ else (0 >= hE))
1170+ then true
1171+ else !(ct()))
1172+ then true
1173+ else if (!(hG))
1174+ then !(hH)
9291175 else false)
930- then throw(((("Too little base asset exchanged, got " + toString(gf)) + " expected ") + toString(fT)))
931- else {
932- let dT = aK(aM(dt, gf), aN(fE))
933- let gg = cA(fE, fV, fX, dT)
934- let cJ = gg._1
935- let cK = gg._2
936- let cF = gg._3
937- let dP = ga
938- let gh = (dt - dT)
939- let gi = if ((fE > 0))
940- then ((gc - dP) - gh)
941- else ((gh + gc) - dP)
942- let gj = (fE + dO)
943- $Tuple11(gj, cJ, aN(gi), bQ(gj), cn, cm, dW, dX, (bu() - ga), (bI() - (if ((gj > 0))
944- then aN(dO)
945- else 0)), (bH() - (if ((0 > gj))
946- then aN(dO)
947- else 0)))
948- }
949- }
950- else throw("Close position first")
951- let gj = gd._1
952- let gk = gd._2
953- let gl = gd._3
954- let gm = gd._4
955- let cn = gd._5
956- let cm = gd._6
957- let dW = gd._7
958- let dX = gd._8
959- let ea = gd._9
960- let dY = gd._10
961- let dZ = gd._11
962- let gn = invoke(al(), "notifyNotional", [toString(bK.caller), gl], nil)
963- if ((gn == gn))
964- then (fd(toString(bK.caller), gj, gk, gl, gm) ++ fp(cm, cn, dW, dX, ea, dY, dZ))
965- else throw("Strict value is not equal to itself.")
966- }
967-
968-
969-
970-@Callable(bK)
971-func increasePosition (fY,fS,fT,go) = {
972- let bT = toString(bK.caller)
973- let gp = bK.payments[0].amount
974- let au = bK.payments[0].assetId
975- let gq = toBase58String(value(au))
976- let gr = (au == ah())
977- let gs = at(gq)
978- if (if (if (if (if (if (if (if ((fY != ay))
979- then (fY != az)
980- else false)
981- then true
982- else (0 >= gp))
983- then true
984- else !(cb()))
985- then true
986- else if (!(gr))
987- then !(gs)
988- else false)
989- then true
990- else !(fD(bT, gq)))
991- then true
992- else !(bL(aK(aD, fS), bp(), true)))
993- then true
994- else cc())
995- then throw("Invalid increasePosition parameters")
996- else {
997- let eF = bo()
998- let gt = eE(bK)
999- let eK = gt._1
1000- let eL = gt._2
1001- let gu = aM(gp, eK)
1002- let fx = (gp - gu)
1003- let gv = if (gs)
1004- then {
1005- let gw = invoke(aq(), "borrow", [bT], [AttachedPayment(au, fx)])
1006- if ((gw == gw))
1176+ then true
1177+ else !(gI(cl, hF)))
1178+ then true
1179+ else !(cd(aP(aI, he), bC(), true)))
1180+ then true
1181+ else cu())
1182+ then true
1183+ else cv())
1184+ then throw("Invalid increasePosition parameters")
1185+ else {
1186+ let hI = gQ(cl, gV(cc))
1187+ let fK = hI._1
1188+ let fL = hI._2
1189+ let hJ = aR(hE, fK)
1190+ let gC = (hE - hJ)
1191+ let hK = if (hH)
10071192 then {
1008- let gx = assetBalance(this, ah())
1009- if ((gx == gx))
1193+ let hL = invoke(au(), "borrow", [cl], [AttachedPayment(ay, gC)])
1194+ if ((hL == hL))
10101195 then {
1011- let gy = invoke(ar(), "swap", [toBase58String(ah()), 0], [AttachedPayment(au, gu)])
1012- if ((gy == gy))
1196+ let hM = assetBalance(this, am())
1197+ if ((hM == hM))
10131198 then {
1014- let gz = assetBalance(this, ah())
1015- if ((gz == gz))
1199+ let hN = invoke(av(), "swap", [toBase58String(am()), 0], [AttachedPayment(ay, hJ)])
1200+ if ((hN == hN))
10161201 then {
1017- let gA = (gz - gx)
1018- if ((gA == gA))
1019- then gA
1202+ let hO = assetBalance(this, am())
1203+ if ((hO == hO))
1204+ then {
1205+ let hP = (hO - hM)
1206+ if ((hP == hP))
1207+ then hP
1208+ else throw("Strict value is not equal to itself.")
1209+ }
1210+ else throw("Strict value is not equal to itself.")
1211+ }
1212+ else throw("Strict value is not equal to itself.")
1213+ }
1214+ else throw("Strict value is not equal to itself.")
1215+ }
1216+ else throw("Strict value is not equal to itself.")
1217+ }
1218+ else hJ
1219+ if ((hK == hK))
1220+ then {
1221+ let hQ = invoke(as(), "acceptPaymentWithLink", [cl, hD], [AttachedPayment(am(), hK)])
1222+ if ((hQ == hQ))
1223+ then {
1224+ let hR = {
1225+ let cn = hQ
1226+ if ($isInstanceOf(cn, "Int"))
1227+ then {
1228+ let gT = cn
1229+ gT
1230+ }
1231+ else throw("Invalid referrerFee")
1232+ }
1233+ let hS = (hK - hR)
1234+ let hT = ck(cl)
1235+ let gJ = hT._1
1236+ let hi = hT._2
1237+ let hj = hT._3
1238+ let hk = hT._4
1239+ let ge = (gJ == 0)
1240+ let hU = if ((gJ > 0))
1241+ then (hl == aC)
1242+ else (hl == aD)
1243+ let hV = if (!(ge))
1244+ then hU
1245+ else false
1246+ let hm = (hl == aC)
1247+ let hW = if (if (ge)
1248+ then true
1249+ else hV)
1250+ then {
1251+ let hn = aR(gC, he)
1252+ let hX = cL(hm, hn)
1253+ let cP = hX._1
1254+ let cM = hX._2
1255+ let cN = hX._3
1256+ let eB = hX._4
1257+ if (if ((hf != 0))
1258+ then (hf > aY(cP))
1259+ else false)
1260+ then throw(((("Limit error: " + toString(aY(cP))) + " < ") + toString(hf)))
1261+ else {
1262+ let hw = (gJ + cP)
1263+ let hA = (bK() + (if ((hw > 0))
1264+ then hn
1265+ else 0))
1266+ let hB = (bJ() + (if ((0 > hw))
1267+ then hn
1268+ else 0))
1269+ let hY = aP(hn, he)
1270+ let hZ = cZ(gJ, hi, hk, hY)
1271+ let di = hZ._1
1272+ let dT = hZ._2
1273+ let dU = hZ._3
1274+ if (!(dA(cM, cN)))
1275+ then throw("Over max spread limit")
1276+ else if (!(dF(hA, hB)))
1277+ then throw("Over max open notional")
1278+ else $Tuple12(hw, di, (hj + hn), ci(hw), cN, cM, eB, (bI() + hn), (bZ() + (if ((hw > 0))
1279+ then aY(cP)
1280+ else 0)), (bY() + (if ((0 > hw))
1281+ then aY(cP)
1282+ else 0)), hA, hB)
1283+ }
1284+ }
1285+ else {
1286+ let hn = aR(gC, he)
1287+ let ia = dZ(toString(cc.caller), aL)
1288+ let hp = ia._1
1289+ let dY = ia._2
1290+ if ((hp > hn))
1291+ then throw("Use decreasePosition to decrease position size")
1292+ else throw("Close position first")
1293+ }
1294+ let hw = hW._1
1295+ let hx = hW._2
1296+ let hy = hW._3
1297+ let hz = hW._4
1298+ let cN = hW._5
1299+ let cM = hW._6
1300+ let eB = hW._7
1301+ let eE = hW._8
1302+ let eC = hW._9
1303+ let eD = hW._10
1304+ let hA = hW._11
1305+ let hB = hW._12
1306+ let ib = (hS / 2)
1307+ let ic = (hS - ib)
1308+ let id = invoke(ap(), "addLocked", nil, [AttachedPayment(am(), gC)])
1309+ if ((id == id))
1310+ then {
1311+ let ie = invoke(ap(), "addFree", nil, [AttachedPayment(am(), ic)])
1312+ if ((ie == ie))
1313+ then {
1314+ let if = invoke(aq(), "notifyFees", [cl, hS], nil)
1315+ if ((if == if))
1316+ then {
1317+ let hC = invoke(aq(), "notifyNotional", [cl, hy], nil)
1318+ if ((hC == hC))
1319+ then ((((((gg(cl, hw, hx, hy, hz) ++ gd(ge, cl)) ++ gc(cl, hF)) ++ gt(cM, cN, eB, eE, eC, eD, hA, hB)) ++ gF(ib)) ++ gE((bA() + gC))) ++ gG(fL, cc))
1320+ else throw("Strict value is not equal to itself.")
1321+ }
10201322 else throw("Strict value is not equal to itself.")
10211323 }
10221324 else throw("Strict value is not equal to itself.")
10271329 }
10281330 else throw("Strict value is not equal to itself.")
10291331 }
1030- else gu
1031- if ((gv == gv))
1032- then {
1033- let gB = invoke(an(), "acceptPaymentWithLink", [bT, go], [AttachedPayment(ah(), gv)])
1034- if ((gB == gB))
1332+ }
1333+ else throw("Strict value is not equal to itself.")
1334+ }
1335+
1336+
1337+
1338+@Callable(cc)
1339+func addMargin () = {
1340+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1341+ if ((hg == hg))
1342+ then {
1343+ let cl = toString(cc.caller)
1344+ let hE = cc.payments[0].amount
1345+ let ay = cc.payments[0].assetId
1346+ let hF = toBase58String(value(ay))
1347+ let hG = (ay == am())
1348+ let hH = ax(hF)
1349+ if (if (if (if (if (if (if (!(hG))
1350+ then !(hH)
1351+ else false)
1352+ then true
1353+ else !(cs(toString(cc.caller))))
1354+ then true
1355+ else !(gK(cl, hF)))
1356+ then true
1357+ else !(ct()))
1358+ then true
1359+ else cu())
1360+ then true
1361+ else cv())
1362+ then throw("Invalid addMargin parameters")
1363+ else {
1364+ let ig = gQ(cl, gV(cc))
1365+ let fK = ig._1
1366+ let fL = ig._2
1367+ let hJ = aR(hE, fK)
1368+ let gC = (hE - hJ)
1369+ let hK = if (hH)
10351370 then {
1036- let gC = {
1037- let bV = gB
1038- if ($isInstanceOf(bV, "Int"))
1039- then {
1040- let gD = bV
1041- gD
1371+ let hL = invoke(au(), "borrow", [cl], [AttachedPayment(ay, gC)])
1372+ if ((hL == hL))
1373+ then {
1374+ let hM = assetBalance(this, am())
1375+ if ((hM == hM))
1376+ then {
1377+ let hN = invoke(av(), "swap", [toBase58String(am()), 0], [AttachedPayment(ay, hJ)])
1378+ if ((hN == hN))
1379+ then {
1380+ let hO = assetBalance(this, am())
1381+ if ((hO == hO))
1382+ then {
1383+ let hP = (hO - hM)
1384+ if ((hP == hP))
1385+ then hP
1386+ else throw("Strict value is not equal to itself.")
1387+ }
1388+ else throw("Strict value is not equal to itself.")
1389+ }
1390+ else throw("Strict value is not equal to itself.")
1391+ }
1392+ else throw("Strict value is not equal to itself.")
1393+ }
1394+ else throw("Strict value is not equal to itself.")
1395+ }
1396+ else hJ
1397+ if ((hK == hK))
1398+ then {
1399+ let hQ = invoke(as(), "acceptPayment", [cl], [AttachedPayment(am(), hK)])
1400+ if ((hQ == hQ))
1401+ then {
1402+ let hR = {
1403+ let cn = hQ
1404+ if ($isInstanceOf(cn, "Int"))
1405+ then {
1406+ let gT = cn
1407+ gT
1408+ }
1409+ else throw("Invalid referrerFee")
10421410 }
1043- else throw("Invalid referrerFee")
1044- }
1045- let gE = (gv - gC)
1046- let gF = bS(bT)
1047- let fE = gF._1
1048- let fV = gF._2
1049- let fW = gF._3
1050- let fX = gF._4
1051- let gG = (fE == 0)
1052- let gH = if ((fE > 0))
1053- then (fY == ay)
1054- else (fY == az)
1055- let gI = if (!(gG))
1056- then gH
1057- else false
1058- let fZ = (fY == ay)
1059- let gJ = if (if (gG)
1060- then true
1061- else gI)
1062- then {
1063- let ga = aM(fx, fS)
1064- let gK = cj(fZ, ga)
1065- let cp = gK._1
1066- let cm = gK._2
1067- let cn = gK._3
1068- let dW = gK._4
1069- let dX = gK._5
1070- if (if ((fT != 0))
1071- then (fT > aN(cp))
1072- else false)
1073- then throw(((("Limit error: " + toString(aN(cp))) + " < ") + toString(fT)))
1074- else {
1075- let gj = (fE + cp)
1076- let gL = aK(ga, fS)
1077- let gM = cA(fE, fV, fX, gL)
1078- let cJ = gM._1
1079- let do = gM._2
1080- let dp = gM._3
1081- if (!(cZ(cm, cn)))
1082- then throw("Over max spread limit")
1083- else $Tuple11(gj, cJ, (fW + ga), bQ(gj), cn, cm, dW, dX, (bu() + ga), (bI() + (if ((gj > 0))
1084- then aN(cp)
1085- else 0)), (bH() + (if ((0 > gj))
1086- then aN(cp)
1087- else 0)))
1088- }
1089- }
1090- else {
1091- let ga = aM(fx, fS)
1092- let gN = du(toString(bK.caller), aG)
1093- let gc = gN._1
1094- let dt = gN._2
1095- if ((gc > ga))
1096- then throw("Use decreasePosition to decrease position size")
1097- else throw("Close position first")
1098- }
1099- let gj = gJ._1
1100- let gk = gJ._2
1101- let gl = gJ._3
1102- let gm = gJ._4
1103- let cn = gJ._5
1104- let cm = gJ._6
1105- let dW = gJ._7
1106- let dX = gJ._8
1107- let ea = gJ._9
1108- let dY = gJ._10
1109- let dZ = gJ._11
1110- let gO = (gE / 2)
1111- let gP = (gE - gO)
1112- let gQ = invoke(ao(), "deposit", nil, [AttachedPayment(ah(), fx)])
1113- if ((gQ == gQ))
1114- then {
1115- let gR = invoke(ak(), "deposit", nil, [AttachedPayment(ah(), gP)])
1116- if ((gR == gR))
1411+ let hS = (hK - hR)
1412+ let ih = ck(cl)
1413+ let gJ = ih._1
1414+ let hi = ih._2
1415+ let hj = ih._3
1416+ let hk = ih._4
1417+ let ib = (hS / 2)
1418+ let ic = (hS - ib)
1419+ let id = invoke(ap(), "addLocked", nil, [AttachedPayment(am(), gC)])
1420+ if ((id == id))
11171421 then {
1118- let gS = invoke(al(), "notifyFees", [bT, gE], nil)
1119- if ((gS == gS))
1422+ let ie = invoke(ap(), "addFree", nil, [AttachedPayment(am(), ic)])
1423+ if ((ie == ie))
11201424 then {
1121- let gn = invoke(al(), "notifyNotional", [bT, gl], nil)
1122- if ((gn == gn))
1123- then (((((fd(bT, gj, gk, gl, gm) ++ fc(bT, gq)) ++ fp(cm, cn, dW, dX, ea, dY, dZ)) ++ fA(gO)) ++ fz((bn() + fx))) ++ fB(eL, bK))
1425+ let if = invoke(aq(), "notifyFees", [cl, hS], nil)
1426+ if ((if == if))
1427+ then (((gg(cl, gJ, (hi + gC), hj, hk) ++ gF(ib)) ++ gE((bA() + gC))) ++ gG(fL, cc))
11241428 else throw("Strict value is not equal to itself.")
11251429 }
11261430 else throw("Strict value is not equal to itself.")
11311435 }
11321436 else throw("Strict value is not equal to itself.")
11331437 }
1134- else throw("Strict value is not equal to itself.")
11351438 }
1439+ else throw("Strict value is not equal to itself.")
11361440 }
11371441
11381442
11391443
1140-@Callable(bK)
1141-func addMargin () = {
1142- let bT = toString(bK.caller)
1143- let gp = bK.payments[0].amount
1144- let au = bK.payments[0].assetId
1145- let gq = toBase58String(value(au))
1146- let gr = (au == ah())
1147- let gs = at(gq)
1148- if (if (if (if (if (if (!(gr))
1149- then !(gs)
1150- else false)
1151- then true
1152- else !(ca(toString(bK.caller))))
1153- then true
1154- else !(fF(bT, gq)))
1155- then true
1156- else !(cb()))
1157- then true
1158- else cc())
1159- then throw("Invalid addMargin parameters")
1160- else {
1161- let gT = eE(bK)
1162- let eK = gT._1
1163- let eL = gT._2
1164- let gu = aM(gp, eK)
1165- let fx = (gp - gu)
1166- let gv = if (gs)
1167- then {
1168- let gw = invoke(aq(), "borrow", [bT], [AttachedPayment(au, fx)])
1169- if ((gw == gw))
1170- then {
1171- let gx = assetBalance(this, ah())
1172- if ((gx == gx))
1173- then {
1174- let gy = invoke(ar(), "swap", [toBase58String(ah()), 0], [AttachedPayment(au, gu)])
1175- if ((gy == gy))
1444+@Callable(cc)
1445+func removeMargin (gC) = {
1446+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1447+ if ((hg == hg))
1448+ then {
1449+ let cl = toString(cc.caller)
1450+ if (if (if (if ((0 >= gC))
1451+ then true
1452+ else !(cs(cl)))
1453+ then true
1454+ else !(ct()))
1455+ then true
1456+ else cu())
1457+ then throw("Invalid removeMargin parameters")
1458+ else {
1459+ let ii = ck(cl)
1460+ let gJ = ii._1
1461+ let hi = ii._2
1462+ let hj = ii._3
1463+ let hk = ii._4
1464+ let ij = -(gC)
1465+ let ik = cZ(gJ, hi, hk, ij)
1466+ let di = ik._1
1467+ let dj = ik._2
1468+ if ((dj != 0))
1469+ then throw("Invalid removed margin amount")
1470+ else {
1471+ let il = ee(di, dj, hj)
1472+ if (!(cd(il, bC(), true)))
1473+ then throw(((("Too much margin removed: " + toString(il)) + " < ") + toString(bC())))
1474+ else {
1475+ let im = toBase58String(am())
1476+ let in = gN(cl)
1477+ let io = in._1
1478+ let ip = in._2
1479+ let iq = if ((gC > io))
1480+ then io
1481+ else gC
1482+ let ir = if ((io > gC))
1483+ then 0
1484+ else (gC - io)
1485+ let is = (io - iq)
1486+ let it = if ((is > 0))
1487+ then nil
1488+ else gc(cl, im)
1489+ let iu = if (((iq + ir) != gC))
1490+ then throw(((((("toRepay=" + toString(iq)) + " + toWithdraw=") + toString(ir)) + " != ") + toString(gC)))
1491+ else nil
1492+ if ((iu == iu))
11761493 then {
1177- let gz = assetBalance(this, ah())
1178- if ((gz == gz))
1494+ let iv = invoke(ap(), "withdrawLocked", [gC], nil)
1495+ if ((iv == iv))
11791496 then {
1180- let gA = (gz - gx)
1181- if ((gA == gA))
1182- then gA
1497+ let iw = if ((iq > 0))
1498+ then {
1499+ let ix = invoke(au(), "repay", [cl, ip], [AttachedPayment(am(), iq)])
1500+ if ((ix == ix))
1501+ then [ScriptTransfer(cc.caller, iq, fromBase58String(ip))]
1502+ else throw("Strict value is not equal to itself.")
1503+ }
1504+ else nil
1505+ if ((iw == iw))
1506+ then ((((gg(cl, gJ, di, hj, ci(gJ)) ++ (if ((ir > 0))
1507+ then gB(cc.caller, ir)
1508+ else nil)) ++ gE((bA() - gC))) ++ it) ++ iw)
11831509 else throw("Strict value is not equal to itself.")
11841510 }
11851511 else throw("Strict value is not equal to itself.")
11861512 }
11871513 else throw("Strict value is not equal to itself.")
11881514 }
1189- else throw("Strict value is not equal to itself.")
11901515 }
1191- else throw("Strict value is not equal to itself.")
11921516 }
1193- else gu
1194- if ((gv == gv))
1195- then {
1196- let gB = invoke(an(), "acceptPayment", [bT], [AttachedPayment(ah(), gv)])
1197- if ((gB == gB))
1198- then {
1199- let gC = {
1200- let bV = gB
1201- if ($isInstanceOf(bV, "Int"))
1202- then {
1203- let gD = bV
1204- gD
1205- }
1206- else throw("Invalid referrerFee")
1207- }
1208- let gE = (gv - gC)
1209- let gU = bS(bT)
1210- let fE = gU._1
1211- let fV = gU._2
1212- let fW = gU._3
1213- let fX = gU._4
1214- let gO = (gE / 2)
1215- let gP = (gE - gO)
1216- let gQ = invoke(ao(), "deposit", nil, [AttachedPayment(ah(), fx)])
1217- if ((gQ == gQ))
1218- then {
1219- let gR = invoke(ak(), "deposit", nil, [AttachedPayment(ah(), gP)])
1220- if ((gR == gR))
1221- then {
1222- let gS = invoke(al(), "notifyFees", [bT, gE], nil)
1223- if ((gS == gS))
1224- then (((fd(bT, fE, (fV + fx), fW, fX) ++ fA(gO)) ++ fz((bn() + fx))) ++ fB(eL, bK))
1225- else throw("Strict value is not equal to itself.")
1226- }
1227- else throw("Strict value is not equal to itself.")
1228- }
1229- else throw("Strict value is not equal to itself.")
1230- }
1231- else throw("Strict value is not equal to itself.")
1232- }
1233- else throw("Strict value is not equal to itself.")
12341517 }
1518+ else throw("Strict value is not equal to itself.")
12351519 }
12361520
12371521
12381522
1239-@Callable(bK)
1240-func removeMargin (fx) = {
1241- let bT = toString(bK.caller)
1242- if (if (if (if ((0 >= fx))
1243- then true
1244- else !(ca(bT)))
1245- then true
1246- else !(cb()))
1247- then true
1248- else cc())
1249- then throw("Invalid removeMargin parameters")
1250- else {
1251- let gV = bS(bT)
1252- let fE = gV._1
1253- let fV = gV._2
1254- let fW = gV._3
1255- let fX = gV._4
1256- let gW = -(fx)
1257- let gX = cA(fE, fV, fX, gW)
1258- let cJ = gX._1
1259- let cK = gX._2
1260- if ((cK != 0))
1261- then throw("Invalid removed margin amount")
1523+@Callable(cc)
1524+func closePosition (gh,iy) = {
1525+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1526+ if ((hg == hg))
1527+ then {
1528+ let cl = cb(cc)
1529+ let iz = valueOrErrorMessage(addressFromString(cl), "Invalid caller")
1530+ if (if (if (if (if (!(cs(cl)))
1531+ then true
1532+ else !(ct()))
1533+ then true
1534+ else cu())
1535+ then true
1536+ else (0 >= gh))
1537+ then true
1538+ else (0 > iy))
1539+ then throw("Invalid closePosition parameters")
12621540 else {
1263- let gY = dz(cJ, cK, fW)
1264- if (!(bL(gY, bp(), true)))
1265- then throw(((("Too much margin removed: " + toString(gY)) + " < ") + toString(bp())))
1541+ let iA = ck(cl)
1542+ let gJ = iA._1
1543+ let hi = iA._2
1544+ let hj = iA._3
1545+ let hk = iA._4
1546+ let iB = if ((aY(gJ) > gh))
1547+ then {
1548+ let hl = if ((gJ > 0))
1549+ then aD
1550+ else aC
1551+ let hm = (hl == aC)
1552+ let iC = du((gJ > 0), gh, true)
1553+ let eu = iC._1
1554+ let cM = iC._2
1555+ let cN = iC._3
1556+ let eB = iC._4
1557+ let et = if ((gJ > 0))
1558+ then -(gh)
1559+ else gh
1560+ let iD = dZ(cl, aL)
1561+ let hp = iD._1
1562+ let dY = iD._2
1563+ let iE = aP(aY(et), aY(gJ))
1564+ let ey = aR(dY, iE)
1565+ let iF = cZ(gJ, hi, hk, ey)
1566+ let di = iF._1
1567+ let iG = iF._2
1568+ let de = iF._3
1569+ let hu = (dY - ey)
1570+ let hv = if ((gJ > 0))
1571+ then ((hp - eu) - hu)
1572+ else ((hu + hp) - eu)
1573+ let iH = aR(di, iE)
1574+ let hw = (gJ + et)
1575+ let hy = aY(hv)
1576+ let iI = ci(hw)
1577+ let eE = (bI() - eu)
1578+ if (if ((iy != 0))
1579+ then (iy > eu)
1580+ else false)
1581+ then throw(((("Limit error: " + toString(eu)) + " < ") + toString(iy)))
1582+ else $Tuple15(hw, iH, hy, iI, iG, ey, (aY((di - iH)) + ey), cM, cN, eB, eE, (bZ() - (if ((hw > 0))
1583+ then aY(et)
1584+ else 0)), (bY() - (if ((0 > hw))
1585+ then aY(et)
1586+ else 0)), (bK() - (if ((hw > 0))
1587+ then eu
1588+ else 0)), (bJ() - (if ((0 > hw))
1589+ then eu
1590+ else 0)))
1591+ }
1592+ else if ((gh > aY(gJ)))
1593+ then throw("Invalid closePosition parameters")
1594+ else {
1595+ let iJ = ev(cl, true)
1596+ let eu = iJ._1
1597+ let iG = iJ._2
1598+ let ey = iJ._3
1599+ let ez = iJ._4
1600+ let cM = iJ._5
1601+ let cN = iJ._6
1602+ let eB = iJ._7
1603+ let eE = iJ._8
1604+ let dU = iJ._9
1605+ let eC = iJ._10
1606+ let eD = iJ._11
1607+ let hA = iJ._12
1608+ let hB = iJ._13
1609+ if (if ((iy != 0))
1610+ then (iy > eu)
1611+ else false)
1612+ then throw(((("Limit error: " + toString(eu)) + " < ") + toString(iy)))
1613+ else $Tuple15(0, 0, 0, 0, iG, ey, ez, cM, cN, eB, eE, eC, eD, hA, hB)
1614+ }
1615+ let hw = iB._1
1616+ let iH = iB._2
1617+ let hy = iB._3
1618+ let iI = iB._4
1619+ let iG = iB._5
1620+ let ey = iB._6
1621+ let ez = iB._7
1622+ let cM = iB._8
1623+ let cN = iB._9
1624+ let eB = iB._10
1625+ let eE = iB._11
1626+ let eC = iB._12
1627+ let eD = iB._13
1628+ let hA = iB._14
1629+ let hB = iB._15
1630+ if ((iG > 0))
1631+ then throw("Unable to close position with bad debt")
12661632 else {
1267- let gZ = toBase58String(ah())
1268- let ha = fI(bT)
1269- let hb = ha._1
1270- let hc = ha._2
1271- let hd = if ((fx > hb))
1272- then hb
1273- else fx
1274- let he = if ((hb > fx))
1275- then 0
1276- else (fx - hb)
1277- let hf = (hb - hd)
1278- let hg = if ((hf > 0))
1279- then nil
1280- else fc(bT, gZ)
1281- let hh = if (((hd + he) != fx))
1282- then throw(((((("toRepay=" + toString(hd)) + " + toWithdraw=") + toString(he)) + " != ") + toString(fx)))
1283- else nil
1284- if ((hh == hh))
1633+ let iK = aY(ez)
1634+ let iL = (bA() - iK)
1635+ let iM = if ((0 > iL))
1636+ then $Tuple2(0, aY(iL))
1637+ else $Tuple2(iL, 0)
1638+ let iN = iM._1
1639+ let iO = iM._2
1640+ let iP = invoke(ap(), "withdrawLocked", [iK], nil)
1641+ if ((iP == iP))
12851642 then {
1286- let hi = invoke(ao(), "withdraw", [gZ, fx], nil)
1287- if ((hi == hi))
1643+ let iQ = gN(cl)
1644+ let io = iQ._1
1645+ let ip = iQ._2
1646+ let iR = if ((io > 0))
1647+ then if ((iK >= io))
1648+ then {
1649+ let ix = invoke(au(), "repay", [cl, ip], [AttachedPayment(am(), io)])
1650+ if ((ix == ix))
1651+ then $Tuple2([ScriptTransfer(iz, io, fromBase58String(ip))], (iK - io))
1652+ else throw("Strict value is not equal to itself.")
1653+ }
1654+ else {
1655+ let iS = invoke(au(), "realizePartiallyAndClose", [cl, ip], [AttachedPayment(am(), iK)])
1656+ if ((iS == iS))
1657+ then $Tuple2([ScriptTransfer(iz, iK, fromBase58String(ip))], 0)
1658+ else throw("Strict value is not equal to itself.")
1659+ }
1660+ else $Tuple2(nil, iK)
1661+ if ((iR == iR))
12881662 then {
1289- let hj = if ((hd > 0))
1290- then {
1291- let hk = invoke(aq(), "repay", [bT, hc], [AttachedPayment(ah(), hd)])
1292- if ((hk == hk))
1293- then [ScriptTransfer(bK.caller, hd, fromBase58String(hc))]
1294- else throw("Strict value is not equal to itself.")
1295- }
1296- else nil
1297- if ((hj == hj))
1298- then (fd(bT, fE, cJ, fW, bQ(fE)) ++ (if ((he > 0))
1299- then fw(bK.caller, he)
1300- else (((nil ++ fz((bn() - fx))) ++ hg) ++ hj)))
1663+ let iT = iR._2
1664+ let iU = iR._1
1665+ let hC = invoke(aq(), "notifyNotional", [cl, 0], nil)
1666+ if ((hC == hC))
1667+ then (((((if ((hw == 0))
1668+ then gA(cl)
1669+ else gg(cl, hw, iH, hy, iI)) ++ gt(cM, cN, eB, eE, eC, eD, hA, hB)) ++ (if ((iT > 0))
1670+ then gB(iz, iT)
1671+ else nil)) ++ gE(iN)) ++ iU)
13011672 else throw("Strict value is not equal to itself.")
13021673 }
13031674 else throw("Strict value is not equal to itself.")
13061677 }
13071678 }
13081679 }
1680+ else throw("Strict value is not equal to itself.")
13091681 }
13101682
13111683
13121684
1313-@Callable(bK)
1314-func closePosition () = {
1315- let bT = bJ(bK)
1316- let hl = valueOrErrorMessage(addressFromString(bT), "Invalid caller")
1317- if (if (if (!(ca(bT)))
1318- then true
1319- else !(cb()))
1320- then true
1321- else cc())
1322- then throw("Invalid closePosition parameters")
1323- else {
1324- let hm = dQ(bT, true)
1325- let do = hm._1
1326- let hn = hm._2
1327- let dT = hm._3
1328- let dU = hm._4
1329- let cm = hm._5
1330- let cn = hm._6
1331- let dW = hm._7
1332- let dX = hm._8
1333- let ea = hm._9
1334- let dp = hm._10
1335- let dY = hm._11
1336- let dZ = hm._12
1337- if ((hn > 0))
1338- then throw("Unable to close position with bad debt")
1339- else {
1340- let ho = aN(dU)
1341- let hp = (bn() - ho)
1342- let hq = if ((0 > hp))
1343- then $Tuple2(0, aN(hp))
1344- else $Tuple2(hp, 0)
1345- let hr = hq._1
1346- let hs = hq._2
1347- let gD = if ((hs > 0))
1348- then {
1349- let ht = invoke(ak(), "withdraw", [hs], nil)
1350- if ((ht == ht))
1351- then nil
1352- else throw("Strict value is not equal to itself.")
1353- }
1354- else nil
1355- if ((gD == gD))
1356- then {
1357- let hu = invoke(ao(), "withdraw", [toBase58String(ah()), (ho - hs)], nil)
1358- if ((hu == hu))
1359- then {
1360- let hv = fI(bT)
1361- let hb = hv._1
1362- let hc = hv._2
1363- let hw = if ((hb > 0))
1364- then if ((ho >= hb))
1365- then {
1366- let hk = invoke(aq(), "repay", [bT, hc], [AttachedPayment(ah(), hb)])
1367- if ((hk == hk))
1368- then $Tuple2([ScriptTransfer(hl, hb, fromBase58String(hc))], (ho - hb))
1369- else throw("Strict value is not equal to itself.")
1370- }
1371- else {
1372- let hx = invoke(aq(), "realizePartiallyAndClose", [bT, hc], [AttachedPayment(ah(), ho)])
1373- if ((hx == hx))
1374- then $Tuple2([ScriptTransfer(hl, ho, fromBase58String(hc))], 0)
1375- else throw("Strict value is not equal to itself.")
1376- }
1377- else $Tuple2(nil, ho)
1378- if ((hw == hw))
1379- then {
1380- let hy = hw._2
1381- let hz = hw._1
1382- let gn = invoke(al(), "notifyNotional", [bT, 0], nil)
1383- if ((gn == gn))
1384- then ((fv(bT) ++ fp(cm, cn, dW, dX, ea, dY, dZ)) ++ (if ((hy > 0))
1385- then fw(hl, hy)
1386- else ((nil ++ fz(hr)) ++ hz)))
1387- else throw("Strict value is not equal to itself.")
1388- }
1389- else throw("Strict value is not equal to itself.")
1390- }
1391- else throw("Strict value is not equal to itself.")
1392- }
1393- else throw("Strict value is not equal to itself.")
1685+@Callable(cc)
1686+func liquidate (cl) = {
1687+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1688+ if ((hg == hg))
1689+ then {
1690+ let iV = ei(cl, aL)
1691+ let il = if (dK())
1692+ then {
1693+ let iW = ei(cl, aM)
1694+ aZ(iV, iW)
13941695 }
1395- }
1396- }
1397-
1398-
1399-
1400-@Callable(bK)
1401-func liquidate (bT) = {
1402- let hA = dD(bT, aG)
1403- let gY = if (df())
1404- then {
1405- let hB = dD(bT, aH)
1406- aO(hA, hB)
1407- }
1408- else hA
1409- if (if (if (if (!(bL(gY, bz(), false)))
1410- then true
1411- else !(ca(bT)))
1412- then true
1413- else !(cb()))
1414- then true
1415- else cc())
1416- then throw("Unable to liquidate")
1417- else if (if (if ((hA > bA()))
1418- then (bB() > 0)
1419- else false)
1420- then (aD > bB())
1421- else false)
1422- then {
1423- let hC = bS(bT)
1424- let fE = hC._1
1425- let fV = hC._2
1426- let fW = hC._3
1427- let fX = hC._4
1428- let fY = if ((fE > 0))
1429- then az
1430- else ay
1431- let fZ = (fY == ay)
1432- let dP = dJ(bT, fE)
1433- let hD = du(bT, aG)
1434- let gc = hD._1
1435- let dt = hD._2
1436- let hE = cj(fZ, dP)
1437- let dO = hE._1
1438- let cm = hE._2
1439- let cn = hE._3
1440- let dW = hE._4
1441- let dX = hE._5
1442- let hF = aK(aN(dO), aN(fE))
1443- let dT = aM(dt, hF)
1444- let hG = cA(fE, fV, fX, dT)
1445- let cJ = hG._1
1446- let cK = hG._2
1447- let cF = hG._3
1448- let gh = (dt - dT)
1449- let gi = if ((fE > 0))
1450- then ((gc - dP) - gh)
1451- else ((gh + gc) - dP)
1452- let hH = aM(dP, bA())
1453- let hI = (hH / 2)
1454- let gP = (hH - hI)
1455- let hJ = (cJ - hH)
1456- let gj = (fE + dO)
1457- let gl = aN(gi)
1458- let hK = bQ(gj)
1459- let ea = (bu() - dP)
1460- let hp = (bn() - hH)
1461- let hL = if ((0 > hp))
1462- then $Tuple2(0, aN(hp))
1463- else $Tuple2(hp, 0)
1464- let hM = hL._1
1465- let hN = hL._2
1466- let hO = fI(bT)
1467- let hb = hO._1
1468- let hc = hO._2
1469- let hP = if ((hb > 0))
1696+ else iV
1697+ if (if (if (if (!(cd(il, bP(), false)))
1698+ then true
1699+ else !(cs(cl)))
1700+ then true
1701+ else !(ct()))
1702+ then true
1703+ else cu())
1704+ then throw("Unable to liquidate")
1705+ else if (if (if ((iV > bQ()))
1706+ then (bR() > 0)
1707+ else false)
1708+ then (aI > bR())
1709+ else false)
14701710 then {
1471- let hQ = aM(hb, hF)
1472- let hx = invoke(aq(), "realizePartially", [bT, hc, hQ], nil)
1473- if ((hx == hx))
1474- then nil
1475- else throw("Strict value is not equal to itself.")
1476- }
1477- else nil
1478- if ((hP == hP))
1479- then {
1480- let gD = if ((hN > 0))
1711+ let iX = ck(cl)
1712+ let gJ = iX._1
1713+ let hi = iX._2
1714+ let hj = iX._3
1715+ let hk = iX._4
1716+ let hl = if ((gJ > 0))
1717+ then aD
1718+ else aC
1719+ let hm = (hl == aC)
1720+ let eu = eo(cl, gJ)
1721+ let iY = dZ(cl, aL)
1722+ let hp = iY._1
1723+ let dY = iY._2
1724+ let iZ = cL(hm, eu)
1725+ let et = iZ._1
1726+ let cM = iZ._2
1727+ let cN = iZ._3
1728+ let eB = iZ._4
1729+ let ja = aP(aY(et), aY(gJ))
1730+ let ey = aR(dY, ja)
1731+ let jb = cZ(gJ, hi, hk, ey)
1732+ let di = jb._1
1733+ let dj = jb._2
1734+ let de = jb._3
1735+ let hu = (dY - ey)
1736+ let hv = if ((gJ > 0))
1737+ then ((hp - eu) - hu)
1738+ else ((hu + hp) - eu)
1739+ let jc = aR(eu, bQ())
1740+ let jd = (jc / 2)
1741+ let ic = (jc - jd)
1742+ let iH = (di - jc)
1743+ let hw = (gJ + et)
1744+ let hy = aY(hv)
1745+ let iI = ci(hw)
1746+ let eE = (bI() - eu)
1747+ let iL = (bA() - jc)
1748+ let je = if ((0 > iL))
1749+ then $Tuple2(0, aY(iL))
1750+ else $Tuple2(iL, 0)
1751+ let jf = je._1
1752+ let iO = je._2
1753+ let jg = gN(cl)
1754+ let io = jg._1
1755+ let ip = jg._2
1756+ let jh = if ((io > 0))
14811757 then {
1482- let ht = invoke(ak(), "withdraw", [hN], nil)
1483- if ((ht == ht))
1758+ let ji = aR(io, ja)
1759+ let iS = invoke(au(), "realizePartially", [cl, ip, ji], nil)
1760+ if ((iS == iS))
14841761 then nil
14851762 else throw("Strict value is not equal to itself.")
14861763 }
14871764 else nil
1488- if ((gD == gD))
1765+ if ((jh == jh))
14891766 then {
1490- let hu = invoke(ao(), "withdraw", [toBase58String(ah()), (hH - hN)], nil)
1491- if ((hu == hu))
1767+ let iP = invoke(ap(), "withdrawLocked", [jc], nil)
1768+ if ((iP == iP))
14921769 then {
1493- let gR = invoke(ak(), "deposit", nil, [AttachedPayment(ah(), gP)])
1494- if ((gR == gR))
1770+ let ie = invoke(ap(), "addFree", nil, [AttachedPayment(am(), ic)])
1771+ if ((ie == ie))
14951772 then {
1496- let gn = invoke(al(), "notifyNotional", [bT, gl], nil)
1497- if ((gn == gn))
1498- then (((fd(bT, gj, hJ, gl, hK) ++ fp(cm, cn, dW, dX, ea, (bI() - (if ((gj > 0))
1499- then aN(dO)
1500- else 0)), (bH() - (if ((0 > gj))
1501- then aN(dO)
1502- else 0)))) ++ fw(bK.caller, hI)) ++ fz(hM))
1773+ let hC = invoke(aq(), "notifyNotional", [cl, hy], nil)
1774+ if ((hC == hC))
1775+ then (((gg(cl, hw, iH, hy, iI) ++ gt(cM, cN, eB, eE, (bZ() - (if ((hw > 0))
1776+ then aY(et)
1777+ else 0)), (bY() - (if ((0 > hw))
1778+ then aY(et)
1779+ else 0)), (bK() - (if ((hw > 0))
1780+ then eu
1781+ else 0)), (bJ() - (if ((0 > hw))
1782+ then eu
1783+ else 0)))) ++ gB(cc.caller, jd)) ++ gE(jf))
15031784 else throw("Strict value is not equal to itself.")
15041785 }
15051786 else throw("Strict value is not equal to itself.")
15081789 }
15091790 else throw("Strict value is not equal to itself.")
15101791 }
1511- else throw("Strict value is not equal to itself.")
1512- }
1513- else {
1514- let hR = dQ(bT, false)
1515- let do = hR._1
1516- let cK = hR._2
1517- let dp = hR._3
1518- let dq = hR._4
1519- let cm = hR._5
1520- let cn = hR._6
1521- let dW = hR._7
1522- let dX = hR._8
1523- let ea = hR._9
1524- let dP = hR._10
1525- let dY = hR._11
1526- let dZ = hR._12
1527- let hH = aM(dP, bA())
1528- let hI = (hH / 2)
1529- let gP = (hH - hI)
1530- let hp = (bn() - hH)
1531- let hS = if ((0 > hp))
1532- then $Tuple2(0, aN(hp))
1533- else $Tuple2(hp, 0)
1534- let hM = hS._1
1535- let hN = hS._2
1536- let hT = fI(bT)
1537- let hb = hT._1
1538- let hc = hT._2
1539- let hP = if ((hb > 0))
1540- then {
1541- let hx = invoke(aq(), "realizePartiallyAndClose", [bT, hc], nil)
1542- if ((hx == hx))
1543- then nil
1544- else throw("Strict value is not equal to itself.")
1545- }
1546- else nil
1547- if ((hP == hP))
1548- then {
1549- let gD = if ((hN > 0))
1792+ else {
1793+ let jj = ev(cl, false)
1794+ let dT = jj._1
1795+ let dj = jj._2
1796+ let dU = jj._3
1797+ let dV = jj._4
1798+ let cM = jj._5
1799+ let cN = jj._6
1800+ let eB = jj._7
1801+ let eE = jj._8
1802+ let eu = jj._9
1803+ let eC = jj._10
1804+ let eD = jj._11
1805+ let hA = jj._12
1806+ let hB = jj._13
1807+ let jc = aR(eu, bQ())
1808+ let jd = (jc / 2)
1809+ let ic = (jc - jd)
1810+ let iL = (bA() - jc)
1811+ let jk = if ((0 > iL))
1812+ then $Tuple2(0, aY(iL))
1813+ else $Tuple2(iL, 0)
1814+ let jf = jk._1
1815+ let iO = jk._2
1816+ let jl = gN(cl)
1817+ let io = jl._1
1818+ let ip = jl._2
1819+ let jh = if ((io > 0))
15501820 then {
1551- let ht = invoke(ak(), "withdraw", [hN], nil)
1552- if ((ht == ht))
1821+ let iS = invoke(au(), "realizePartiallyAndClose", [cl, ip], nil)
1822+ if ((iS == iS))
15531823 then nil
15541824 else throw("Strict value is not equal to itself.")
15551825 }
15561826 else nil
1557- if ((gD == gD))
1827+ if ((jh == jh))
15581828 then {
1559- let hu = invoke(ao(), "withdraw", [toBase58String(ah()), (hH - hN)], nil)
1560- if ((hu == hu))
1829+ let gT = if ((dj > 0))
15611830 then {
1562- let gR = invoke(ak(), "deposit", nil, [AttachedPayment(ah(), gP)])
1563- if ((gR == gR))
1831+ let jm = invoke(ap(), "exchangeFreeAndLocked", [dj], nil)
1832+ if ((jm == jm))
1833+ then nil
1834+ else throw("Strict value is not equal to itself.")
1835+ }
1836+ else nil
1837+ if ((gT == gT))
1838+ then {
1839+ let iP = invoke(ap(), "withdrawLocked", [jc], nil)
1840+ if ((iP == iP))
15641841 then {
1565- let gn = invoke(al(), "notifyNotional", [bT, 0], nil)
1566- if ((gn == gn))
1567- then (((fv(bT) ++ fp(cm, cn, dW, dX, ea, dY, dZ)) ++ fw(bK.caller, hI)) ++ fz(hM))
1842+ let ie = invoke(ap(), "addFree", nil, [AttachedPayment(am(), ic)])
1843+ if ((ie == ie))
1844+ then {
1845+ let hC = invoke(aq(), "notifyNotional", [cl, 0], nil)
1846+ if ((hC == hC))
1847+ then (((gA(cl) ++ gt(cM, cN, eB, eE, eC, eD, hA, hB)) ++ gB(cc.caller, jd)) ++ gE(jf))
1848+ else throw("Strict value is not equal to itself.")
1849+ }
15681850 else throw("Strict value is not equal to itself.")
15691851 }
15701852 else throw("Strict value is not equal to itself.")
15731855 }
15741856 else throw("Strict value is not equal to itself.")
15751857 }
1576- else throw("Strict value is not equal to itself.")
1577- }
1858+ }
1859+ else throw("Strict value is not equal to itself.")
15781860 }
15791861
15801862
15811863
1582-@Callable(bK)
1864+@Callable(cc)
15831865 func payFunding () = {
1584- let hU = bv()
1585- if (if (if ((hU > lastBlock.timestamp))
1866+ let jn = bL()
1867+ if (if (if ((jn > lastBlock.timestamp))
15861868 then true
1587- else !(cb()))
1869+ else !(ct()))
15881870 then true
1589- else cc())
1590- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(hU)))
1871+ else cu())
1872+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(jn)))
15911873 else {
1592- let ez = cU()
1593- let hV = ey()
1594- let eC = hV._1
1595- let eD = hV._2
1596- eW((hU + by()), (bF() + eD), (bG() + eC), aK(eD, ez), aK(eC, ez))
1874+ let fx = dv()
1875+ let jo = fw()
1876+ let fA = jo._1
1877+ let fB = jo._2
1878+ fW((jn + bO()), (bW() + fB), (bX() + fA), aP(fB, fx), aP(fA, fx))
15971879 }
15981880 }
15991881
16001882
16011883
1602-@Callable(bK)
1603-func forceMoveAsset (bT,fx) = if (if ((addressFromPublicKey(ag()) != bK.caller))
1604- then true
1605- else (0 > fx))
1606- then throw("Invalid forceMoveAsset parameters")
1607- else {
1608- let hu = invoke(ao(), "withdraw", [toBase58String(ah()), fx], nil)
1609- if ((hu == hu))
1610- then (fw(addressFromStringValue(bT), fx) ++ fz((bn() - fx)))
1611- else throw("Strict value is not equal to itself.")
1612- }
1613-
1614-
1615-
1616-@Callable(bK)
1617-func adjustPeg (es) = if (if ((addressFromPublicKey(ag()) != bK.caller))
1618- then true
1619- else (0 > es))
1620- then throw("Invalid adjustPeg parameters")
1621- else {
1622- let hW = er(es)
1623- let ew = hW._1
1624- let hX = hW._2
1625- if ((hX == 0))
1626- then throw("Nothing to adjust")
1627- else if ((hX > 0))
1628- then fo(ew, br())
1629- else {
1630- let hu = invoke(ao(), "withdraw", [toBase58String(ah()), aN(hX)], nil)
1631- if ((hu == hu))
1632- then {
1633- let gR = invoke(ak(), "deposit", nil, [AttachedPayment(ah(), aN(hX))])
1634- if ((gR == gR))
1635- then (fz((bn() - aN(hX))) ++ fo(ew, br()))
1636- else throw("Strict value is not equal to itself.")
1637- }
1638- else throw("Strict value is not equal to itself.")
1639- }
1640- }
1641-
1642-
1643-
1644-@Callable(bK)
1645-func migrateLiquidity () = {
1646- let hY = bn()
1647- if ((hY > 0))
1648- then {
1649- let hu = invoke(ai(), "unlockNeutrino", [hY, toBase58String(ah())], nil)
1650- if ((hu == hu))
1651- then {
1652- let gQ = invoke(ao(), "deposit", nil, [AttachedPayment(ah(), hY)])
1653- if ((gQ == gQ))
1654- then nil
1655- else throw("Strict value is not equal to itself.")
1656- }
1657- else throw("Strict value is not equal to itself.")
1658- }
1659- else nil
1884+@Callable(cc)
1885+func syncTerminalPriceToOracle () = {
1886+ let jp = fs(dv())
1887+ let jq = jp._1
1888+ let jr = jp._2
1889+ let ez = jp._3
1890+ let jm = invoke(ap(), "exchangeFreeAndLocked", [ez], nil)
1891+ if ((jm == jm))
1892+ then gs(jq, jr)
1893+ else throw("Strict value is not equal to itself.")
16601894 }
16611895
16621896
16631897
1664-@Callable(bK)
1665-func v_get (bT) = {
1666- let hZ = dQ(bT, false)
1667- let do = hZ._1
1668- let dp = hZ._2
1669- let dq = hZ._3
1670- let ia = hZ._4
1671- throw((((aI(dp) + aI(dq)) + aI(ia)) + aI(dI(bT))))
1898+@Callable(cc)
1899+func view_calcRemainMarginWithFundingPayment (cl) = {
1900+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1901+ if ((hg == hg))
1902+ then {
1903+ let js = ck(cl)
1904+ let co = js._1
1905+ let eb = js._2
1906+ let ek = js._3
1907+ let ed = js._4
1908+ let jt = dZ(cl, aL)
1909+ let dQ = jt._1
1910+ let dY = jt._2
1911+ let ju = cZ(co, eb, ed, dY)
1912+ let di = ju._1
1913+ let dj = ju._2
1914+ let de = ju._3
1915+ throw((((((aN(di) + aN(de)) + aN(en(cl))) + aN(dY)) + aN(dj)) + aN(dQ)))
1916+ }
1917+ else throw("Strict value is not equal to itself.")
16721918 }
16731919
16741920
16751921
1676-@Callable(bK)
1677-func view_calcRemainMarginWithFundingPayment (bT) = {
1678- let ib = bS(bT)
1679- let bW = ib._1
1680- let dw = ib._2
1681- let dF = ib._3
1682- let dy = ib._4
1683- let ic = du(bT, aG)
1684- let dl = ic._1
1685- let dt = ic._2
1686- let id = cA(bW, dw, dy, dt)
1687- let cJ = id._1
1688- let cK = id._2
1689- let cF = id._3
1690- throw((((((aI(cJ) + aI(cF)) + aI(dI(bT))) + aI(dt)) + aI(cK)) + aI(dl)))
1922+@Callable(cc)
1923+func view_getPegAdjustCost (jv) = {
1924+ let fr = fs(jv)
1925+ throw(toString(fr._3))
16911926 }
16921927
16931928
16941929
1695-@Callable(bK)
1696-func view_getPegAdjustCost (es) = {
1697- let ex = er(es)
1698- throw(toString(ex._2))
1930+@Callable(cc)
1931+func view_getTerminalAmmPrice () = {
1932+ let jw = eV()
1933+ let eZ = jw._1
1934+ let fa = jw._2
1935+ let gl = aP(aR(eZ, bF()), aR(fa, bG()))
1936+ throw(toString(gl))
16991937 }
17001938
17011939
17021940
1703-@Callable(bK)
1941+@Callable(cc)
17041942 func view_getFunding () = {
1705- let ez = cU()
1706- let ie = ey()
1707- let eC = ie._1
1708- let eD = ie._2
1709- let if = aK(eD, ez)
1710- let ig = aK(eC, ez)
1711- throw((((aI(if) + aI(ig)) + aI(eb())) + aI(cU())))
1943+ let fx = dv()
1944+ let jx = fw()
1945+ let fA = jx._1
1946+ let fB = jx._2
1947+ let jy = aP(fB, fx)
1948+ let jz = aP(fA, fx)
1949+ throw((((aN(jy) + aN(jz)) + aN(eF())) + aN(dv())))
17121950 }
17131951
17141952
17151953
1716-@Callable(bK)
1717-func view_getBorrowedByTrader (bT) = {
1718- let ih = fI(bT)
1719- let hb = ih._1
1720- let hc = ih._2
1721- throw((aI(hb) + hc))
1954+@Callable(cc)
1955+func view_getBorrowedByTrader (cl) = {
1956+ let jA = gN(cl)
1957+ let io = jA._1
1958+ let ip = jA._2
1959+ throw((aN(io) + ip))
17221960 }
17231961
17241962
1725-@Verifier(ii)
1726-func ij () = sigVerify(ii.bodyBytes, ii.proofs[0], ag())
1963+
1964+@Callable(cc)
1965+func computeSpotPrice () = {
1966+ let fr = dJ()
1967+ $Tuple2(nil, fr)
1968+ }
1969+
1970+
1971+
1972+@Callable(cc)
1973+func computeFeeForTraderWithArtifact (cl,fD) = {
1974+ let fr = gQ(cl, fD)
1975+ $Tuple2(nil, fr)
1976+ }
1977+
1978+
1979+@Verifier(jB)
1980+func jC () = sigVerify(jB.bodyBytes, jB.proofs[0], al())
17271981
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = "k_ora_key"
55
66 let b = "k_ora_block_key"
77
88 let c = "k_ora"
99
1010 let d = "k_balance"
1111
12-let e = "k_positionSize"
12+let e = "k_sequence"
1313
14-let f = "k_positionMargin"
14+let f = "k_positionSize"
1515
16-let g = "k_positionOpenNotional"
16+let g = "k_positionMargin"
1717
18-let h = "k_positionFraction"
18+let h = "k_positionOpenNotional"
1919
20-let i = "k_positionClosedDate"
20+let i = "k_positionFraction"
2121
22-let j = "k_positionAsset"
22+let j = "k_positionSequence"
2323
24-let k = "k_initialized"
24+let k = "k_positionAsset"
2525
26-let l = "k_paused"
26+let l = "k_initialized"
2727
28-let m = "k_fee"
28+let m = "k_paused"
2929
30-let n = "k_fundingPeriod"
30+let n = "k_closeOnly"
3131
32-let o = "k_initMarginRatio"
32+let o = "k_fee"
3333
34-let p = "k_mmr"
34+let p = "k_fundingPeriod"
3535
36-let q = "k_liquidationFeeRatio"
36+let q = "k_initMarginRatio"
3737
38-let r = "k_partLiquidationRatio"
38+let r = "k_mmr"
3939
40-let s = "k_spreadLimit"
40+let s = "k_liquidationFeeRatio"
4141
42-let t = "k_maxPriceImpact"
42+let t = "k_partLiquidationRatio"
4343
44-let u = "k_maxPriceSpread"
44+let u = "k_spreadLimit"
4545
46-let v = "k_lastDataStr"
46+let v = "k_maxPriceImpact"
4747
48-let w = "k_lastMinuteId"
48+let w = "k_maxPriceSpread"
4949
50-let x = "k_twapDataLastCumulativePrice"
50+let x = "k_maxOpenNotional"
5151
52-let y = "k_twapDataLastPrice"
52+let y = "k_lastDataStr"
5353
54-let z = "k_twapDataPreviousMinuteId"
54+let z = "k_lastMinuteId"
5555
56-let A = "k_latestLongPremiumFraction"
56+let A = "k_twapDataLastCumulativePrice"
5757
58-let B = "k_latestShortPremiumFraction"
58+let B = "k_twapDataLastPrice"
5959
60-let C = "k_nextFundingBlockMinTimestamp"
60+let C = "k_twapDataPreviousMinuteId"
6161
62-let D = "k_longFundingRate"
62+let D = "k_latestLongPremiumFraction"
6363
64-let E = "k_shortFundingRate"
64+let E = "k_latestShortPremiumFraction"
6565
66-let F = "k_qtAstR"
66+let F = "k_nextFundingBlockMinTimestamp"
6767
68-let G = "k_bsAstR"
68+let G = "k_longFundingRate"
6969
70-let H = "k_totalPositionSize"
70+let H = "k_shortFundingRate"
7171
72-let I = "k_totalLongPositionSize"
72+let I = "k_qtAstR"
7373
74-let J = "k_totalShortPositionSize"
74+let J = "k_bsAstR"
7575
76-let K = "k_cumulativeNotional"
76+let K = "k_qtAstW"
7777
78-let L = "k_openInterestNotional"
78+let L = "k_bsAstW"
7979
80-let M = "k_coordinatorAddress"
80+let M = "k_totalPositionSize"
8181
82-let N = "k_insurance_address"
82+let N = "k_totalLongPositionSize"
8383
84-let O = "k_admin_address"
84+let O = "k_totalShortPositionSize"
8585
86-let P = "k_admin_public_key"
86+let P = "k_openInterestNotional"
8787
88-let Q = "k_quote_asset"
88+let Q = "k_openInterestShort"
8989
90-let R = "k_quote_staking"
90+let R = "k_openInterestLong"
9191
92-let S = "k_staking_address"
92+let S = "k_coordinatorAddress"
9393
94-let T = "k_miner_address"
94+let T = "k_vault_address"
9595
96-let U = "k_orders_address"
96+let U = "k_admin_address"
9797
98-let V = "k_referral_address"
98+let V = "k_admin_public_key"
9999
100-let W = "k_manager_address"
100+let W = "k_quote_asset"
101101
102-let X = "k_collateral_address"
102+let X = "k_quote_staking"
103103
104-let Y = "k_exchange_address"
104+let Y = "k_staking_address"
105105
106-let Z = "k_nft_manager_address"
106+let Z = "k_miner_address"
107107
108-let aa = "k_trader_market_asset_collateral"
108+let aa = "k_orders_address"
109109
110-func ab (ac,ad) = ((ac + "_") + ad)
110+let ab = "k_referral_address"
111+
112+let ac = "k_collateral_address"
113+
114+let ad = "k_exchange_address"
115+
116+let ae = "k_nft_manager_address"
117+
118+let af = "k_trader_market_asset_collateral"
119+
120+func ag (ah,ai) = ((ah + "_") + ai)
111121
112122
113-func ae () = valueOrErrorMessage(addressFromString(getStringValue(this, M)), "Coordinator not set")
123+func aj () = valueOrErrorMessage(addressFromString(getStringValue(this, S)), "Coordinator not set")
114124
115125
116-func af () = addressFromString(getStringValue(ae(), O))
126+func ak () = addressFromString(getStringValue(aj(), U))
117127
118128
119-func ag () = fromBase58String(getStringValue(ae(), P))
129+func al () = fromBase58String(getStringValue(aj(), V))
120130
121131
122-func ah () = fromBase58String(getStringValue(ae(), Q))
132+func am () = fromBase58String(getStringValue(aj(), W))
123133
124134
125-func ai () = valueOrErrorMessage(addressFromString(getStringValue(ae(), R)), "Quote asset staking not set")
135+func an () = valueOrErrorMessage(addressFromString(getStringValue(aj(), X)), "Quote asset staking not set")
126136
127137
128-func aj () = valueOrErrorMessage(addressFromString(getStringValue(ae(), S)), "Staking not set")
138+func ao () = valueOrErrorMessage(addressFromString(getStringValue(aj(), Y)), "Staking not set")
129139
130140
131-func ak () = valueOrErrorMessage(addressFromString(getStringValue(ae(), N)), "Insurance not set")
141+func ap () = valueOrErrorMessage(addressFromString(getStringValue(aj(), T)), "Vault not set")
132142
133143
134-func al () = valueOrErrorMessage(addressFromString(getStringValue(ae(), T)), "Miner not set")
144+func aq () = valueOrErrorMessage(addressFromString(getStringValue(aj(), Z)), "Miner not set")
135145
136146
137-func am () = valueOrErrorMessage(addressFromString(getStringValue(ae(), U)), "Orders not set")
147+func ar () = valueOrErrorMessage(addressFromString(getStringValue(aj(), aa)), "Orders not set")
138148
139149
140-func an () = valueOrErrorMessage(addressFromString(getStringValue(ae(), V)), "Referral not set")
150+func as () = valueOrErrorMessage(addressFromString(getStringValue(aj(), ab)), "Referral not set")
141151
142152
143-func ao () = valueOrErrorMessage(addressFromString(getStringValue(ae(), W)), "Manager not set")
153+func at () = valueOrErrorMessage(addressFromString(getStringValue(aj(), ae)), "NFT Manager not set")
144154
145155
146-func ap () = valueOrErrorMessage(addressFromString(getStringValue(ae(), Z)), "NFT Manager not set")
156+func au () = valueOrErrorMessage(addressFromString(getStringValue(aj(), ac)), "Collateral Manager not set")
147157
148158
149-func aq () = valueOrErrorMessage(addressFromString(getStringValue(ae(), X)), "Collateral Manager not set")
159+func av () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(aj(), ad), "No swap address")), "Invalid swap address")
150160
151161
152-func ar () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ae(), Y), "No swap address")), "Invalid swap address")
162+let aw = "k_whitelist_asset"
163+
164+func ax (ay) = valueOrElse(getBoolean(au(), ag(aw, ay)), false)
153165
154166
155-let as = "k_whitelist_asset"
167+let az = "k_token_param"
156168
157-func at (au) = valueOrElse(getBoolean(aq(), ab(as, au)), false)
169+let aA = "k_token_type"
170+
171+let aB = "fee_reduction"
172+
173+let aC = 1
174+
175+let aD = 2
176+
177+let aE = 15
178+
179+let aF = 15
180+
181+let aG = 1000
182+
183+let aH = 6
184+
185+let aI = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
186+
187+let aJ = (86400 * aI)
188+
189+let aK = 100
190+
191+let aL = 1
192+
193+let aM = 2
194+
195+func aN (aO) = (toString(aO) + ",")
158196
159197
160-let av = "k_token_param"
161-
162-let aw = "k_token_type"
163-
164-let ax = "fee_reduction"
165-
166-let ay = 1
167-
168-let az = 2
169-
170-let aA = 15
171-
172-let aB = 15
173-
174-let aC = 1000
175-
176-let aD = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
177-
178-let aE = (86400 * aD)
179-
180-let aF = 100
181-
182-let aG = 1
183-
184-let aH = 2
185-
186-func aI (aJ) = (toString(aJ) + ",")
198+func aP (aO,aQ) = fraction(aO, aI, aQ, HALFEVEN)
187199
188200
189-func aK (aJ,aL) = fraction(aJ, aD, aL, HALFEVEN)
201+func aR (aO,aQ) = fraction(aO, aQ, aI, HALFEVEN)
190202
191203
192-func aM (aJ,aL) = fraction(aJ, aL, aD, HALFEVEN)
204+func aS (aO) = sqrt(aO, aH, aH, HALFEVEN)
193205
194206
195-func aN (aJ) = if ((aJ > 0))
196- then aJ
197- else -(aJ)
207+func aT (aO,aQ) = pow(aO, aH, aQ, aH, aH, HALFEVEN)
198208
199209
200-func aO (aJ,aL) = if ((aJ >= aL))
201- then aJ
202- else aL
210+func aU (aO,aQ) = fraction(aO, toBigInt(aI), aQ, HALFEVEN)
203211
204212
205-func aP (aQ) = {
206- func aR (aS,aT) = ((aS + aT) + ",")
213+func aV (aO,aQ) = fraction(aO, aQ, toBigInt(aI), HALFEVEN)
207214
208- let aU = {
209- let aV = aQ
210- let aW = size(aV)
211- let aX = ""
212- func aY (aZ,ba) = if ((ba >= aW))
213- then aZ
214- else aR(aZ, aV[ba])
215215
216- func bb (aZ,ba) = if ((ba >= aW))
217- then aZ
216+func aW (aO) = sqrtBigInt(aO, aH, aH, HALFEVEN)
217+
218+
219+func aX (aO,aQ) = pow(aO, aH, aQ, aH, aH, HALFEVEN)
220+
221+
222+func aY (aO) = if ((aO > 0))
223+ then aO
224+ else -(aO)
225+
226+
227+func aZ (aO,aQ) = if ((aO >= aQ))
228+ then aO
229+ else aQ
230+
231+
232+func ba (bb) = {
233+ func bc (bd,be) = ((bd + be) + ",")
234+
235+ let bf = {
236+ let bg = bb
237+ let bh = size(bg)
238+ let bi = ""
239+ func bj (bk,bl) = if ((bl >= bh))
240+ then bk
241+ else bc(bk, bg[bl])
242+
243+ func bm (bk,bl) = if ((bl >= bh))
244+ then bk
218245 else throw("List size exceeds 20")
219246
220- bb(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aX, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
247+ bm(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bi, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
221248 }
222- let bc = dropRight(aU, 1)
223- let bd = if ((take(bc, 1) == ","))
224- then drop(bc, 1)
225- else bc
226- bd
249+ let bn = dropRight(bf, 1)
250+ let bo = if ((take(bn, 1) == ","))
251+ then drop(bn, 1)
252+ else bn
253+ bo
227254 }
228255
229256
230-func be (bf) = split(bf, ",")
257+func bp (bq) = split(bq, ",")
231258
232259
233-func bg (aQ,bh,bi) = if ((size(aQ) > bh))
234- then (removeByIndex(aQ, 0) :+ bi)
235- else (aQ :+ bi)
260+func br (bb,bs,bt) = if ((size(bb) > bs))
261+ then (removeByIndex(bb, 0) :+ bt)
262+ else (bb :+ bt)
236263
237264
238-func bj (bk) = valueOrErrorMessage(getInteger(this, bk), ("no value for " + bk))
265+func bu (bv) = valueOrErrorMessage(getInteger(this, bv), ("no value for " + bv))
239266
240267
241-func bl (ad,ac) = {
242- let aT = valueOrErrorMessage(getString(ad, ac), ("No value for key " + ac))
243- aT
268+func bw (bv,bx) = valueOrElse(getInteger(this, bv), bx)
269+
270+
271+func by (ai,ah) = {
272+ let be = valueOrErrorMessage(getString(ai, ah), ("No value for key " + ah))
273+ be
244274 }
245275
246276
247-func bm (ad,ac) = {
248- let aT = valueOrErrorMessage(getInteger(ad, ac), ("No value for key " + ac))
249- aT
277+func bz (ai,ah) = {
278+ let be = valueOrErrorMessage(getInteger(ai, ah), ("No value for key " + ah))
279+ be
250280 }
251281
252282
253-func bn () = bj(d)
283+func bA () = bu(d)
254284
255285
256-func bo () = bj(m)
286+func bB () = bu(o)
257287
258288
259-func bp () = bj(o)
289+func bC () = bu(q)
260290
261291
262-func bq () = bj(F)
292+func bD () = bu(I)
263293
264294
265-func br () = bj(G)
295+func bE () = bu(J)
266296
267297
268-func bs () = bj(H)
298+func bF () = bw(K, aI)
269299
270300
271-func bt () = bj(K)
301+func bG () = bw(L, aI)
272302
273303
274-func bu () = bj(L)
304+func bH () = bu(M)
275305
276306
277-func bv () = bj(C)
307+func bI () = bu(P)
278308
279309
280-func bw () = bj(n)
310+func bJ () = bu(Q)
281311
282312
283-func bx () = (bw() * aD)
313+func bK () = bu(R)
284314
285315
286-func by () = (bw() * aC)
316+func bL () = bu(F)
287317
288318
289-func bz () = bj(p)
319+func bM () = bu(p)
290320
291321
292-func bA () = bj(q)
322+func bN () = (bM() * aI)
293323
294324
295-func bB () = bj(r)
325+func bO () = (bM() * aG)
296326
297327
298-func bC () = bj(s)
328+func bP () = bu(r)
299329
300330
301-func bD () = bj(t)
331+func bQ () = bu(s)
302332
303333
304-func bE () = bj(u)
334+func bR () = bu(t)
305335
306336
307-func bF () = bj(A)
337+func bS () = bu(u)
308338
309339
310-func bG () = bj(B)
340+func bT () = bu(v)
311341
312342
313-func bH () = bj(J)
343+func bU () = bu(w)
314344
315345
316-func bI () = bj(I)
346+func bV () = bu(x)
317347
318348
319-func bJ (bK) = valueOrElse(getString(am(), "k_sender"), toString(bK.caller))
349+func bW () = bu(D)
320350
321351
322-func bL (bM,bN,bO) = {
323- let bP = (bM - bN)
324- if (if (bO)
325- then (0 > bP)
352+func bX () = bu(E)
353+
354+
355+func bY () = bu(O)
356+
357+
358+func bZ () = bu(N)
359+
360+
361+func ca () = bw(e, 0)
362+
363+
364+func cb (cc) = valueOrElse(getString(ar(), "k_sender"), toString(cc.caller))
365+
366+
367+func cd (ce,cf,cg) = {
368+ let ch = (ce - cf)
369+ if (if (cg)
370+ then (0 > ch)
326371 else false)
327372 then throw("Invalid margin")
328- else if (if (!(bO))
329- then (bP >= 0)
373+ else if (if (!(cg))
374+ then (ch >= 0)
330375 else false)
331376 then throw("Invalid margin")
332377 else true
333378 }
334379
335380
336-func bQ (bR) = if ((bR == 0))
381+func ci (cj) = if ((cj == 0))
337382 then throw("Should not be called with _positionSize == 0")
338- else if ((bR > 0))
339- then bF()
340- else bG()
383+ else if ((cj > 0))
384+ then bW()
385+ else bX()
341386
342387
343-func bS (bT) = {
344- let bU = getInteger(this, ab(e, bT))
345- let bV = bU
346- if ($isInstanceOf(bV, "Int"))
388+func ck (cl) = {
389+ let cm = getInteger(this, ag(f, cl))
390+ let cn = cm
391+ if ($isInstanceOf(cn, "Int"))
347392 then {
348- let bW = bV
349- $Tuple4(bW, getIntegerValue(this, ab(f, bT)), getIntegerValue(this, ab(g, bT)), getIntegerValue(this, ab(h, bT)))
393+ let co = cn
394+ $Tuple4(co, getIntegerValue(this, ag(g, cl)), getIntegerValue(this, ag(h, cl)), getIntegerValue(this, ag(i, cl)))
350395 }
351396 else $Tuple4(0, 0, 0, 0)
352397 }
353398
354399
355-func bX (bT) = {
356- let bY = getString(this, ab(j, bT))
357- let bV = bY
358- if ($isInstanceOf(bV, "String"))
400+func cp (cl) = {
401+ let cq = getString(this, ag(k, cl))
402+ let cn = cq
403+ if ($isInstanceOf(cn, "String"))
359404 then {
360- let bZ = bV
361- bZ
405+ let cr = cn
406+ cr
362407 }
363- else toBase58String(ah())
408+ else toBase58String(am())
364409 }
365410
366411
367-func ca (bT) = if ((bS(bT)._1 == 0))
412+func cs (cl) = if ((ck(cl)._1 == 0))
368413 then throw("No open position")
369414 else true
370415
371416
372-func cb () = valueOrElse(getBoolean(this, k), false)
417+func ct () = valueOrElse(getBoolean(this, l), false)
373418
374419
375-func cc () = valueOrElse(getBoolean(this, l), false)
420+func cu () = valueOrElse(getBoolean(this, m), false)
376421
377422
378-func cd (ce,cf,cg) = if (ce)
423+func cv () = valueOrElse(getBoolean(this, n), false)
424+
425+
426+func cw (cx,cy,cz) = if (cx)
379427 then {
380- let ch = (br() - cg)
381- if ((0 >= ch))
428+ let cA = (bE() - cz)
429+ if ((0 >= cA))
382430 then throw("Tx lead to base asset reserve <= 0, revert")
383- else $Tuple4((bq() + cf), ch, (bs() + cg), (bt() + cf))
431+ else $Tuple3((bD() + cy), cA, (bH() + cz))
384432 }
385433 else {
386- let ci = (bq() - cf)
387- if ((0 >= ci))
434+ let cB = (bD() - cy)
435+ if ((0 >= cB))
388436 then throw("Tx lead to base quote reserve <= 0, revert")
389- else $Tuple4(ci, (br() + cg), (bs() - cg), (bt() - cf))
437+ else $Tuple3(cB, (bE() + cz), (bH() - cz))
390438 }
391439
392440
393-func cj (ce,cf) = {
394- let ck = bq()
395- let cl = br()
396- let bk = aM(ck, cl)
397- let cm = if (ce)
398- then (ck + cf)
399- else (ck - cf)
400- let cn = aK(bk, cm)
401- let co = aN((cn - cl))
402- let cp = if (ce)
403- then co
404- else -(co)
405- let cq = cd(ce, cf, co)
406- let cr = cq._1
407- let cs = cq._2
408- let ct = cq._3
409- let cu = cq._4
410- let cv = aK(ck, cl)
411- let cw = aK(cf, co)
412- let cx = aN((cv - cw))
413- let cy = (aD - aK(cv, (cv + cx)))
414- let cz = bD()
415- if ((cy > cz))
416- then throw(((((((((((((("Price impact " + toString(cy)) + " > max price impact ") + toString(cz)) + " before quote asset: ") + toString(ck)) + " before base asset: ") + toString(cl)) + " quote asset amount to exchange: ") + toString(cf)) + " price before: ") + toString(cv)) + " marketPrice: ") + toString(cw)))
417- else $Tuple5(cp, cr, cs, ct, cu)
441+func cC (cD,cE,cF,cG) = {
442+ let cH = toBigInt(cD)
443+ let cI = toBigInt(cE)
444+ let cJ = toBigInt(cF)
445+ let cK = toBigInt(cG)
446+ aV(aV(cH, cI), aV(cJ, cK))
418447 }
419448
420449
421-func cA (cB,cC,cD,cE) = {
422- let cF = if ((cB != 0))
423- then {
424- let cG = bQ(cB)
425- aM((cG - cD), cB)
426- }
427- else 0
428- let cH = ((cE - cF) + cC)
429- let cI = if ((0 > cH))
430- then $Tuple2(0, aN(cH))
431- else $Tuple2(aN(cH), 0)
432- let cJ = cI._1
433- let cK = cI._2
434- $Tuple3(cJ, cK, cF)
450+func cL (cx,cy) = {
451+ let cD = bD()
452+ let cF = bE()
453+ let cE = bF()
454+ let cG = bG()
455+ let bv = cC(cD, cE, cF, cG)
456+ let cM = if (cx)
457+ then (cD + cy)
458+ else (cD - cy)
459+ let cN = toInt(aU(bv, toBigInt(aR(cM, cE))))
460+ let cO = aP(aY((cN - cF)), cE)
461+ let cP = if (cx)
462+ then cO
463+ else -(cO)
464+ let cQ = cw(cx, cy, cO)
465+ let cR = cQ._1
466+ let cS = cQ._2
467+ let cT = cQ._3
468+ let cU = aP(aR(cD, cE), aR(cF, cG))
469+ let cV = aP(cy, cO)
470+ let cW = aY((cU - cV))
471+ let cX = (aI - aP(cU, (cU + cW)))
472+ let cY = bT()
473+ if ((cX > cY))
474+ then throw(((((((((((((("Price impact " + toString(cX)) + " > max price impact ") + toString(cY)) + " before quote asset: ") + toString(cD)) + " before base asset: ") + toString(cF)) + " quote asset amount to exchange: ") + toString(cy)) + " price before: ") + toString(cU)) + " marketPrice: ") + toString(cV)))
475+ else $Tuple4(cP, cR, cS, cT)
435476 }
436477
437478
438-func cL (ce,cg,cM,cN,cO) = {
439- let cv = aK(cN, cO)
440- if ((cg == 0))
479+func cZ (da,db,dc,dd) = {
480+ let de = if ((da != 0))
481+ then {
482+ let df = ci(da)
483+ aR((df - dc), da)
484+ }
485+ else 0
486+ let dg = ((dd - de) + db)
487+ let dh = if ((0 > dg))
488+ then $Tuple2(0, aY(dg))
489+ else $Tuple2(aY(dg), 0)
490+ let di = dh._1
491+ let dj = dh._2
492+ $Tuple3(di, dj, de)
493+ }
494+
495+
496+func dk (cx,cz,dl,dm,dn,do,dp) = {
497+ let cU = aP(aR(dm, dn), aR(do, dp))
498+ if ((cz == 0))
441499 then throw("Invalid base asset amount")
442500 else {
443- let bk = aM(cN, cO)
444- let cP = if (ce)
445- then (cO + cg)
446- else (cO - cg)
447- let cQ = aK(bk, cP)
448- let cR = aN((cQ - cN))
449- let cz = bD()
450- let cS = cd(!(ce), cR, cg)
451- let cr = cS._1
452- let cs = cS._2
453- let ct = cS._3
454- let cu = cS._4
455- let cw = aK(cR, cg)
456- let cx = aN((cv - cw))
457- let cy = (aD - aK(cv, (cv + cx)))
458- if (if ((cy > cz))
459- then cM
501+ let bv = cC(dm, dn, do, dp)
502+ let dq = if (cx)
503+ then (do + cz)
504+ else (do - cz)
505+ let dr = toInt(aU(bv, toBigInt(aR(dq, dp))))
506+ let ds = aY((dr - aR(dm, dn)))
507+ let cY = bT()
508+ let dt = cw(!(cx), ds, cz)
509+ let cR = dt._1
510+ let cS = dt._2
511+ let cT = dt._3
512+ let cV = aP(ds, cz)
513+ let cW = aY((cU - cV))
514+ let cX = (aI - aP(cU, (cU + cW)))
515+ if (if ((cX > cY))
516+ then dl
460517 else false)
461- then throw(((((((((((((("Price impact " + toString(cy)) + " > max price impact ") + toString(cz)) + " before quote asset: ") + toString(cN)) + " before base asset: ") + toString(cO)) + " base asset amount to exchange: ") + toString(cg)) + " price before: ") + toString(cv)) + " market price: ") + toString(cw)))
462- else $Tuple8(cR, cr, cs, ct, cu, (bI() - (if (ce)
463- then aN(cg)
464- else 0)), (bH() - (if (!(ce))
465- then aN(cg)
466- else 0)), cy)
518+ then throw(((((((((((((("Price impact " + toString(cX)) + " > max price impact ") + toString(cY)) + " before quote asset: ") + toString(dm)) + " before base asset: ") + toString(do)) + " base asset amount to exchange: ") + toString(cz)) + " price before: ") + toString(cU)) + " market price: ") + toString(cV)))
519+ else $Tuple7(ds, cR, cS, cT, (bZ() - (if (cx)
520+ then aY(cz)
521+ else 0)), (bY() - (if (!(cx))
522+ then aY(cz)
523+ else 0)), cX)
467524 }
468525 }
469526
470527
471-func cT (ce,cg,cM) = cL(ce, cg, cM, bq(), br())
528+func du (cx,cz,dl) = dk(cx, cz, dl, bD(), bF(), bE(), bG())
472529
473530
474-func cU () = {
475- let cV = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
476- let cW = getStringValue(this, a)
477- let cX = getStringValue(this, b)
478- let cY = valueOrErrorMessage(getInteger(cV, cW), ((("Can not get oracle price. Oracle: " + toString(cV)) + " key: ") + cW))
479- cY
531+func dv () = {
532+ let dw = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
533+ let dx = getStringValue(this, a)
534+ let dy = getStringValue(this, b)
535+ let dz = valueOrErrorMessage(getInteger(dw, dx), ((("Can not get oracle price. Oracle: " + toString(dw)) + " key: ") + dx))
536+ dz
480537 }
481538
482539
483-func cZ (cN,cO) = {
484- let da = cU()
485- let db = aK(cN, cO)
486- let dc = aK((da + db), (2 * aD))
487- let dd = aK(aN((da - db)), dc)
488- if ((dd > bE()))
489- then throw(((("Price spread " + toString(dd)) + " > max price spread ") + toString(bE())))
540+func dA (dm,do) = {
541+ let dB = dv()
542+ let dC = aP(dm, do)
543+ let dD = aP((dB + dC), (2 * aI))
544+ let dE = aP(aY((dB - dC)), dD)
545+ if ((dE > bU()))
546+ then throw(((("Price spread " + toString(dE)) + " > max price spread ") + toString(bU())))
490547 else true
491548 }
492549
493550
494-func de () = {
495- let cN = bq()
496- let cO = br()
497- aK(cN, cO)
551+func dF (dG,dH) = {
552+ let dI = bV()
553+ if ((dG > dI))
554+ then throw(((("Long open notional " + toString(dG)) + " > max open notional ") + toString(dI)))
555+ else if ((dH > dI))
556+ then throw(((("Short open notional " + toString(dH)) + " > max open notional ") + toString(dI)))
557+ else true
498558 }
499559
500560
501-func df () = {
502- let da = cU()
503- let dg = de()
504- (aK(aN((da - dg)), da) > bC())
561+func dJ () = {
562+ let dm = bD()
563+ let do = bE()
564+ let cE = bF()
565+ let cG = bG()
566+ aP(aR(dm, cE), aR(do, cG))
505567 }
506568
507569
508-func dh (bR,di,cN,cO) = {
509- let dj = aN(bR)
510- let dk = (0 > bR)
511- let dl = if ((di == aG))
512- then {
513- let dm = cL(!(dk), dj, false, cN, cO)
514- let dn = dm._1
515- let do = dm._2
516- let dp = dm._3
517- let dq = dm._4
518- dn
519- }
520- else aM(dj, cU())
521- dl
570+func dK () = {
571+ let dB = dv()
572+ let dL = dJ()
573+ (aP(aY((dB - dL)), dB) > bS())
522574 }
523575
524576
525-func dr (bR,ds,cN,cO,di) = if ((bR == 0))
577+func dM (cj,dN,dm,dn,do,dp) = {
578+ let dO = aY(cj)
579+ let dP = (0 > cj)
580+ let dQ = if ((dN == aL))
581+ then {
582+ let dR = dk(!(dP), dO, false, dm, dn, do, dp)
583+ let dS = dR._1
584+ let dT = dR._2
585+ let dU = dR._3
586+ let dV = dR._4
587+ dS
588+ }
589+ else aR(dO, dv())
590+ dQ
591+ }
592+
593+
594+func dW (cj,dX,dm,dn,do,dp,dN) = if ((cj == 0))
526595 then throw("Invalid position size")
527596 else {
528- let dk = (0 > bR)
529- let dl = dh(bR, di, cN, cO)
530- let dt = if (dk)
531- then (ds - dl)
532- else (dl - ds)
533- $Tuple2(dl, dt)
597+ let dP = (0 > cj)
598+ let dQ = dM(cj, dN, dm, dn, do, dp)
599+ let dY = if (dP)
600+ then (dX - dQ)
601+ else (dQ - dX)
602+ $Tuple2(dQ, dY)
534603 }
535604
536605
537-func du (bT,di) = {
538- let dv = bS(bT)
539- let bW = dv._1
540- let dw = dv._2
541- let dx = dv._3
542- let dy = dv._4
543- dr(bW, dx, bq(), br(), di)
606+func dZ (cl,dN) = {
607+ let ea = ck(cl)
608+ let co = ea._1
609+ let eb = ea._2
610+ let ec = ea._3
611+ let ed = ea._4
612+ dW(co, ec, bD(), bF(), bE(), bG(), dN)
544613 }
545614
546615
547-func dz (dA,dB,dC) = aK((dA - dB), dC)
616+func ee (ef,eg,eh) = aP((ef - eg), eh)
548617
549618
550-func dD (bT,di) = {
551- let dE = bS(bT)
552- let bW = dE._1
553- let dw = dE._2
554- let dF = dE._3
555- let dy = dE._4
556- let dG = du(bT, di)
557- let dl = dG._1
558- let dt = dG._2
559- let dH = cA(bW, dw, dy, dt)
560- let cJ = dH._1
561- let cK = dH._2
562- dz(cJ, cK, dl)
619+func ei (cl,dN) = {
620+ let ej = ck(cl)
621+ let co = ej._1
622+ let eb = ej._2
623+ let ek = ej._3
624+ let ed = ej._4
625+ let el = dZ(cl, dN)
626+ let dQ = el._1
627+ let dY = el._2
628+ let em = cZ(co, eb, ed, dY)
629+ let di = em._1
630+ let dj = em._2
631+ ee(di, dj, dQ)
563632 }
564633
565634
566-func dI (bT) = dD(bT, aG)
635+func en (cl) = ei(cl, aL)
567636
568637
569-func dJ (bT,bR) = {
570- let dK = aO(bB(), (aD - aK(dI(bT), bz())))
571- let dL = aM(aN(bR), dK)
572- let dM = cT((bR > 0), dL, false)
573- let dN = dM._1
574- let cy = dM._8
575- if ((bD() > cy))
576- then dN
638+func eo (cl,cj) = {
639+ let ep = aZ(bR(), (aI - aP(en(cl), bP())))
640+ let eq = aR(aY(cj), ep)
641+ let er = du((cj > 0), eq, false)
642+ let es = er._1
643+ let cX = er._7
644+ if ((bT() > cX))
645+ then es
577646 else {
578- let dO = aM(aN(bR), bB())
579- let dP = cT((bR > 0), dO, false)._1
580- dP
647+ let et = aR(aY(cj), bR())
648+ let eu = du((cj > 0), et, false)._1
649+ eu
581650 }
582651 }
583652
584653
585-func dQ (bT,cM) = {
586- let dR = bS(bT)
587- let bW = dR._1
588- let dw = dR._2
589- let dx = dR._3
590- let dy = dR._4
591- let dt = du(bT, aG)._2
592- let dS = cA(bW, dw, dy, dt)
593- let cJ = dS._1
594- let cK = dS._2
595- let dO = -(bW)
596- let dT = dt
597- let dU = -(cJ)
598- let dV = cT((bW > 0), aN(bW), cM)
599- let dP = dV._1
600- let cm = dV._2
601- let cn = dV._3
602- let dW = dV._4
603- let dX = dV._5
604- let dY = dV._6
605- let dZ = dV._7
606- let ea = (bu() - dx)
607- $Tuple12(dO, cK, dT, dU, cm, cn, dW, dX, ea, dP, dY, dZ)
654+func ev (cl,dl) = {
655+ let ew = ck(cl)
656+ let co = ew._1
657+ let eb = ew._2
658+ let ec = ew._3
659+ let ed = ew._4
660+ let dY = dZ(cl, aL)._2
661+ let ex = cZ(co, eb, ed, dY)
662+ let di = ex._1
663+ let dj = ex._2
664+ let et = -(co)
665+ let ey = dY
666+ let ez = -(di)
667+ let eA = du((co > 0), aY(co), dl)
668+ let eu = eA._1
669+ let cM = eA._2
670+ let cN = eA._3
671+ let eB = eA._4
672+ let eC = eA._5
673+ let eD = eA._6
674+ let eE = (bI() - ec)
675+ $Tuple13(et, dj, ey, ez, cM, cN, eB, eE, eu, eC, eD, (bK() - (if ((co > 0))
676+ then ec
677+ else 0)), (bJ() - (if ((0 > co))
678+ then ec
679+ else 0)))
608680 }
609681
610682
611-func eb () = {
612- let ec = ((lastBlock.timestamp / 1000) / 60)
613- let ed = (ec - aA)
614- let ee = valueOrElse(getString(this, v), "")
615- let ef = split(ee, ",")
616- func eg (aS,eh) = if ((ed >= parseIntValue(eh)))
617- then (aS :+ parseIntValue(eh))
618- else aS
683+func eF () = {
684+ let eG = ((lastBlock.timestamp / 1000) / 60)
685+ let eH = (eG - aE)
686+ let eI = valueOrElse(getString(this, y), "")
687+ let eJ = split(eI, ",")
688+ func eK (bd,eL) = if ((eH >= parseIntValue(eL)))
689+ then (bd :+ parseIntValue(eL))
690+ else bd
619691
620- let ei = {
621- let aV = ef
622- let aW = size(aV)
623- let aX = nil
624- func aY (aZ,ba) = if ((ba >= aW))
625- then aZ
626- else eg(aZ, aV[ba])
692+ let eM = {
693+ let bg = eJ
694+ let bh = size(bg)
695+ let bi = nil
696+ func bj (bk,bl) = if ((bl >= bh))
697+ then bk
698+ else eK(bk, bg[bl])
627699
628- func bb (aZ,ba) = if ((ba >= aW))
629- then aZ
700+ func bm (bk,bl) = if ((bl >= bh))
701+ then bk
630702 else throw("List size exceeds 20")
631703
632- bb(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aY(aX, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
704+ bm(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bj(bi, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
633705 }
634- let ej = if ((size(ei) > 0))
635- then max(ei)
636- else parseIntValue(ef[0])
637- let ek = valueOrElse(getInteger(this, w), 0)
638- let el = valueOrElse(getInteger(this, ((x + "_") + toString(ek))), 0)
639- let em = valueOrElse(getInteger(this, ((y + "_") + toString(ek))), 0)
640- let en = (el + ((ec - ek) * em))
641- let eo = valueOrElse(getInteger(this, ((x + "_") + toString(ej))), 0)
642- let ep = valueOrElse(getInteger(this, ((y + "_") + toString(ej))), 0)
643- let eq = (eo + ((ed - ej) * ep))
644- ((en - eq) / aA)
706+ let eN = if ((size(eM) > 0))
707+ then max(eM)
708+ else parseIntValue(eJ[0])
709+ let eO = valueOrElse(getInteger(this, z), 0)
710+ let eP = valueOrElse(getInteger(this, ((A + "_") + toString(eO))), 0)
711+ let eQ = valueOrElse(getInteger(this, ((B + "_") + toString(eO))), 0)
712+ let eR = (eP + ((eG - eO) * eQ))
713+ let eS = valueOrElse(getInteger(this, ((A + "_") + toString(eN))), 0)
714+ let eT = valueOrElse(getInteger(this, ((B + "_") + toString(eN))), 0)
715+ let eU = (eS + ((eH - eN) * eT))
716+ ((eR - eU) / aE)
645717 }
646718
647719
648-func er (es) = {
649- let bR = bs()
650- let et = (bR > 0)
651- let eu = cT(et, aN(bR), false)._1
652- let ev = br()
653- let ew = aM(ev, es)
654- let ex = dr(bR, eu, ew, ev, aG)._2
655- $Tuple2(ew, ex)
720+func eV () = {
721+ let cj = bH()
722+ if ((cj == 0))
723+ then $Tuple2(bD(), bE())
724+ else {
725+ let eW = (cj > 0)
726+ let eX = du(eW, aY(cj), false)
727+ let eY = eX._1
728+ let eZ = eX._2
729+ let fa = eX._3
730+ $Tuple2(eZ, fa)
731+ }
656732 }
657733
658734
659-func ey () = {
660- let ez = cU()
661- let eA = eb()
662- let eB = (eA - ez)
663- if (if ((bH() == 0))
735+func fb (fc,bH,fd,fe) = {
736+ let ff = toBigInt(fc)
737+ let fg = toBigInt(bH)
738+ let fh = toBigInt(fd)
739+ let fi = toBigInt(fe)
740+ let fj = aX((ff + fg), toBigInt((2 * aI)))
741+ let fk = aV(fh, fj)
742+ let fl = (toBigInt(4) * aV(fi, fg))
743+ let fm = aW(aV(fk, (fh - fl)))
744+ let fn = aV(ff, fh)
745+ let fo = aV(fh, fg)
746+ let fp = ((-(fm) + fn) + fo)
747+ let fq = (toBigInt(2) * aV(fh, fg))
748+ let fr = aU(fp, fq)
749+ toInt(fr)
750+ }
751+
752+
753+func fs (ft) = {
754+ let cj = bH()
755+ if ((cj == 0))
756+ then {
757+ let cD = bD()
758+ let cF = bE()
759+ let fu = aP(aR(ft, cF), cD)
760+ $Tuple3(fu, aI, 0)
761+ }
762+ else {
763+ let eW = (cj > 0)
764+ let eY = du(eW, aY(cj), false)._1
765+ let cD = bD()
766+ let cF = bE()
767+ let fu = fb(cF, cj, cD, ft)
768+ let fv = aI
769+ let ez = dW(cj, eY, cD, fu, cF, fv, aL)._2
770+ $Tuple3(fu, fv, ez)
771+ }
772+ }
773+
774+
775+func fw () = {
776+ let fx = dv()
777+ let fy = eF()
778+ let fz = (fy - fx)
779+ if (if ((bY() == 0))
664780 then true
665- else (bI() == 0))
781+ else (bZ() == 0))
666782 then $Tuple2(0, 0)
667- else if ((0 > eB))
783+ else if ((0 > fz))
668784 then {
669- let eC = aK(aM(eB, bx()), aE)
670- let eD = aK(aM(eC, bH()), bI())
671- $Tuple2(eC, eD)
785+ let fA = aP(aR(fz, bN()), aJ)
786+ let fB = aP(aR(fA, bY()), bZ())
787+ $Tuple2(fA, fB)
672788 }
673789 else {
674- let eD = aK(aM(eB, bx()), aE)
675- let eC = aK(aM(eD, bI()), bH())
676- $Tuple2(eC, eD)
790+ let fB = aP(aR(fz, bN()), aJ)
791+ let fA = aP(aR(fB, bZ()), bY())
792+ $Tuple2(fA, fB)
677793 }
678794 }
679795
680796
681-func eE (bK) = {
682- let eF = bo()
683- let eG = if ((size(bK.payments) > 1))
797+func fC (fD,fE) = {
798+ let fF = bB()
799+ let fG = aR(fF, fE)
800+ let fH = if ((fD != ""))
684801 then {
685- let eH = toBase58String(valueOrErrorMessage(bK.payments[1].assetId, "Invalid attached artifact"))
686- let eI = bl(ap(), ab(aw, eH))
687- if ((eI == ax))
802+ let fI = by(at(), ag(aA, fD))
803+ if ((fI == aB))
688804 then {
689- let eJ = bm(ap(), ab(av, eH))
690- let eK = aM(eF, eJ)
691- $Tuple2(eK, true)
805+ let fJ = bz(at(), ag(az, fD))
806+ let fK = aR(fG, fJ)
807+ $Tuple2(fK, true)
692808 }
693809 else throw("Invalid attached artifact")
694810 }
695- else $Tuple2(eF, false)
696- let eK = eG._1
697- let eL = eG._2
698- $Tuple2(eK, eL)
811+ else $Tuple2(fG, false)
812+ let fK = fH._1
813+ let fL = fH._2
814+ $Tuple2(fK, fL)
699815 }
700816
701817
702-func eM (eN,eO,eP,eQ,eR,eS,eT,eU,eV) = [IntegerEntry(o, eN), IntegerEntry(p, eO), IntegerEntry(q, eP), IntegerEntry(n, eQ), IntegerEntry(m, eR), IntegerEntry(s, eS), IntegerEntry(t, eT), IntegerEntry(r, eU), IntegerEntry(u, eV)]
818+func fM (fN,fO,fP,fQ,fR,fS,fT,fU,fV,dI) = [IntegerEntry(q, fN), IntegerEntry(r, fO), IntegerEntry(s, fP), IntegerEntry(p, fQ), IntegerEntry(o, fR), IntegerEntry(u, fS), IntegerEntry(v, fT), IntegerEntry(t, fU), IntegerEntry(w, fV), IntegerEntry(x, dI)]
703819
704820
705-func eW (eX,eY,eZ,fa,fb) = [IntegerEntry(C, eX), IntegerEntry(A, eY), IntegerEntry(B, eZ), IntegerEntry(D, fa), IntegerEntry(E, fb)]
821+func fW (fX,fY,fZ,ga,gb) = [IntegerEntry(F, fX), IntegerEntry(D, fY), IntegerEntry(E, fZ), IntegerEntry(G, ga), IntegerEntry(H, gb)]
706822
707823
708-func fc (ad,au) = [StringEntry(ab(j, ad), au)]
824+func gc (ai,ay) = [StringEntry(ag(k, ai), ay)]
709825
710826
711-func fd (ad,fe,ff,fg,cG) = [IntegerEntry(ab(e, ad), fe), IntegerEntry(ab(f, ad), ff), IntegerEntry(ab(g, ad), fg), IntegerEntry(ab(h, ad), cG)]
827+func gd (ge,ai) = if (ge)
828+ then {
829+ let gf = ca()
830+[IntegerEntry(ag(j, ai), (gf + 1)), IntegerEntry(e, (gf + 1))]
831+ }
832+ else nil
712833
713834
714-func fh (fi) = {
715- let ec = ((lastBlock.timestamp / 1000) / 60)
716- let fj = valueOrElse(getInteger(this, w), 0)
717- if ((fj > ec))
835+func gg (ai,gh,gi,gj,df) = [IntegerEntry(ag(f, ai), gh), IntegerEntry(ag(g, ai), gi), IntegerEntry(ag(h, ai), gj), IntegerEntry(ag(i, ai), df)]
836+
837+
838+func gk (gl) = {
839+ let eG = ((lastBlock.timestamp / 1000) / 60)
840+ let gm = valueOrElse(getInteger(this, z), 0)
841+ if ((gm > eG))
718842 then throw("TWAP out-of-order")
719843 else {
720- let ek = if ((fj == 0))
721- then ec
722- else fj
723- if ((ec > fj))
844+ let eO = if ((gm == 0))
845+ then eG
846+ else gm
847+ if ((eG > gm))
724848 then {
725- let fk = valueOrElse(getInteger(this, ((x + "_") + toString(fj))), 0)
726- let fl = valueOrElse(getInteger(this, ((y + "_") + toString(fj))), fi)
727- let fm = (fk + ((ec - ek) * fl))
728- let ef = bg(be(valueOrElse(getString(this, v), "")), aA, toString(ec))
729-[IntegerEntry(ab(x, toString(ec)), fm), IntegerEntry(ab(y, toString(ec)), fi), IntegerEntry(ab(z, toString(ec)), fj), IntegerEntry(w, ec), StringEntry(v, aP(ef))]
849+ let gn = valueOrElse(getInteger(this, ((A + "_") + toString(gm))), 0)
850+ let go = valueOrElse(getInteger(this, ((B + "_") + toString(gm))), gl)
851+ let gp = (gn + ((eG - eO) * go))
852+ let eJ = br(bp(valueOrElse(getString(this, y), "")), aE, toString(eG))
853+[IntegerEntry(ag(A, toString(eG)), gp), IntegerEntry(ag(B, toString(eG)), gl), IntegerEntry(ag(C, toString(eG)), gm), IntegerEntry(z, eG), StringEntry(y, ba(eJ))]
730854 }
731855 else {
732- let fn = valueOrElse(getInteger(this, ab(z, toString(ec))), 0)
733- let fk = valueOrElse(getInteger(this, ab(x, toString(fn))), 0)
734- let fl = valueOrElse(getInteger(this, ab(y, toString(fn))), fi)
735- let fm = (fk + ((ec - fn) * fl))
736-[IntegerEntry(ab(x, toString(ec)), fm), IntegerEntry(ab(y, toString(ec)), fi)]
856+ let gq = valueOrElse(getInteger(this, ag(C, toString(eG))), 0)
857+ let gn = valueOrElse(getInteger(this, ag(A, toString(gq))), 0)
858+ let go = valueOrElse(getInteger(this, ag(B, toString(gq))), gl)
859+ let gp = (gn + ((eG - gq) * go))
860+[IntegerEntry(ag(A, toString(eG)), gp), IntegerEntry(ag(B, toString(eG)), gl)]
737861 }
738862 }
739863 }
740864
741865
742-func fo (ck,cl) = [IntegerEntry(F, ck), IntegerEntry(G, cl)]
866+func gr (cD,cF) = [IntegerEntry(I, cD), IntegerEntry(J, cF)]
743867
744868
745-func fp (ck,cl,fq,fr,fs,ft,fu) = if (((ft - fu) != fq))
746- then throw(((((("Invalid AMM state data: " + toString(ft)) + " + ") + toString(fu)) + " != ") + toString(fq)))
747- else ((fo(ck, cl) ++ [IntegerEntry(H, fq), IntegerEntry(K, fr), IntegerEntry(L, fs), IntegerEntry(I, ft), IntegerEntry(J, fu)]) ++ fh(aK(ck, cl)))
869+func gs (cE,cG) = [IntegerEntry(K, cE), IntegerEntry(L, cG)]
748870
749871
750-func fv (ad) = [DeleteEntry(ab(e, ad)), DeleteEntry(ab(f, ad)), DeleteEntry(ab(g, ad)), DeleteEntry(ab(h, ad)), DeleteEntry(ab(j, ad)), IntegerEntry(ab(i, ad), lastBlock.timestamp)]
751-
752-
753-func fw (ad,fx) = {
754- let fy = assetBalance(this, ah())
755- if ((fx > fy))
756- then throw(((("Unable to withdraw " + toString(fx)) + " from contract balance ") + toString(fy)))
757- else [ScriptTransfer(ad, fx, ah())]
872+func gt (cD,cF,gu,gv,gw,gx,gy,gz) = {
873+ let cE = bF()
874+ let cG = bG()
875+ if (((gw - gx) != gu))
876+ then throw(((((("Invalid AMM state data: " + toString(gw)) + " + ") + toString(gx)) + " != ") + toString(gu)))
877+ else ((gr(cD, cF) ++ [IntegerEntry(M, gu), IntegerEntry(P, gv), IntegerEntry(N, gw), IntegerEntry(O, gx), IntegerEntry(R, gy), IntegerEntry(Q, gz)]) ++ gk(aP(aR(cD, cE), aR(cF, cG))))
758878 }
759879
760880
761-func fz (bK) = if ((0 > bK))
762- then throw("Balance")
763- else [IntegerEntry(d, bK)]
881+func gA (ai) = [DeleteEntry(ag(f, ai)), DeleteEntry(ag(g, ai)), DeleteEntry(ag(h, ai)), DeleteEntry(ag(i, ai)), DeleteEntry(ag(k, ai))]
764882
765883
766-func fA (bK) = [ScriptTransfer(aj(), bK, ah())]
884+func gB (ai,gC) = {
885+ let gD = assetBalance(this, am())
886+ if ((gC > gD))
887+ then throw(((("Unable to withdraw " + toString(gC)) + " from contract balance ") + toString(gD)))
888+ else [ScriptTransfer(ai, gC, am())]
889+ }
767890
768891
769-func fB (fC,bK) = if (fC)
770- then [Burn(valueOrErrorMessage(bK.payments[1].assetId, "Invalid artifact"), 1)]
892+func gE (cc) = if ((0 > cc))
893+ then throw("Balance")
894+ else [IntegerEntry(d, cc)]
895+
896+
897+func gF (cc) = [ScriptTransfer(ao(), cc, am())]
898+
899+
900+func gG (gH,cc) = if (gH)
901+ then [Burn(valueOrErrorMessage(cc.payments[1].assetId, "Invalid artifact"), 1)]
771902 else nil
772903
773904
774-func fD (bT,au) = {
775- let fE = bS(bT)._1
776- if ((fE == 0))
905+func gI (cl,ay) = {
906+ let gJ = ck(cl)._1
907+ if ((gJ == 0))
777908 then true
778- else (bX(bT) == au)
909+ else (cp(cl) == ay)
779910 }
780911
781912
782-func fF (bT,au) = (bX(bT) == au)
913+func gK (cl,ay) = (cp(cl) == ay)
783914
784915
785-func fG (fH,au,bT) = ((((((aa + "_") + fH) + "_") + au) + "_") + bT)
916+func gL (gM,ay,cl) = ((((((af + "_") + gM) + "_") + ay) + "_") + cl)
786917
787918
788-func fI (bT) = {
789- let bZ = bX(bT)
790- if ((bZ == toBase58String(ah())))
791- then $Tuple2(0, bZ)
919+func gN (cl) = {
920+ let cr = cp(cl)
921+ if ((cr == toBase58String(am())))
922+ then $Tuple2(0, cr)
792923 else {
793- let fJ = fG(toString(this), bZ, bT)
794- let fK = valueOrElse(getInteger(aq(), fJ), 0)
795- $Tuple2(fK, bZ)
924+ let gO = gL(toString(this), cr, cl)
925+ let gP = valueOrElse(getInteger(au(), gO), 0)
926+ $Tuple2(gP, cr)
796927 }
797928 }
798929
799930
800-@Callable(bK)
801-func pause () = if ((bK.caller != af()))
802- then throw("Invalid togglePause params")
803- else [BooleanEntry(l, true)]
931+func gQ (cl,fD) = {
932+ let gR = invoke(aq(), "computeFeeDiscount", [cl], nil)
933+ if ((gR == gR))
934+ then {
935+ let gS = {
936+ let cn = gR
937+ if ($isInstanceOf(cn, "Int"))
938+ then {
939+ let gT = cn
940+ gT
941+ }
942+ else throw("Invalid computeFeeDiscount result")
943+ }
944+ let gU = fC(fD, gS)
945+ let fK = gU._1
946+ let fL = gU._2
947+ $Tuple2(fK, fL)
948+ }
949+ else throw("Strict value is not equal to itself.")
950+ }
951+
952+
953+func gV (cc) = {
954+ let gW = if ((size(cc.payments) > 1))
955+ then toBase58String(valueOrErrorMessage(cc.payments[1].assetId, "Invalid artifactId"))
956+ else ""
957+ gW
958+ }
959+
960+
961+@Callable(cc)
962+func pause () = if ((cc.caller != ak()))
963+ then throw("Invalid pause params")
964+ else [BooleanEntry(m, true)]
804965
805966
806967
807-@Callable(bK)
808-func unpause () = if ((bK.caller != af()))
809- then throw("Invalid togglePause params")
810- else [BooleanEntry(l, false)]
968+@Callable(cc)
969+func unpause () = if ((cc.caller != ak()))
970+ then throw("Invalid unpause params")
971+ else [BooleanEntry(m, false)]
811972
812973
813974
814-@Callable(bK)
815-func addLiquidity (cf) = if (if ((bK.caller != af()))
975+@Callable(cc)
976+func setCloseOnly () = if ((cc.caller != ak()))
977+ then throw("Invalid setCloseOnly params")
978+ else [BooleanEntry(n, true)]
979+
980+
981+
982+@Callable(cc)
983+func unsetCloseOnly () = if ((cc.caller != ak()))
984+ then throw("Invalid unsetCloseOnly params")
985+ else [BooleanEntry(n, false)]
986+
987+
988+
989+@Callable(cc)
990+func addLiquidity (cy) = if (if ((cc.caller != ak()))
816991 then true
817- else (0 >= cf))
992+ else (0 >= cy))
818993 then throw("Invalid addLiquidity params")
819994 else {
820- let ck = bq()
821- let cl = br()
822- let fi = aK(ck, cl)
823- let fL = aK(cf, fi)
824- let fM = (ck + cf)
825- let fN = (cl + fL)
826- fo(fM, fN)
995+ let cD = bD()
996+ let cF = bE()
997+ let cE = bF()
998+ let cG = bG()
999+ let gl = aP(aR(cD, cE), aR(cF, cG))
1000+ let gX = aP(cy, gl)
1001+ let gY = (cD + cy)
1002+ let gZ = (cF + gX)
1003+ gr(gY, gZ)
8271004 }
8281005
8291006
8301007
831-@Callable(bK)
832-func removeLiquidity (cf) = if (if ((bK.caller != af()))
1008+@Callable(cc)
1009+func removeLiquidity (cy) = if (if ((cc.caller != ak()))
8331010 then true
834- else (0 >= cf))
1011+ else (0 >= cy))
8351012 then throw("Invalid removeLiquidity params")
8361013 else {
837- let ck = bq()
838- let cl = br()
839- let fi = aK(ck, cl)
840- let fO = aK(cf, fi)
841- let fM = (ck - cf)
842- let fN = (cl - fO)
843- fo(fM, fN)
1014+ let cD = bD()
1015+ let cF = bE()
1016+ let cE = bF()
1017+ let cG = bG()
1018+ let gl = aP(aR(cD, cE), aR(cF, cG))
1019+ let ha = aP(cy, gl)
1020+ let gY = (cD - cy)
1021+ let gZ = (cF - ha)
1022+ gr(gY, gZ)
8441023 }
8451024
8461025
8471026
848-@Callable(bK)
849-func changeSettings (eN,eO,eP,eQ,eR,eS,eT,eU,eV) = if ((bK.caller != af()))
1027+@Callable(cc)
1028+func changeSettings (fN,fO,fP,fQ,fR,fS,fT,fU,fV,dI) = if ((cc.caller != ak()))
8501029 then throw("Invalid changeSettings params")
851- else eM(eN, eO, eP, eQ, eR, eS, eT, eU, eV)
1030+ else fM(fN, fO, fP, fQ, fR, fS, fT, fU, fV, dI)
8521031
8531032
8541033
855-@Callable(bK)
856-func initialize (ck,cl,eQ,eN,eO,eP,eR,fP,fQ,fR,eS,eT,eU,eV) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= ck))
1034+@Callable(cc)
1035+func initialize (cD,cF,fQ,fN,fO,fP,fR,hb,hc,hd,fS,fT,fU,fV,dI) = if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= cD))
8571036 then true
858- else (0 >= cl))
1037+ else (0 >= cF))
8591038 then true
860- else (0 >= eQ))
1039+ else (0 >= fQ))
8611040 then true
862- else (0 >= eN))
1041+ else (0 >= fN))
8631042 then true
864- else (0 >= eO))
1043+ else (0 >= fO))
8651044 then true
866- else (0 >= eP))
1045+ else (0 >= fP))
8671046 then true
868- else (0 >= eR))
1047+ else (0 >= fR))
8691048 then true
870- else (0 >= eS))
1049+ else (0 >= fS))
8711050 then true
872- else (0 >= eT))
1051+ else (0 >= fT))
8731052 then true
874- else (0 >= eU))
1053+ else (0 >= fU))
8751054 then true
876- else (0 >= eV))
1055+ else (0 >= fV))
8771056 then true
878- else cb())
1057+ else (0 >= dI))
1058+ then true
1059+ else ct())
8791060 then throw("Invalid initialize parameters")
880- else ((((fp(ck, cl, 0, 0, 0, 0, 0) ++ eM(eN, eO, eP, eQ, eR, eS, eT, eU, eV)) ++ eW((lastBlock.timestamp + eQ), 0, 0, 0, 0)) ++ fz(0)) ++ [BooleanEntry(k, true), StringEntry(c, fP), StringEntry(a, fQ), StringEntry(M, fR)])
1061+ else ((((gt(cD, cF, 0, 0, 0, 0, 0, 0) ++ fM(fN, fO, fP, fQ, fR, fS, fT, fU, fV, dI)) ++ fW((lastBlock.timestamp + fQ), 0, 0, 0, 0)) ++ gE(0)) ++ [BooleanEntry(l, true), StringEntry(c, hb), StringEntry(a, hc), StringEntry(S, hd)])
8811062
8821063
8831064
884-@Callable(bK)
885-func setInitMarginRatio (eN) = if (if ((0 >= eN))
886- then true
887- else !(cb()))
888- then throw("Invalid setInitMarginRatio parameters")
889- else eM(eN, bz(), bA(), bw(), bo(), bC(), bD(), bB(), bE())
1065+@Callable(cc)
1066+func decreasePosition (gC,he,hf) = {
1067+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1068+ if ((hg == hg))
1069+ then {
1070+ let cl = cb(cc)
1071+ if (if (if (if (if ((0 >= gC))
1072+ then true
1073+ else !(ct()))
1074+ then true
1075+ else !(cd(aP(aI, he), bC(), true)))
1076+ then true
1077+ else !(cs(cl)))
1078+ then true
1079+ else cu())
1080+ then throw("Invalid decreasePosition parameters")
1081+ else {
1082+ let hh = ck(cl)
1083+ let gJ = hh._1
1084+ let hi = hh._2
1085+ let hj = hh._3
1086+ let hk = hh._4
1087+ let hl = if ((gJ > 0))
1088+ then aD
1089+ else aC
1090+ let hm = (hl == aC)
1091+ let hn = aR(gC, he)
1092+ let ho = dZ(cl, aL)
1093+ let hp = ho._1
1094+ let dY = ho._2
1095+ let hq = if ((hp > hn))
1096+ then {
1097+ let hr = cL(hm, hn)
1098+ let et = hr._1
1099+ let cM = hr._2
1100+ let cN = hr._3
1101+ let eB = hr._4
1102+ let hs = aY(et)
1103+ if (if ((hf != 0))
1104+ then (hf > hs)
1105+ else false)
1106+ then throw(((("Too little base asset exchanged, got " + toString(hs)) + " expected ") + toString(hf)))
1107+ else {
1108+ let ey = aP(aR(dY, hs), aY(gJ))
1109+ let ht = cZ(gJ, hi, hk, ey)
1110+ let di = ht._1
1111+ let dj = ht._2
1112+ let de = ht._3
1113+ let eu = hn
1114+ let hu = (dY - ey)
1115+ let hv = if ((gJ > 0))
1116+ then ((hp - eu) - hu)
1117+ else ((hu + hp) - eu)
1118+ let hw = (gJ + et)
1119+ $Tuple12(hw, di, aY(hv), ci(hw), cN, cM, eB, (bI() - hn), (bZ() - (if ((hw > 0))
1120+ then aY(et)
1121+ else 0)), (bY() - (if ((0 > hw))
1122+ then aY(et)
1123+ else 0)), (bK() - (if ((hw > 0))
1124+ then hn
1125+ else 0)), (bJ() - (if ((0 > hw))
1126+ then hn
1127+ else 0)))
1128+ }
1129+ }
1130+ else throw("Close position first")
1131+ let hw = hq._1
1132+ let hx = hq._2
1133+ let hy = hq._3
1134+ let hz = hq._4
1135+ let cN = hq._5
1136+ let cM = hq._6
1137+ let eB = hq._7
1138+ let eE = hq._8
1139+ let eC = hq._9
1140+ let eD = hq._10
1141+ let hA = hq._11
1142+ let hB = hq._12
1143+ let hC = invoke(aq(), "notifyNotional", [cl, hy], nil)
1144+ if ((hC == hC))
1145+ then (gg(cl, hw, hx, hy, hz) ++ gt(cM, cN, eB, eE, eC, eD, hA, hB))
1146+ else throw("Strict value is not equal to itself.")
1147+ }
1148+ }
1149+ else throw("Strict value is not equal to itself.")
1150+ }
8901151
8911152
8921153
893-@Callable(bK)
894-func decreasePosition (fx,fS,fT) = if (if (if (if (if ((0 >= fx))
895- then true
896- else !(cb()))
897- then true
898- else !(bL(aK(aD, fS), bp(), true)))
899- then true
900- else !(ca(toString(bK.caller))))
901- then true
902- else cc())
903- then throw("Invalid decreasePosition parameters")
904- else {
905- let fU = bS(toString(bK.caller))
906- let fE = fU._1
907- let fV = fU._2
908- let fW = fU._3
909- let fX = fU._4
910- let fY = if ((fE > 0))
911- then az
912- else ay
913- let fZ = (fY == ay)
914- let ga = aM(fx, fS)
915- let gb = du(toString(bK.caller), aG)
916- let gc = gb._1
917- let dt = gb._2
918- let gd = if ((gc > ga))
919- then {
920- let ge = cj(fZ, ga)
921- let dO = ge._1
922- let cm = ge._2
923- let cn = ge._3
924- let dW = ge._4
925- let dX = ge._5
926- let gf = aN(dO)
927- if (if ((fT != 0))
928- then (fT > gf)
1154+@Callable(cc)
1155+func increasePosition (hl,he,hf,hD) = {
1156+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1157+ if ((hg == hg))
1158+ then {
1159+ let cl = cb(cc)
1160+ let hE = cc.payments[0].amount
1161+ let ay = cc.payments[0].assetId
1162+ let hF = toBase58String(value(ay))
1163+ let hG = (ay == am())
1164+ let hH = ax(hF)
1165+ if (if (if (if (if (if (if (if (if ((hl != aC))
1166+ then (hl != aD)
1167+ else false)
1168+ then true
1169+ else (0 >= hE))
1170+ then true
1171+ else !(ct()))
1172+ then true
1173+ else if (!(hG))
1174+ then !(hH)
9291175 else false)
930- then throw(((("Too little base asset exchanged, got " + toString(gf)) + " expected ") + toString(fT)))
931- else {
932- let dT = aK(aM(dt, gf), aN(fE))
933- let gg = cA(fE, fV, fX, dT)
934- let cJ = gg._1
935- let cK = gg._2
936- let cF = gg._3
937- let dP = ga
938- let gh = (dt - dT)
939- let gi = if ((fE > 0))
940- then ((gc - dP) - gh)
941- else ((gh + gc) - dP)
942- let gj = (fE + dO)
943- $Tuple11(gj, cJ, aN(gi), bQ(gj), cn, cm, dW, dX, (bu() - ga), (bI() - (if ((gj > 0))
944- then aN(dO)
945- else 0)), (bH() - (if ((0 > gj))
946- then aN(dO)
947- else 0)))
948- }
949- }
950- else throw("Close position first")
951- let gj = gd._1
952- let gk = gd._2
953- let gl = gd._3
954- let gm = gd._4
955- let cn = gd._5
956- let cm = gd._6
957- let dW = gd._7
958- let dX = gd._8
959- let ea = gd._9
960- let dY = gd._10
961- let dZ = gd._11
962- let gn = invoke(al(), "notifyNotional", [toString(bK.caller), gl], nil)
963- if ((gn == gn))
964- then (fd(toString(bK.caller), gj, gk, gl, gm) ++ fp(cm, cn, dW, dX, ea, dY, dZ))
965- else throw("Strict value is not equal to itself.")
966- }
967-
968-
969-
970-@Callable(bK)
971-func increasePosition (fY,fS,fT,go) = {
972- let bT = toString(bK.caller)
973- let gp = bK.payments[0].amount
974- let au = bK.payments[0].assetId
975- let gq = toBase58String(value(au))
976- let gr = (au == ah())
977- let gs = at(gq)
978- if (if (if (if (if (if (if (if ((fY != ay))
979- then (fY != az)
980- else false)
981- then true
982- else (0 >= gp))
983- then true
984- else !(cb()))
985- then true
986- else if (!(gr))
987- then !(gs)
988- else false)
989- then true
990- else !(fD(bT, gq)))
991- then true
992- else !(bL(aK(aD, fS), bp(), true)))
993- then true
994- else cc())
995- then throw("Invalid increasePosition parameters")
996- else {
997- let eF = bo()
998- let gt = eE(bK)
999- let eK = gt._1
1000- let eL = gt._2
1001- let gu = aM(gp, eK)
1002- let fx = (gp - gu)
1003- let gv = if (gs)
1004- then {
1005- let gw = invoke(aq(), "borrow", [bT], [AttachedPayment(au, fx)])
1006- if ((gw == gw))
1176+ then true
1177+ else !(gI(cl, hF)))
1178+ then true
1179+ else !(cd(aP(aI, he), bC(), true)))
1180+ then true
1181+ else cu())
1182+ then true
1183+ else cv())
1184+ then throw("Invalid increasePosition parameters")
1185+ else {
1186+ let hI = gQ(cl, gV(cc))
1187+ let fK = hI._1
1188+ let fL = hI._2
1189+ let hJ = aR(hE, fK)
1190+ let gC = (hE - hJ)
1191+ let hK = if (hH)
10071192 then {
1008- let gx = assetBalance(this, ah())
1009- if ((gx == gx))
1193+ let hL = invoke(au(), "borrow", [cl], [AttachedPayment(ay, gC)])
1194+ if ((hL == hL))
10101195 then {
1011- let gy = invoke(ar(), "swap", [toBase58String(ah()), 0], [AttachedPayment(au, gu)])
1012- if ((gy == gy))
1196+ let hM = assetBalance(this, am())
1197+ if ((hM == hM))
10131198 then {
1014- let gz = assetBalance(this, ah())
1015- if ((gz == gz))
1199+ let hN = invoke(av(), "swap", [toBase58String(am()), 0], [AttachedPayment(ay, hJ)])
1200+ if ((hN == hN))
10161201 then {
1017- let gA = (gz - gx)
1018- if ((gA == gA))
1019- then gA
1202+ let hO = assetBalance(this, am())
1203+ if ((hO == hO))
1204+ then {
1205+ let hP = (hO - hM)
1206+ if ((hP == hP))
1207+ then hP
1208+ else throw("Strict value is not equal to itself.")
1209+ }
1210+ else throw("Strict value is not equal to itself.")
1211+ }
1212+ else throw("Strict value is not equal to itself.")
1213+ }
1214+ else throw("Strict value is not equal to itself.")
1215+ }
1216+ else throw("Strict value is not equal to itself.")
1217+ }
1218+ else hJ
1219+ if ((hK == hK))
1220+ then {
1221+ let hQ = invoke(as(), "acceptPaymentWithLink", [cl, hD], [AttachedPayment(am(), hK)])
1222+ if ((hQ == hQ))
1223+ then {
1224+ let hR = {
1225+ let cn = hQ
1226+ if ($isInstanceOf(cn, "Int"))
1227+ then {
1228+ let gT = cn
1229+ gT
1230+ }
1231+ else throw("Invalid referrerFee")
1232+ }
1233+ let hS = (hK - hR)
1234+ let hT = ck(cl)
1235+ let gJ = hT._1
1236+ let hi = hT._2
1237+ let hj = hT._3
1238+ let hk = hT._4
1239+ let ge = (gJ == 0)
1240+ let hU = if ((gJ > 0))
1241+ then (hl == aC)
1242+ else (hl == aD)
1243+ let hV = if (!(ge))
1244+ then hU
1245+ else false
1246+ let hm = (hl == aC)
1247+ let hW = if (if (ge)
1248+ then true
1249+ else hV)
1250+ then {
1251+ let hn = aR(gC, he)
1252+ let hX = cL(hm, hn)
1253+ let cP = hX._1
1254+ let cM = hX._2
1255+ let cN = hX._3
1256+ let eB = hX._4
1257+ if (if ((hf != 0))
1258+ then (hf > aY(cP))
1259+ else false)
1260+ then throw(((("Limit error: " + toString(aY(cP))) + " < ") + toString(hf)))
1261+ else {
1262+ let hw = (gJ + cP)
1263+ let hA = (bK() + (if ((hw > 0))
1264+ then hn
1265+ else 0))
1266+ let hB = (bJ() + (if ((0 > hw))
1267+ then hn
1268+ else 0))
1269+ let hY = aP(hn, he)
1270+ let hZ = cZ(gJ, hi, hk, hY)
1271+ let di = hZ._1
1272+ let dT = hZ._2
1273+ let dU = hZ._3
1274+ if (!(dA(cM, cN)))
1275+ then throw("Over max spread limit")
1276+ else if (!(dF(hA, hB)))
1277+ then throw("Over max open notional")
1278+ else $Tuple12(hw, di, (hj + hn), ci(hw), cN, cM, eB, (bI() + hn), (bZ() + (if ((hw > 0))
1279+ then aY(cP)
1280+ else 0)), (bY() + (if ((0 > hw))
1281+ then aY(cP)
1282+ else 0)), hA, hB)
1283+ }
1284+ }
1285+ else {
1286+ let hn = aR(gC, he)
1287+ let ia = dZ(toString(cc.caller), aL)
1288+ let hp = ia._1
1289+ let dY = ia._2
1290+ if ((hp > hn))
1291+ then throw("Use decreasePosition to decrease position size")
1292+ else throw("Close position first")
1293+ }
1294+ let hw = hW._1
1295+ let hx = hW._2
1296+ let hy = hW._3
1297+ let hz = hW._4
1298+ let cN = hW._5
1299+ let cM = hW._6
1300+ let eB = hW._7
1301+ let eE = hW._8
1302+ let eC = hW._9
1303+ let eD = hW._10
1304+ let hA = hW._11
1305+ let hB = hW._12
1306+ let ib = (hS / 2)
1307+ let ic = (hS - ib)
1308+ let id = invoke(ap(), "addLocked", nil, [AttachedPayment(am(), gC)])
1309+ if ((id == id))
1310+ then {
1311+ let ie = invoke(ap(), "addFree", nil, [AttachedPayment(am(), ic)])
1312+ if ((ie == ie))
1313+ then {
1314+ let if = invoke(aq(), "notifyFees", [cl, hS], nil)
1315+ if ((if == if))
1316+ then {
1317+ let hC = invoke(aq(), "notifyNotional", [cl, hy], nil)
1318+ if ((hC == hC))
1319+ then ((((((gg(cl, hw, hx, hy, hz) ++ gd(ge, cl)) ++ gc(cl, hF)) ++ gt(cM, cN, eB, eE, eC, eD, hA, hB)) ++ gF(ib)) ++ gE((bA() + gC))) ++ gG(fL, cc))
1320+ else throw("Strict value is not equal to itself.")
1321+ }
10201322 else throw("Strict value is not equal to itself.")
10211323 }
10221324 else throw("Strict value is not equal to itself.")
10231325 }
10241326 else throw("Strict value is not equal to itself.")
10251327 }
10261328 else throw("Strict value is not equal to itself.")
10271329 }
10281330 else throw("Strict value is not equal to itself.")
10291331 }
1030- else gu
1031- if ((gv == gv))
1032- then {
1033- let gB = invoke(an(), "acceptPaymentWithLink", [bT, go], [AttachedPayment(ah(), gv)])
1034- if ((gB == gB))
1332+ }
1333+ else throw("Strict value is not equal to itself.")
1334+ }
1335+
1336+
1337+
1338+@Callable(cc)
1339+func addMargin () = {
1340+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1341+ if ((hg == hg))
1342+ then {
1343+ let cl = toString(cc.caller)
1344+ let hE = cc.payments[0].amount
1345+ let ay = cc.payments[0].assetId
1346+ let hF = toBase58String(value(ay))
1347+ let hG = (ay == am())
1348+ let hH = ax(hF)
1349+ if (if (if (if (if (if (if (!(hG))
1350+ then !(hH)
1351+ else false)
1352+ then true
1353+ else !(cs(toString(cc.caller))))
1354+ then true
1355+ else !(gK(cl, hF)))
1356+ then true
1357+ else !(ct()))
1358+ then true
1359+ else cu())
1360+ then true
1361+ else cv())
1362+ then throw("Invalid addMargin parameters")
1363+ else {
1364+ let ig = gQ(cl, gV(cc))
1365+ let fK = ig._1
1366+ let fL = ig._2
1367+ let hJ = aR(hE, fK)
1368+ let gC = (hE - hJ)
1369+ let hK = if (hH)
10351370 then {
1036- let gC = {
1037- let bV = gB
1038- if ($isInstanceOf(bV, "Int"))
1039- then {
1040- let gD = bV
1041- gD
1371+ let hL = invoke(au(), "borrow", [cl], [AttachedPayment(ay, gC)])
1372+ if ((hL == hL))
1373+ then {
1374+ let hM = assetBalance(this, am())
1375+ if ((hM == hM))
1376+ then {
1377+ let hN = invoke(av(), "swap", [toBase58String(am()), 0], [AttachedPayment(ay, hJ)])
1378+ if ((hN == hN))
1379+ then {
1380+ let hO = assetBalance(this, am())
1381+ if ((hO == hO))
1382+ then {
1383+ let hP = (hO - hM)
1384+ if ((hP == hP))
1385+ then hP
1386+ else throw("Strict value is not equal to itself.")
1387+ }
1388+ else throw("Strict value is not equal to itself.")
1389+ }
1390+ else throw("Strict value is not equal to itself.")
1391+ }
1392+ else throw("Strict value is not equal to itself.")
1393+ }
1394+ else throw("Strict value is not equal to itself.")
1395+ }
1396+ else hJ
1397+ if ((hK == hK))
1398+ then {
1399+ let hQ = invoke(as(), "acceptPayment", [cl], [AttachedPayment(am(), hK)])
1400+ if ((hQ == hQ))
1401+ then {
1402+ let hR = {
1403+ let cn = hQ
1404+ if ($isInstanceOf(cn, "Int"))
1405+ then {
1406+ let gT = cn
1407+ gT
1408+ }
1409+ else throw("Invalid referrerFee")
10421410 }
1043- else throw("Invalid referrerFee")
1044- }
1045- let gE = (gv - gC)
1046- let gF = bS(bT)
1047- let fE = gF._1
1048- let fV = gF._2
1049- let fW = gF._3
1050- let fX = gF._4
1051- let gG = (fE == 0)
1052- let gH = if ((fE > 0))
1053- then (fY == ay)
1054- else (fY == az)
1055- let gI = if (!(gG))
1056- then gH
1057- else false
1058- let fZ = (fY == ay)
1059- let gJ = if (if (gG)
1060- then true
1061- else gI)
1062- then {
1063- let ga = aM(fx, fS)
1064- let gK = cj(fZ, ga)
1065- let cp = gK._1
1066- let cm = gK._2
1067- let cn = gK._3
1068- let dW = gK._4
1069- let dX = gK._5
1070- if (if ((fT != 0))
1071- then (fT > aN(cp))
1072- else false)
1073- then throw(((("Limit error: " + toString(aN(cp))) + " < ") + toString(fT)))
1074- else {
1075- let gj = (fE + cp)
1076- let gL = aK(ga, fS)
1077- let gM = cA(fE, fV, fX, gL)
1078- let cJ = gM._1
1079- let do = gM._2
1080- let dp = gM._3
1081- if (!(cZ(cm, cn)))
1082- then throw("Over max spread limit")
1083- else $Tuple11(gj, cJ, (fW + ga), bQ(gj), cn, cm, dW, dX, (bu() + ga), (bI() + (if ((gj > 0))
1084- then aN(cp)
1085- else 0)), (bH() + (if ((0 > gj))
1086- then aN(cp)
1087- else 0)))
1088- }
1089- }
1090- else {
1091- let ga = aM(fx, fS)
1092- let gN = du(toString(bK.caller), aG)
1093- let gc = gN._1
1094- let dt = gN._2
1095- if ((gc > ga))
1096- then throw("Use decreasePosition to decrease position size")
1097- else throw("Close position first")
1098- }
1099- let gj = gJ._1
1100- let gk = gJ._2
1101- let gl = gJ._3
1102- let gm = gJ._4
1103- let cn = gJ._5
1104- let cm = gJ._6
1105- let dW = gJ._7
1106- let dX = gJ._8
1107- let ea = gJ._9
1108- let dY = gJ._10
1109- let dZ = gJ._11
1110- let gO = (gE / 2)
1111- let gP = (gE - gO)
1112- let gQ = invoke(ao(), "deposit", nil, [AttachedPayment(ah(), fx)])
1113- if ((gQ == gQ))
1114- then {
1115- let gR = invoke(ak(), "deposit", nil, [AttachedPayment(ah(), gP)])
1116- if ((gR == gR))
1411+ let hS = (hK - hR)
1412+ let ih = ck(cl)
1413+ let gJ = ih._1
1414+ let hi = ih._2
1415+ let hj = ih._3
1416+ let hk = ih._4
1417+ let ib = (hS / 2)
1418+ let ic = (hS - ib)
1419+ let id = invoke(ap(), "addLocked", nil, [AttachedPayment(am(), gC)])
1420+ if ((id == id))
11171421 then {
1118- let gS = invoke(al(), "notifyFees", [bT, gE], nil)
1119- if ((gS == gS))
1422+ let ie = invoke(ap(), "addFree", nil, [AttachedPayment(am(), ic)])
1423+ if ((ie == ie))
11201424 then {
1121- let gn = invoke(al(), "notifyNotional", [bT, gl], nil)
1122- if ((gn == gn))
1123- then (((((fd(bT, gj, gk, gl, gm) ++ fc(bT, gq)) ++ fp(cm, cn, dW, dX, ea, dY, dZ)) ++ fA(gO)) ++ fz((bn() + fx))) ++ fB(eL, bK))
1425+ let if = invoke(aq(), "notifyFees", [cl, hS], nil)
1426+ if ((if == if))
1427+ then (((gg(cl, gJ, (hi + gC), hj, hk) ++ gF(ib)) ++ gE((bA() + gC))) ++ gG(fL, cc))
11241428 else throw("Strict value is not equal to itself.")
11251429 }
11261430 else throw("Strict value is not equal to itself.")
11271431 }
11281432 else throw("Strict value is not equal to itself.")
11291433 }
11301434 else throw("Strict value is not equal to itself.")
11311435 }
11321436 else throw("Strict value is not equal to itself.")
11331437 }
1134- else throw("Strict value is not equal to itself.")
11351438 }
1439+ else throw("Strict value is not equal to itself.")
11361440 }
11371441
11381442
11391443
1140-@Callable(bK)
1141-func addMargin () = {
1142- let bT = toString(bK.caller)
1143- let gp = bK.payments[0].amount
1144- let au = bK.payments[0].assetId
1145- let gq = toBase58String(value(au))
1146- let gr = (au == ah())
1147- let gs = at(gq)
1148- if (if (if (if (if (if (!(gr))
1149- then !(gs)
1150- else false)
1151- then true
1152- else !(ca(toString(bK.caller))))
1153- then true
1154- else !(fF(bT, gq)))
1155- then true
1156- else !(cb()))
1157- then true
1158- else cc())
1159- then throw("Invalid addMargin parameters")
1160- else {
1161- let gT = eE(bK)
1162- let eK = gT._1
1163- let eL = gT._2
1164- let gu = aM(gp, eK)
1165- let fx = (gp - gu)
1166- let gv = if (gs)
1167- then {
1168- let gw = invoke(aq(), "borrow", [bT], [AttachedPayment(au, fx)])
1169- if ((gw == gw))
1170- then {
1171- let gx = assetBalance(this, ah())
1172- if ((gx == gx))
1173- then {
1174- let gy = invoke(ar(), "swap", [toBase58String(ah()), 0], [AttachedPayment(au, gu)])
1175- if ((gy == gy))
1444+@Callable(cc)
1445+func removeMargin (gC) = {
1446+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1447+ if ((hg == hg))
1448+ then {
1449+ let cl = toString(cc.caller)
1450+ if (if (if (if ((0 >= gC))
1451+ then true
1452+ else !(cs(cl)))
1453+ then true
1454+ else !(ct()))
1455+ then true
1456+ else cu())
1457+ then throw("Invalid removeMargin parameters")
1458+ else {
1459+ let ii = ck(cl)
1460+ let gJ = ii._1
1461+ let hi = ii._2
1462+ let hj = ii._3
1463+ let hk = ii._4
1464+ let ij = -(gC)
1465+ let ik = cZ(gJ, hi, hk, ij)
1466+ let di = ik._1
1467+ let dj = ik._2
1468+ if ((dj != 0))
1469+ then throw("Invalid removed margin amount")
1470+ else {
1471+ let il = ee(di, dj, hj)
1472+ if (!(cd(il, bC(), true)))
1473+ then throw(((("Too much margin removed: " + toString(il)) + " < ") + toString(bC())))
1474+ else {
1475+ let im = toBase58String(am())
1476+ let in = gN(cl)
1477+ let io = in._1
1478+ let ip = in._2
1479+ let iq = if ((gC > io))
1480+ then io
1481+ else gC
1482+ let ir = if ((io > gC))
1483+ then 0
1484+ else (gC - io)
1485+ let is = (io - iq)
1486+ let it = if ((is > 0))
1487+ then nil
1488+ else gc(cl, im)
1489+ let iu = if (((iq + ir) != gC))
1490+ then throw(((((("toRepay=" + toString(iq)) + " + toWithdraw=") + toString(ir)) + " != ") + toString(gC)))
1491+ else nil
1492+ if ((iu == iu))
11761493 then {
1177- let gz = assetBalance(this, ah())
1178- if ((gz == gz))
1494+ let iv = invoke(ap(), "withdrawLocked", [gC], nil)
1495+ if ((iv == iv))
11791496 then {
1180- let gA = (gz - gx)
1181- if ((gA == gA))
1182- then gA
1497+ let iw = if ((iq > 0))
1498+ then {
1499+ let ix = invoke(au(), "repay", [cl, ip], [AttachedPayment(am(), iq)])
1500+ if ((ix == ix))
1501+ then [ScriptTransfer(cc.caller, iq, fromBase58String(ip))]
1502+ else throw("Strict value is not equal to itself.")
1503+ }
1504+ else nil
1505+ if ((iw == iw))
1506+ then ((((gg(cl, gJ, di, hj, ci(gJ)) ++ (if ((ir > 0))
1507+ then gB(cc.caller, ir)
1508+ else nil)) ++ gE((bA() - gC))) ++ it) ++ iw)
11831509 else throw("Strict value is not equal to itself.")
11841510 }
11851511 else throw("Strict value is not equal to itself.")
11861512 }
11871513 else throw("Strict value is not equal to itself.")
11881514 }
1189- else throw("Strict value is not equal to itself.")
11901515 }
1191- else throw("Strict value is not equal to itself.")
11921516 }
1193- else gu
1194- if ((gv == gv))
1195- then {
1196- let gB = invoke(an(), "acceptPayment", [bT], [AttachedPayment(ah(), gv)])
1197- if ((gB == gB))
1198- then {
1199- let gC = {
1200- let bV = gB
1201- if ($isInstanceOf(bV, "Int"))
1202- then {
1203- let gD = bV
1204- gD
1205- }
1206- else throw("Invalid referrerFee")
1207- }
1208- let gE = (gv - gC)
1209- let gU = bS(bT)
1210- let fE = gU._1
1211- let fV = gU._2
1212- let fW = gU._3
1213- let fX = gU._4
1214- let gO = (gE / 2)
1215- let gP = (gE - gO)
1216- let gQ = invoke(ao(), "deposit", nil, [AttachedPayment(ah(), fx)])
1217- if ((gQ == gQ))
1218- then {
1219- let gR = invoke(ak(), "deposit", nil, [AttachedPayment(ah(), gP)])
1220- if ((gR == gR))
1221- then {
1222- let gS = invoke(al(), "notifyFees", [bT, gE], nil)
1223- if ((gS == gS))
1224- then (((fd(bT, fE, (fV + fx), fW, fX) ++ fA(gO)) ++ fz((bn() + fx))) ++ fB(eL, bK))
1225- else throw("Strict value is not equal to itself.")
1226- }
1227- else throw("Strict value is not equal to itself.")
1228- }
1229- else throw("Strict value is not equal to itself.")
1230- }
1231- else throw("Strict value is not equal to itself.")
1232- }
1233- else throw("Strict value is not equal to itself.")
12341517 }
1518+ else throw("Strict value is not equal to itself.")
12351519 }
12361520
12371521
12381522
1239-@Callable(bK)
1240-func removeMargin (fx) = {
1241- let bT = toString(bK.caller)
1242- if (if (if (if ((0 >= fx))
1243- then true
1244- else !(ca(bT)))
1245- then true
1246- else !(cb()))
1247- then true
1248- else cc())
1249- then throw("Invalid removeMargin parameters")
1250- else {
1251- let gV = bS(bT)
1252- let fE = gV._1
1253- let fV = gV._2
1254- let fW = gV._3
1255- let fX = gV._4
1256- let gW = -(fx)
1257- let gX = cA(fE, fV, fX, gW)
1258- let cJ = gX._1
1259- let cK = gX._2
1260- if ((cK != 0))
1261- then throw("Invalid removed margin amount")
1523+@Callable(cc)
1524+func closePosition (gh,iy) = {
1525+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1526+ if ((hg == hg))
1527+ then {
1528+ let cl = cb(cc)
1529+ let iz = valueOrErrorMessage(addressFromString(cl), "Invalid caller")
1530+ if (if (if (if (if (!(cs(cl)))
1531+ then true
1532+ else !(ct()))
1533+ then true
1534+ else cu())
1535+ then true
1536+ else (0 >= gh))
1537+ then true
1538+ else (0 > iy))
1539+ then throw("Invalid closePosition parameters")
12621540 else {
1263- let gY = dz(cJ, cK, fW)
1264- if (!(bL(gY, bp(), true)))
1265- then throw(((("Too much margin removed: " + toString(gY)) + " < ") + toString(bp())))
1541+ let iA = ck(cl)
1542+ let gJ = iA._1
1543+ let hi = iA._2
1544+ let hj = iA._3
1545+ let hk = iA._4
1546+ let iB = if ((aY(gJ) > gh))
1547+ then {
1548+ let hl = if ((gJ > 0))
1549+ then aD
1550+ else aC
1551+ let hm = (hl == aC)
1552+ let iC = du((gJ > 0), gh, true)
1553+ let eu = iC._1
1554+ let cM = iC._2
1555+ let cN = iC._3
1556+ let eB = iC._4
1557+ let et = if ((gJ > 0))
1558+ then -(gh)
1559+ else gh
1560+ let iD = dZ(cl, aL)
1561+ let hp = iD._1
1562+ let dY = iD._2
1563+ let iE = aP(aY(et), aY(gJ))
1564+ let ey = aR(dY, iE)
1565+ let iF = cZ(gJ, hi, hk, ey)
1566+ let di = iF._1
1567+ let iG = iF._2
1568+ let de = iF._3
1569+ let hu = (dY - ey)
1570+ let hv = if ((gJ > 0))
1571+ then ((hp - eu) - hu)
1572+ else ((hu + hp) - eu)
1573+ let iH = aR(di, iE)
1574+ let hw = (gJ + et)
1575+ let hy = aY(hv)
1576+ let iI = ci(hw)
1577+ let eE = (bI() - eu)
1578+ if (if ((iy != 0))
1579+ then (iy > eu)
1580+ else false)
1581+ then throw(((("Limit error: " + toString(eu)) + " < ") + toString(iy)))
1582+ else $Tuple15(hw, iH, hy, iI, iG, ey, (aY((di - iH)) + ey), cM, cN, eB, eE, (bZ() - (if ((hw > 0))
1583+ then aY(et)
1584+ else 0)), (bY() - (if ((0 > hw))
1585+ then aY(et)
1586+ else 0)), (bK() - (if ((hw > 0))
1587+ then eu
1588+ else 0)), (bJ() - (if ((0 > hw))
1589+ then eu
1590+ else 0)))
1591+ }
1592+ else if ((gh > aY(gJ)))
1593+ then throw("Invalid closePosition parameters")
1594+ else {
1595+ let iJ = ev(cl, true)
1596+ let eu = iJ._1
1597+ let iG = iJ._2
1598+ let ey = iJ._3
1599+ let ez = iJ._4
1600+ let cM = iJ._5
1601+ let cN = iJ._6
1602+ let eB = iJ._7
1603+ let eE = iJ._8
1604+ let dU = iJ._9
1605+ let eC = iJ._10
1606+ let eD = iJ._11
1607+ let hA = iJ._12
1608+ let hB = iJ._13
1609+ if (if ((iy != 0))
1610+ then (iy > eu)
1611+ else false)
1612+ then throw(((("Limit error: " + toString(eu)) + " < ") + toString(iy)))
1613+ else $Tuple15(0, 0, 0, 0, iG, ey, ez, cM, cN, eB, eE, eC, eD, hA, hB)
1614+ }
1615+ let hw = iB._1
1616+ let iH = iB._2
1617+ let hy = iB._3
1618+ let iI = iB._4
1619+ let iG = iB._5
1620+ let ey = iB._6
1621+ let ez = iB._7
1622+ let cM = iB._8
1623+ let cN = iB._9
1624+ let eB = iB._10
1625+ let eE = iB._11
1626+ let eC = iB._12
1627+ let eD = iB._13
1628+ let hA = iB._14
1629+ let hB = iB._15
1630+ if ((iG > 0))
1631+ then throw("Unable to close position with bad debt")
12661632 else {
1267- let gZ = toBase58String(ah())
1268- let ha = fI(bT)
1269- let hb = ha._1
1270- let hc = ha._2
1271- let hd = if ((fx > hb))
1272- then hb
1273- else fx
1274- let he = if ((hb > fx))
1275- then 0
1276- else (fx - hb)
1277- let hf = (hb - hd)
1278- let hg = if ((hf > 0))
1279- then nil
1280- else fc(bT, gZ)
1281- let hh = if (((hd + he) != fx))
1282- then throw(((((("toRepay=" + toString(hd)) + " + toWithdraw=") + toString(he)) + " != ") + toString(fx)))
1283- else nil
1284- if ((hh == hh))
1633+ let iK = aY(ez)
1634+ let iL = (bA() - iK)
1635+ let iM = if ((0 > iL))
1636+ then $Tuple2(0, aY(iL))
1637+ else $Tuple2(iL, 0)
1638+ let iN = iM._1
1639+ let iO = iM._2
1640+ let iP = invoke(ap(), "withdrawLocked", [iK], nil)
1641+ if ((iP == iP))
12851642 then {
1286- let hi = invoke(ao(), "withdraw", [gZ, fx], nil)
1287- if ((hi == hi))
1643+ let iQ = gN(cl)
1644+ let io = iQ._1
1645+ let ip = iQ._2
1646+ let iR = if ((io > 0))
1647+ then if ((iK >= io))
1648+ then {
1649+ let ix = invoke(au(), "repay", [cl, ip], [AttachedPayment(am(), io)])
1650+ if ((ix == ix))
1651+ then $Tuple2([ScriptTransfer(iz, io, fromBase58String(ip))], (iK - io))
1652+ else throw("Strict value is not equal to itself.")
1653+ }
1654+ else {
1655+ let iS = invoke(au(), "realizePartiallyAndClose", [cl, ip], [AttachedPayment(am(), iK)])
1656+ if ((iS == iS))
1657+ then $Tuple2([ScriptTransfer(iz, iK, fromBase58String(ip))], 0)
1658+ else throw("Strict value is not equal to itself.")
1659+ }
1660+ else $Tuple2(nil, iK)
1661+ if ((iR == iR))
12881662 then {
1289- let hj = if ((hd > 0))
1290- then {
1291- let hk = invoke(aq(), "repay", [bT, hc], [AttachedPayment(ah(), hd)])
1292- if ((hk == hk))
1293- then [ScriptTransfer(bK.caller, hd, fromBase58String(hc))]
1294- else throw("Strict value is not equal to itself.")
1295- }
1296- else nil
1297- if ((hj == hj))
1298- then (fd(bT, fE, cJ, fW, bQ(fE)) ++ (if ((he > 0))
1299- then fw(bK.caller, he)
1300- else (((nil ++ fz((bn() - fx))) ++ hg) ++ hj)))
1663+ let iT = iR._2
1664+ let iU = iR._1
1665+ let hC = invoke(aq(), "notifyNotional", [cl, 0], nil)
1666+ if ((hC == hC))
1667+ then (((((if ((hw == 0))
1668+ then gA(cl)
1669+ else gg(cl, hw, iH, hy, iI)) ++ gt(cM, cN, eB, eE, eC, eD, hA, hB)) ++ (if ((iT > 0))
1670+ then gB(iz, iT)
1671+ else nil)) ++ gE(iN)) ++ iU)
13011672 else throw("Strict value is not equal to itself.")
13021673 }
13031674 else throw("Strict value is not equal to itself.")
13041675 }
13051676 else throw("Strict value is not equal to itself.")
13061677 }
13071678 }
13081679 }
1680+ else throw("Strict value is not equal to itself.")
13091681 }
13101682
13111683
13121684
1313-@Callable(bK)
1314-func closePosition () = {
1315- let bT = bJ(bK)
1316- let hl = valueOrErrorMessage(addressFromString(bT), "Invalid caller")
1317- if (if (if (!(ca(bT)))
1318- then true
1319- else !(cb()))
1320- then true
1321- else cc())
1322- then throw("Invalid closePosition parameters")
1323- else {
1324- let hm = dQ(bT, true)
1325- let do = hm._1
1326- let hn = hm._2
1327- let dT = hm._3
1328- let dU = hm._4
1329- let cm = hm._5
1330- let cn = hm._6
1331- let dW = hm._7
1332- let dX = hm._8
1333- let ea = hm._9
1334- let dp = hm._10
1335- let dY = hm._11
1336- let dZ = hm._12
1337- if ((hn > 0))
1338- then throw("Unable to close position with bad debt")
1339- else {
1340- let ho = aN(dU)
1341- let hp = (bn() - ho)
1342- let hq = if ((0 > hp))
1343- then $Tuple2(0, aN(hp))
1344- else $Tuple2(hp, 0)
1345- let hr = hq._1
1346- let hs = hq._2
1347- let gD = if ((hs > 0))
1348- then {
1349- let ht = invoke(ak(), "withdraw", [hs], nil)
1350- if ((ht == ht))
1351- then nil
1352- else throw("Strict value is not equal to itself.")
1353- }
1354- else nil
1355- if ((gD == gD))
1356- then {
1357- let hu = invoke(ao(), "withdraw", [toBase58String(ah()), (ho - hs)], nil)
1358- if ((hu == hu))
1359- then {
1360- let hv = fI(bT)
1361- let hb = hv._1
1362- let hc = hv._2
1363- let hw = if ((hb > 0))
1364- then if ((ho >= hb))
1365- then {
1366- let hk = invoke(aq(), "repay", [bT, hc], [AttachedPayment(ah(), hb)])
1367- if ((hk == hk))
1368- then $Tuple2([ScriptTransfer(hl, hb, fromBase58String(hc))], (ho - hb))
1369- else throw("Strict value is not equal to itself.")
1370- }
1371- else {
1372- let hx = invoke(aq(), "realizePartiallyAndClose", [bT, hc], [AttachedPayment(ah(), ho)])
1373- if ((hx == hx))
1374- then $Tuple2([ScriptTransfer(hl, ho, fromBase58String(hc))], 0)
1375- else throw("Strict value is not equal to itself.")
1376- }
1377- else $Tuple2(nil, ho)
1378- if ((hw == hw))
1379- then {
1380- let hy = hw._2
1381- let hz = hw._1
1382- let gn = invoke(al(), "notifyNotional", [bT, 0], nil)
1383- if ((gn == gn))
1384- then ((fv(bT) ++ fp(cm, cn, dW, dX, ea, dY, dZ)) ++ (if ((hy > 0))
1385- then fw(hl, hy)
1386- else ((nil ++ fz(hr)) ++ hz)))
1387- else throw("Strict value is not equal to itself.")
1388- }
1389- else throw("Strict value is not equal to itself.")
1390- }
1391- else throw("Strict value is not equal to itself.")
1392- }
1393- else throw("Strict value is not equal to itself.")
1685+@Callable(cc)
1686+func liquidate (cl) = {
1687+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1688+ if ((hg == hg))
1689+ then {
1690+ let iV = ei(cl, aL)
1691+ let il = if (dK())
1692+ then {
1693+ let iW = ei(cl, aM)
1694+ aZ(iV, iW)
13941695 }
1395- }
1396- }
1397-
1398-
1399-
1400-@Callable(bK)
1401-func liquidate (bT) = {
1402- let hA = dD(bT, aG)
1403- let gY = if (df())
1404- then {
1405- let hB = dD(bT, aH)
1406- aO(hA, hB)
1407- }
1408- else hA
1409- if (if (if (if (!(bL(gY, bz(), false)))
1410- then true
1411- else !(ca(bT)))
1412- then true
1413- else !(cb()))
1414- then true
1415- else cc())
1416- then throw("Unable to liquidate")
1417- else if (if (if ((hA > bA()))
1418- then (bB() > 0)
1419- else false)
1420- then (aD > bB())
1421- else false)
1422- then {
1423- let hC = bS(bT)
1424- let fE = hC._1
1425- let fV = hC._2
1426- let fW = hC._3
1427- let fX = hC._4
1428- let fY = if ((fE > 0))
1429- then az
1430- else ay
1431- let fZ = (fY == ay)
1432- let dP = dJ(bT, fE)
1433- let hD = du(bT, aG)
1434- let gc = hD._1
1435- let dt = hD._2
1436- let hE = cj(fZ, dP)
1437- let dO = hE._1
1438- let cm = hE._2
1439- let cn = hE._3
1440- let dW = hE._4
1441- let dX = hE._5
1442- let hF = aK(aN(dO), aN(fE))
1443- let dT = aM(dt, hF)
1444- let hG = cA(fE, fV, fX, dT)
1445- let cJ = hG._1
1446- let cK = hG._2
1447- let cF = hG._3
1448- let gh = (dt - dT)
1449- let gi = if ((fE > 0))
1450- then ((gc - dP) - gh)
1451- else ((gh + gc) - dP)
1452- let hH = aM(dP, bA())
1453- let hI = (hH / 2)
1454- let gP = (hH - hI)
1455- let hJ = (cJ - hH)
1456- let gj = (fE + dO)
1457- let gl = aN(gi)
1458- let hK = bQ(gj)
1459- let ea = (bu() - dP)
1460- let hp = (bn() - hH)
1461- let hL = if ((0 > hp))
1462- then $Tuple2(0, aN(hp))
1463- else $Tuple2(hp, 0)
1464- let hM = hL._1
1465- let hN = hL._2
1466- let hO = fI(bT)
1467- let hb = hO._1
1468- let hc = hO._2
1469- let hP = if ((hb > 0))
1696+ else iV
1697+ if (if (if (if (!(cd(il, bP(), false)))
1698+ then true
1699+ else !(cs(cl)))
1700+ then true
1701+ else !(ct()))
1702+ then true
1703+ else cu())
1704+ then throw("Unable to liquidate")
1705+ else if (if (if ((iV > bQ()))
1706+ then (bR() > 0)
1707+ else false)
1708+ then (aI > bR())
1709+ else false)
14701710 then {
1471- let hQ = aM(hb, hF)
1472- let hx = invoke(aq(), "realizePartially", [bT, hc, hQ], nil)
1473- if ((hx == hx))
1474- then nil
1475- else throw("Strict value is not equal to itself.")
1476- }
1477- else nil
1478- if ((hP == hP))
1479- then {
1480- let gD = if ((hN > 0))
1711+ let iX = ck(cl)
1712+ let gJ = iX._1
1713+ let hi = iX._2
1714+ let hj = iX._3
1715+ let hk = iX._4
1716+ let hl = if ((gJ > 0))
1717+ then aD
1718+ else aC
1719+ let hm = (hl == aC)
1720+ let eu = eo(cl, gJ)
1721+ let iY = dZ(cl, aL)
1722+ let hp = iY._1
1723+ let dY = iY._2
1724+ let iZ = cL(hm, eu)
1725+ let et = iZ._1
1726+ let cM = iZ._2
1727+ let cN = iZ._3
1728+ let eB = iZ._4
1729+ let ja = aP(aY(et), aY(gJ))
1730+ let ey = aR(dY, ja)
1731+ let jb = cZ(gJ, hi, hk, ey)
1732+ let di = jb._1
1733+ let dj = jb._2
1734+ let de = jb._3
1735+ let hu = (dY - ey)
1736+ let hv = if ((gJ > 0))
1737+ then ((hp - eu) - hu)
1738+ else ((hu + hp) - eu)
1739+ let jc = aR(eu, bQ())
1740+ let jd = (jc / 2)
1741+ let ic = (jc - jd)
1742+ let iH = (di - jc)
1743+ let hw = (gJ + et)
1744+ let hy = aY(hv)
1745+ let iI = ci(hw)
1746+ let eE = (bI() - eu)
1747+ let iL = (bA() - jc)
1748+ let je = if ((0 > iL))
1749+ then $Tuple2(0, aY(iL))
1750+ else $Tuple2(iL, 0)
1751+ let jf = je._1
1752+ let iO = je._2
1753+ let jg = gN(cl)
1754+ let io = jg._1
1755+ let ip = jg._2
1756+ let jh = if ((io > 0))
14811757 then {
1482- let ht = invoke(ak(), "withdraw", [hN], nil)
1483- if ((ht == ht))
1758+ let ji = aR(io, ja)
1759+ let iS = invoke(au(), "realizePartially", [cl, ip, ji], nil)
1760+ if ((iS == iS))
14841761 then nil
14851762 else throw("Strict value is not equal to itself.")
14861763 }
14871764 else nil
1488- if ((gD == gD))
1765+ if ((jh == jh))
14891766 then {
1490- let hu = invoke(ao(), "withdraw", [toBase58String(ah()), (hH - hN)], nil)
1491- if ((hu == hu))
1767+ let iP = invoke(ap(), "withdrawLocked", [jc], nil)
1768+ if ((iP == iP))
14921769 then {
1493- let gR = invoke(ak(), "deposit", nil, [AttachedPayment(ah(), gP)])
1494- if ((gR == gR))
1770+ let ie = invoke(ap(), "addFree", nil, [AttachedPayment(am(), ic)])
1771+ if ((ie == ie))
14951772 then {
1496- let gn = invoke(al(), "notifyNotional", [bT, gl], nil)
1497- if ((gn == gn))
1498- then (((fd(bT, gj, hJ, gl, hK) ++ fp(cm, cn, dW, dX, ea, (bI() - (if ((gj > 0))
1499- then aN(dO)
1500- else 0)), (bH() - (if ((0 > gj))
1501- then aN(dO)
1502- else 0)))) ++ fw(bK.caller, hI)) ++ fz(hM))
1773+ let hC = invoke(aq(), "notifyNotional", [cl, hy], nil)
1774+ if ((hC == hC))
1775+ then (((gg(cl, hw, iH, hy, iI) ++ gt(cM, cN, eB, eE, (bZ() - (if ((hw > 0))
1776+ then aY(et)
1777+ else 0)), (bY() - (if ((0 > hw))
1778+ then aY(et)
1779+ else 0)), (bK() - (if ((hw > 0))
1780+ then eu
1781+ else 0)), (bJ() - (if ((0 > hw))
1782+ then eu
1783+ else 0)))) ++ gB(cc.caller, jd)) ++ gE(jf))
15031784 else throw("Strict value is not equal to itself.")
15041785 }
15051786 else throw("Strict value is not equal to itself.")
15061787 }
15071788 else throw("Strict value is not equal to itself.")
15081789 }
15091790 else throw("Strict value is not equal to itself.")
15101791 }
1511- else throw("Strict value is not equal to itself.")
1512- }
1513- else {
1514- let hR = dQ(bT, false)
1515- let do = hR._1
1516- let cK = hR._2
1517- let dp = hR._3
1518- let dq = hR._4
1519- let cm = hR._5
1520- let cn = hR._6
1521- let dW = hR._7
1522- let dX = hR._8
1523- let ea = hR._9
1524- let dP = hR._10
1525- let dY = hR._11
1526- let dZ = hR._12
1527- let hH = aM(dP, bA())
1528- let hI = (hH / 2)
1529- let gP = (hH - hI)
1530- let hp = (bn() - hH)
1531- let hS = if ((0 > hp))
1532- then $Tuple2(0, aN(hp))
1533- else $Tuple2(hp, 0)
1534- let hM = hS._1
1535- let hN = hS._2
1536- let hT = fI(bT)
1537- let hb = hT._1
1538- let hc = hT._2
1539- let hP = if ((hb > 0))
1540- then {
1541- let hx = invoke(aq(), "realizePartiallyAndClose", [bT, hc], nil)
1542- if ((hx == hx))
1543- then nil
1544- else throw("Strict value is not equal to itself.")
1545- }
1546- else nil
1547- if ((hP == hP))
1548- then {
1549- let gD = if ((hN > 0))
1792+ else {
1793+ let jj = ev(cl, false)
1794+ let dT = jj._1
1795+ let dj = jj._2
1796+ let dU = jj._3
1797+ let dV = jj._4
1798+ let cM = jj._5
1799+ let cN = jj._6
1800+ let eB = jj._7
1801+ let eE = jj._8
1802+ let eu = jj._9
1803+ let eC = jj._10
1804+ let eD = jj._11
1805+ let hA = jj._12
1806+ let hB = jj._13
1807+ let jc = aR(eu, bQ())
1808+ let jd = (jc / 2)
1809+ let ic = (jc - jd)
1810+ let iL = (bA() - jc)
1811+ let jk = if ((0 > iL))
1812+ then $Tuple2(0, aY(iL))
1813+ else $Tuple2(iL, 0)
1814+ let jf = jk._1
1815+ let iO = jk._2
1816+ let jl = gN(cl)
1817+ let io = jl._1
1818+ let ip = jl._2
1819+ let jh = if ((io > 0))
15501820 then {
1551- let ht = invoke(ak(), "withdraw", [hN], nil)
1552- if ((ht == ht))
1821+ let iS = invoke(au(), "realizePartiallyAndClose", [cl, ip], nil)
1822+ if ((iS == iS))
15531823 then nil
15541824 else throw("Strict value is not equal to itself.")
15551825 }
15561826 else nil
1557- if ((gD == gD))
1827+ if ((jh == jh))
15581828 then {
1559- let hu = invoke(ao(), "withdraw", [toBase58String(ah()), (hH - hN)], nil)
1560- if ((hu == hu))
1829+ let gT = if ((dj > 0))
15611830 then {
1562- let gR = invoke(ak(), "deposit", nil, [AttachedPayment(ah(), gP)])
1563- if ((gR == gR))
1831+ let jm = invoke(ap(), "exchangeFreeAndLocked", [dj], nil)
1832+ if ((jm == jm))
1833+ then nil
1834+ else throw("Strict value is not equal to itself.")
1835+ }
1836+ else nil
1837+ if ((gT == gT))
1838+ then {
1839+ let iP = invoke(ap(), "withdrawLocked", [jc], nil)
1840+ if ((iP == iP))
15641841 then {
1565- let gn = invoke(al(), "notifyNotional", [bT, 0], nil)
1566- if ((gn == gn))
1567- then (((fv(bT) ++ fp(cm, cn, dW, dX, ea, dY, dZ)) ++ fw(bK.caller, hI)) ++ fz(hM))
1842+ let ie = invoke(ap(), "addFree", nil, [AttachedPayment(am(), ic)])
1843+ if ((ie == ie))
1844+ then {
1845+ let hC = invoke(aq(), "notifyNotional", [cl, 0], nil)
1846+ if ((hC == hC))
1847+ then (((gA(cl) ++ gt(cM, cN, eB, eE, eC, eD, hA, hB)) ++ gB(cc.caller, jd)) ++ gE(jf))
1848+ else throw("Strict value is not equal to itself.")
1849+ }
15681850 else throw("Strict value is not equal to itself.")
15691851 }
15701852 else throw("Strict value is not equal to itself.")
15711853 }
15721854 else throw("Strict value is not equal to itself.")
15731855 }
15741856 else throw("Strict value is not equal to itself.")
15751857 }
1576- else throw("Strict value is not equal to itself.")
1577- }
1858+ }
1859+ else throw("Strict value is not equal to itself.")
15781860 }
15791861
15801862
15811863
1582-@Callable(bK)
1864+@Callable(cc)
15831865 func payFunding () = {
1584- let hU = bv()
1585- if (if (if ((hU > lastBlock.timestamp))
1866+ let jn = bL()
1867+ if (if (if ((jn > lastBlock.timestamp))
15861868 then true
1587- else !(cb()))
1869+ else !(ct()))
15881870 then true
1589- else cc())
1590- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(hU)))
1871+ else cu())
1872+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(jn)))
15911873 else {
1592- let ez = cU()
1593- let hV = ey()
1594- let eC = hV._1
1595- let eD = hV._2
1596- eW((hU + by()), (bF() + eD), (bG() + eC), aK(eD, ez), aK(eC, ez))
1874+ let fx = dv()
1875+ let jo = fw()
1876+ let fA = jo._1
1877+ let fB = jo._2
1878+ fW((jn + bO()), (bW() + fB), (bX() + fA), aP(fB, fx), aP(fA, fx))
15971879 }
15981880 }
15991881
16001882
16011883
1602-@Callable(bK)
1603-func forceMoveAsset (bT,fx) = if (if ((addressFromPublicKey(ag()) != bK.caller))
1604- then true
1605- else (0 > fx))
1606- then throw("Invalid forceMoveAsset parameters")
1607- else {
1608- let hu = invoke(ao(), "withdraw", [toBase58String(ah()), fx], nil)
1609- if ((hu == hu))
1610- then (fw(addressFromStringValue(bT), fx) ++ fz((bn() - fx)))
1611- else throw("Strict value is not equal to itself.")
1612- }
1613-
1614-
1615-
1616-@Callable(bK)
1617-func adjustPeg (es) = if (if ((addressFromPublicKey(ag()) != bK.caller))
1618- then true
1619- else (0 > es))
1620- then throw("Invalid adjustPeg parameters")
1621- else {
1622- let hW = er(es)
1623- let ew = hW._1
1624- let hX = hW._2
1625- if ((hX == 0))
1626- then throw("Nothing to adjust")
1627- else if ((hX > 0))
1628- then fo(ew, br())
1629- else {
1630- let hu = invoke(ao(), "withdraw", [toBase58String(ah()), aN(hX)], nil)
1631- if ((hu == hu))
1632- then {
1633- let gR = invoke(ak(), "deposit", nil, [AttachedPayment(ah(), aN(hX))])
1634- if ((gR == gR))
1635- then (fz((bn() - aN(hX))) ++ fo(ew, br()))
1636- else throw("Strict value is not equal to itself.")
1637- }
1638- else throw("Strict value is not equal to itself.")
1639- }
1640- }
1641-
1642-
1643-
1644-@Callable(bK)
1645-func migrateLiquidity () = {
1646- let hY = bn()
1647- if ((hY > 0))
1648- then {
1649- let hu = invoke(ai(), "unlockNeutrino", [hY, toBase58String(ah())], nil)
1650- if ((hu == hu))
1651- then {
1652- let gQ = invoke(ao(), "deposit", nil, [AttachedPayment(ah(), hY)])
1653- if ((gQ == gQ))
1654- then nil
1655- else throw("Strict value is not equal to itself.")
1656- }
1657- else throw("Strict value is not equal to itself.")
1658- }
1659- else nil
1884+@Callable(cc)
1885+func syncTerminalPriceToOracle () = {
1886+ let jp = fs(dv())
1887+ let jq = jp._1
1888+ let jr = jp._2
1889+ let ez = jp._3
1890+ let jm = invoke(ap(), "exchangeFreeAndLocked", [ez], nil)
1891+ if ((jm == jm))
1892+ then gs(jq, jr)
1893+ else throw("Strict value is not equal to itself.")
16601894 }
16611895
16621896
16631897
1664-@Callable(bK)
1665-func v_get (bT) = {
1666- let hZ = dQ(bT, false)
1667- let do = hZ._1
1668- let dp = hZ._2
1669- let dq = hZ._3
1670- let ia = hZ._4
1671- throw((((aI(dp) + aI(dq)) + aI(ia)) + aI(dI(bT))))
1898+@Callable(cc)
1899+func view_calcRemainMarginWithFundingPayment (cl) = {
1900+ let hg = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1901+ if ((hg == hg))
1902+ then {
1903+ let js = ck(cl)
1904+ let co = js._1
1905+ let eb = js._2
1906+ let ek = js._3
1907+ let ed = js._4
1908+ let jt = dZ(cl, aL)
1909+ let dQ = jt._1
1910+ let dY = jt._2
1911+ let ju = cZ(co, eb, ed, dY)
1912+ let di = ju._1
1913+ let dj = ju._2
1914+ let de = ju._3
1915+ throw((((((aN(di) + aN(de)) + aN(en(cl))) + aN(dY)) + aN(dj)) + aN(dQ)))
1916+ }
1917+ else throw("Strict value is not equal to itself.")
16721918 }
16731919
16741920
16751921
1676-@Callable(bK)
1677-func view_calcRemainMarginWithFundingPayment (bT) = {
1678- let ib = bS(bT)
1679- let bW = ib._1
1680- let dw = ib._2
1681- let dF = ib._3
1682- let dy = ib._4
1683- let ic = du(bT, aG)
1684- let dl = ic._1
1685- let dt = ic._2
1686- let id = cA(bW, dw, dy, dt)
1687- let cJ = id._1
1688- let cK = id._2
1689- let cF = id._3
1690- throw((((((aI(cJ) + aI(cF)) + aI(dI(bT))) + aI(dt)) + aI(cK)) + aI(dl)))
1922+@Callable(cc)
1923+func view_getPegAdjustCost (jv) = {
1924+ let fr = fs(jv)
1925+ throw(toString(fr._3))
16911926 }
16921927
16931928
16941929
1695-@Callable(bK)
1696-func view_getPegAdjustCost (es) = {
1697- let ex = er(es)
1698- throw(toString(ex._2))
1930+@Callable(cc)
1931+func view_getTerminalAmmPrice () = {
1932+ let jw = eV()
1933+ let eZ = jw._1
1934+ let fa = jw._2
1935+ let gl = aP(aR(eZ, bF()), aR(fa, bG()))
1936+ throw(toString(gl))
16991937 }
17001938
17011939
17021940
1703-@Callable(bK)
1941+@Callable(cc)
17041942 func view_getFunding () = {
1705- let ez = cU()
1706- let ie = ey()
1707- let eC = ie._1
1708- let eD = ie._2
1709- let if = aK(eD, ez)
1710- let ig = aK(eC, ez)
1711- throw((((aI(if) + aI(ig)) + aI(eb())) + aI(cU())))
1943+ let fx = dv()
1944+ let jx = fw()
1945+ let fA = jx._1
1946+ let fB = jx._2
1947+ let jy = aP(fB, fx)
1948+ let jz = aP(fA, fx)
1949+ throw((((aN(jy) + aN(jz)) + aN(eF())) + aN(dv())))
17121950 }
17131951
17141952
17151953
1716-@Callable(bK)
1717-func view_getBorrowedByTrader (bT) = {
1718- let ih = fI(bT)
1719- let hb = ih._1
1720- let hc = ih._2
1721- throw((aI(hb) + hc))
1954+@Callable(cc)
1955+func view_getBorrowedByTrader (cl) = {
1956+ let jA = gN(cl)
1957+ let io = jA._1
1958+ let ip = jA._2
1959+ throw((aN(io) + ip))
17221960 }
17231961
17241962
1725-@Verifier(ii)
1726-func ij () = sigVerify(ii.bodyBytes, ii.proofs[0], ag())
1963+
1964+@Callable(cc)
1965+func computeSpotPrice () = {
1966+ let fr = dJ()
1967+ $Tuple2(nil, fr)
1968+ }
1969+
1970+
1971+
1972+@Callable(cc)
1973+func computeFeeForTraderWithArtifact (cl,fD) = {
1974+ let fr = gQ(cl, fD)
1975+ $Tuple2(nil, fr)
1976+ }
1977+
1978+
1979+@Verifier(jB)
1980+func jC () = sigVerify(jB.bodyBytes, jB.proofs[0], al())
17271981

github/deemru/w8io/169f3d6 
446.71 ms