tx · CADcs9cADh2VtMQBcGgh36ohCsCeGXwcDKHGz6KYwLck

3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS:  -0.03800000 Waves

2023.01.24 13:58 [2418954] smart account 3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS > SELF 0.00000000 Waves

{ "type": 13, "id": "CADcs9cADh2VtMQBcGgh36ohCsCeGXwcDKHGz6KYwLck", "fee": 3800000, "feeAssetId": null, "timestamp": 1674557950256, "version": 2, "chainId": 84, "sender": "3MxWgDbE9EmjQj8b3LfFwa91FZizptyeQXS", "senderPublicKey": "C7xgcYqQ8qV8rmvzAjhQWq4cz82F6VJfXMNygvrTXsfW", "proofs": [ "54wUNZwAetJU5YaptyfzvQ2avJEEWEuKshV5knrvPkNrV67mnUbyfT6RamaA9gkSvjJttQdjTMha2jHh1b79Pit6", "4JfrpGmzSjgDivydFJWFzoikHEwSx3vZW2P17jo58xQEafgY6Mk6vpV7sznxcWMqHfGo4cowPRmPGmfmYKJZ8eU1" ], "script": "base64:BgJmCAISBAoCEQESBQoDCAEBEgUKAwEEARIECgIRCBIDCgEBEgYKBAgIAQgSBAoCCAESAwoBERIECgIRARIFCgMBCAgSBAoCCAESBQoDCAEBEgASABIECgIRBBIECgIBARIAEgASABIAXwAJUFJFQ0lTSU9OAMCEPQAFTUFYX0EAwIQ9AAxNQVhfQV9DSEFOR0UACgAIREVDSU1BTFMABgANTUlOX1JBTVBfVElNRQkAaQIAgKMFADwAB3ZlcnNpb24CBTMuMC4wAAhrVmVyc2lvbgIHdmVyc2lvbgAHa0Fzc2V0cwIJYXNzZXRfaWRzAA1rQXNzZXRCYWxhbmNlAghfYmFsYW5jZQAHa0FjdGl2ZQIGYWN0aXZlAAtrQWN0aXZlR2xvYgIUYWN0aXZlX2FsbF9jb250cmFjdHMAC2tEZXByZWNhdGVkAgtkZXByZWNhdGVkXwAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQANa1NoYXJlQXNzZXRJZAIOc2hhcmVfYXNzZXRfaWQAEWtTaGFyZUFzc2V0U3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkABGtGZWUCCmNvbW1pc3Npb24AEmtEQXBwVGhyZXNob2xkQ29lZgIRZEFwcFRocmVzaG9sZENvZWYADGtVU0ROQWRkcmVzcwIYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAprRGlzY291bnRzAglkaXNjb3VudHMAD2tEaXNjb3VudFZhbHVlcwIPZGlzY291bnRfdmFsdWVzAA5rVXNlclN3b3BJbkdvdgIMX1NXT1BfYW1vdW50AA9rVXNlckdTd29wSW5Hb3YCDV9HU3dvcF9hbW91bnQADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMAEmtBZG1pbkludm9rZVB1YktleQIQYWRtaW5faW52b2tlX3B1YgAQa01vbmV5Qm94QWRkcmVzcwIRbW9uZXlfYm94X2FkZHJlc3MAC2tHb3ZBZGRyZXNzAhJnb3Zlcm5hbmNlX2FkZHJlc3MADmtWb3RpbmdBZGRyZXNzAg52b3RpbmdfYWRkcmVzcwAPa0Zhcm1pbmdBZGRyZXNzAg9mYXJtaW5nX2FkZHJlc3MAEWtMUEZhcm1pbmdBZGRyZXNzAgpscF9mYXJtaW5nAAZvcmFjbGUJAQdBZGRyZXNzAQEaAVRIE5cMwNMzzCUygLYp96dkaICr48x7S5kBE2dldEJhc2U1OEZyb21PcmFjbGUBA2tleQQHJG1hdGNoMAkAnQgCBQZvcmFjbGUFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAkA2QQBBQZzdHJpbmcEB25vdGhpbmcFByRtYXRjaDAJAAIBCQCsAgIFA2tleQIIaXMgZW1wdHkADGFkbWluUHViS2V5MQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkxAAxhZG1pblB1YktleTIJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MgAMYWRtaW5QdWJLZXkzCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTMAEWFkbWluUHViS2V5SW52b2tlCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEmtBZG1pbkludm9rZVB1YktleQAPbW9uZXlCb3hBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUQa01vbmV5Qm94QWRkcmVzcwAKZ292QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFC2tHb3ZBZGRyZXNzABJzdGFraW5nVVNETkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFkZHJlc3MADXZvdGluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ5rVm90aW5nQWRkcmVzcwAOZmFybWluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ9rRmFybWluZ0FkZHJlc3MAEGxwRmFybWluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRFrTFBGYXJtaW5nQWRkcmVzcwAEVVNETgEgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEADXN0YWtpbmdBc3NldHMJAMwIAgkA2AQBBQRVU0ROBQNuaWwABmFjdGl2ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUEdGhpcwUHa0FjdGl2ZQAKYWN0aXZlR2xvYgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFC2tBY3RpdmVHbG9iBgAOZGVwcmVjYXRlZFBvb2wJAQt2YWx1ZU9yRWxzZQIJAJsIAgUGb3JhY2xlCQCsAgIFC2tEZXByZWNhdGVkCQClCAEFBHRoaXMHAAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAALc2hhcmVTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEWtTaGFyZUFzc2V0U3VwcGx5AAlmZWVTY2FsZTYAwIQ9AANmZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFBGtGZWUADWZlZUdvdmVybmFuY2UJAGsDACgFCWZlZVNjYWxlNgBkAAlpbml0aWFsX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCWluaXRpYWxfQQAIZnV0dXJlX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCGZ1dHVyZV9BAA5pbml0aWFsX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg5pbml0aWFsX0FfdGltZQAAAA1mdXR1cmVfQV90aW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCDWZ1dHVyZV9BX3RpbWUAAAAIYXNzZXRJZHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa0Fzc2V0cwIBLAAGbkNvaW5zCQCQAwEFCGFzc2V0SWRzAQdzdXNwZW5kAQVjYXVzZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcJAMwIAgkBC1N0cmluZ0VudHJ5AgUGa0NhdXNlBQVjYXVzZQUDbmlsAQ10aHJvd0lzQWN0aXZlAAkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUBCGlzQWN0aXZlAAMDBQZhY3RpdmUFCmFjdGl2ZUdsb2IHBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAEMaXNEZXByaWNhdGVkAAMJAQEhAQUOZGVwcmVjYXRlZFBvb2wFBHVuaXQJAAIBAjFQb29sIGlzIGRlcHJlY2F0ZWQuIE9ubHkgd2l0aGRyYXcgYWN0aW9uIGFsbG93ZWQuAQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNTZWxmQ2FsbAEBaQMJAAACBQR0aGlzCAUBaQZjYWxsZXIFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAARiaWcyCQC2AgEAAgAGaXRlcjEwCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQUDbmlsAAZpdGVyMTUJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAAGaXRlcjE2CQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOCQDMCAIADwUDbmlsAA5ibG9ja1RpbWVzdGFtcAUGaGVpZ2h0AQZhc3NlcnQBAWEDBQFhBwYBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQh1c2VyQWRkcgQEdXNlcgQHJG1hdGNoMAUIdXNlckFkZHIDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBdQUHJG1hdGNoMAkApQgBBQF1AwkAAQIFByRtYXRjaDACBlN0cmluZwQBdQUHJG1hdGNoMAUBdQkAAgECGFVua25vdyB0eXBlIG9mIHVzZXIgQWRkcgQKc3dvcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHVzZXIFD2tVc2VyR1N3b3BJbkdvdgAABAtnU3dvcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHVzZXIFD2tVc2VyR1N3b3BJbkdvdgUKc3dvcEFtb3VudAQOZGlzY291bnRWYWx1ZXMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQ9rRGlzY291bnRWYWx1ZXMCASwECWRpc2NvdW50cwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFCmtEaXNjb3VudHMCASwDAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAAkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABBQtnU3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAAMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIFC2dTd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwABAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwULZ1N3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAIDAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAE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aWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPeHBfcmVkdWNlZF9wcm9jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAp4cF9yZWR1Y2VkCAUNJHQwMTA0NDExMDUwNQJfMQQFaW5kZXgIBQ0kdDAxMDQ0MTEwNTA1Al8yBAx4cF9yZWR1Y2VkX2kJAJEDAgUKeHBfcmVkdWNlZAUBaQQCZHkJAGUCCQBlAgUMeHBfcmVkdWNlZF9pCQEHZ2V0X3lfRAQFA2FtcAUBaQUKeHBfcmVkdWNlZAUCRDEAAQkAlAoCBQJkeQkAZQIFBGR5XzAFAmR5AQ1nZXRTdHJBc3NldElkAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECC01hdGNoIGVycm9yARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBXN0YWtlB2Fzc2V0SWQDBQVzdGFrZQkAlAoCAgxsb2NrTmV1dHJpbm8FEnN0YWtpbmdVU0ROQWRkcmVzcwkAlAoCAg51bmxvY2tOZXV0cmlubwUSc3Rha2luZ1VTRE5BZGRyZXNzARFjYWxjU3Rha2luZ1BhcmFtcwMFc3Rha2UGYW1vdW50B2Fzc2V0SWQDBQVzdGFrZQQNJHQwMTEwNjkxMTEzNQkBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFBXN0YWtlBQdhc3NldElkBARjYWxsCAUNJHQwMTEwNjkxMTEzNQJfMQQLc3Rha2luZ0FkZHIIBQ0kdDAxMTA2OTExMTM1Al8yCQCWCgQFBGNhbGwFC3N0YWtpbmdBZGRyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFBmFtb3VudAUDbmlsBA0kdDAxMTIyMTExMjg3CQEYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAgUFc3Rha2UFB2Fzc2V0SWQEBGNhbGwIBQ0kdDAxMTIyMTExMjg3Al8xBAtzdGFraW5nQWRkcggFDSR0MDExMjIxMTEyODcCXzIJAJYKBAUEY2FsbAULc3Rha2luZ0FkZHIJAMwIAgUGYW1vdW50CQDMCAIJANgEAQUHYXNzZXRJZAUDbmlsBQNuaWwBBXN0YWtlAgZhbW91bnQNYXNzZXRJZFN0cmluZwMJAQ9jb250YWluc0VsZW1lbnQCBQ1zdGFraW5nQXNzZXRzBQ1hc3NldElkU3RyaW5nBA0kdDAxMTQ3NDExNTc2CQERY2FsY1N0YWtpbmdQYXJhbXMDBgUGYW1vdW50CQDZBAEFDWFzc2V0SWRTdHJpbmcEBGNhbGwIBQ0kdDAxMTQ3NDExNTc2Al8xBARhZGRyCAUNJHQwMTE0NzQxMTU3NgJfMgQGcGFyYW1zCAUNJHQwMTE0NzQxMTU3NgJfMwQIcGF5bWVudHMIBQ0kdDAxMTQ3NDExNTc2Al80CQD8BwQFBGFkZHIFBGNhbGwFBnBhcmFtcwUIcGF5bWVudHMAAAEHdW5zdGFrZQIGYW1vdW50DWFzc2V0SWRTdHJpbmcDCQEPY29udGFpbnNFbGVtZW50AgUNc3Rha2luZ0Fzc2V0cwUNYXNzZXRJZFN0cmluZwQNJHQwMTE3NjExMTg2NAkBEWNhbGNTdGFraW5nUGFyYW1zAwcFBmFtb3VudAkA2QQBBQ1hc3NldElkU3RyaW5nBARjYWxsCAUNJHQwMTE3NjExMTg2NAJfMQQEYWRkcggFDSR0MDExNzYxMTE4NjQCXzIEBnBhcmFtcwgFDSR0MDExNzYxMTE4NjQCXzMECHBheW1lbnRzCAUNJHQwMTE3NjExMTg2NAJfNAkA/AcEBQRhZGRyBQRjYWxsBQZwYXJhbXMFCHBheW1lbnRzAAABDHN0YWtlZEFtb3VudAEHYXNzZXRJZAQWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBANhSWQFByRtYXRjaDADCQAAAgUDYUlkBQRVU0ROCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFA2FJZAIBXwkApQgBBQR0aGlzAAADCQABAgUHJG1hdGNoMAIEVW5pdAAACQACAQILTWF0Y2ggZXJyb3IEByRtYXRjaDAFFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQDCQABAgUHJG1hdGNoMAIDSW50BAFpBQckbWF0Y2gwBQFpAAABD2NoZWNrU3VzcGljaW91cwAEEGNvbnRyYWN0QmFsYW5jZXMJAQNfeHAACgEMY2hlY2tCYWxhbmNlAgNhY2MHYXNzZXRJZAQNJHQwMTI0NzUxMjUwMAUDYWNjBApzdXNwaWNpb3VzCAUNJHQwMTI0NzUxMjUwMAJfMQQBaQgFDSR0MDEyNDc1MTI1MDACXzIDBQpzdXNwaWNpb3VzCQCUCgIFCnN1c3BpY2lvdXMFAWkECGFCYWxhbmNlCQBkAgkA8AcCBQR0aGlzCQDZBAEFB2Fzc2V0SWQJAQxzdGFrZWRBbW91bnQBCQDZBAEFB2Fzc2V0SWQDCQBmAgkAkQMCBRBjb250cmFjdEJhbGFuY2VzBQFpBQhhQmFsYW5jZQkAlAoCBgUBaQkAlAoCBwkAZAIFAWkAAQoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgcAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMY2hlY2tCYWxhbmNlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARFzdXNwZW5kU3VzcGljaW91cwEBaQkBB3N1c3BlbmQBCQCsAgICHVN1c3BpY2lvdXMgc3RhdGUgd2l0aCBhc3NldDogCQCRAwIFCGFzc2V0SWRzBQFpAQ5yZXR1cm5QYXltZW50cwIGY2FsbGVyCHBheW1lbnRzCgENcGFyc2VQYXltZW50cwIDYWNjB3BheW1lbnQJAM0IAgUDYWNjCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIIBQdwYXltZW50BmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcGFyc2VQYXltZW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgESY2hlY2tEQXBwVGhyZXNob2xkAQtuZXdCYWxhbmNlcwQRZEFwcFRocmVzaG9sZENvZWYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBRJrREFwcFRocmVzaG9sZENvZWYCGE5vIGRBcHBUaHJlc2hvbGRDb2VmIGtleQQOdGhyZXNob2xkU2NhbGUAkE4ECm1heEJhbGFuY2UJAJYDAQULbmV3QmFsYW5jZXMECm1pbkJhbGFuY2UJAJcDAQULbmV3QmFsYW5jZXMEBXJhdGlvCQBrAwUKbWF4QmFsYW5jZQUOdGhyZXNob2xkU2NhbGUFCm1pbkJhbGFuY2UDCQBmAgUFcmF0aW8JAGgCBRFkQXBwVGhyZXNob2xkQ29lZgUOdGhyZXNob2xkU2NhbGUJAAIBAjhOZXcgYmFsYW5jZSBpbiBhc3NldHMgb2YgdGhlIERBcHAgaXMgbGVzcyB0aGFuIHRocmVzaG9sZAcBCmNoZWNrQ29pbnMBCGFzc2V0SWRzBAVjb2lucwkAtQkCBQhhc3NldElkcwIBLAMJAGYCCQCQAwEFBWNvaW5zAAoJAAIBAiBUbyBtYW55IGNvaW5zLCBtYXggY29pbnMgc2l6ZSAxMAoBCWNoZWNrQ29pbgIFZXJyb3IHYXNzZXRJZAQFYXNzZXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA2QQBBQdhc3NldElkCQCsAgICEmZyb21CYXNlNThTdHJpbmc6IAUHYXNzZXRJZAQIZGVjaW1hbHMICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUFYXNzZXQJAKwCAgILYXNzZXRJbmZvOiAFB2Fzc2V0SWQIZGVjaW1hbHMDCQECIT0CBQhkZWNpbWFscwUIREVDSU1BTFMJAAIBAg53cm9uZyBkZWNpbWFscwcKAAIkbAUFY29pbnMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJY2hlY2tDb2luAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAQxjYWxjV2l0aGRyYXcDA21zZwptaW5BbW91bnRzDHVubG9ja0Ftb3VudAQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwZjYWxsZXIIBQNtc2cIcGF5bWVudHMECXBtdEFtb3VudAMJAGYCCQCQAwEIBQNtc2cIcGF5bWVudHMAAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQKcG10QXNzZXRJZAgJAJEDAggFA21zZwhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQxzaGFyZUFzc2V0SWQFCnBtdEFzc2V0SWQJAAIBAhV1bmtub3duIHBheW1lbnQgdG9rZW4ICQCRAwIIBQNtc2cIcGF5bWVudHMAAAZhbW91bnQAAAQOd2l0aGRyYXdBbW91bnQJAGQCBQlwbXRBbW91bnQFDHVubG9ja0Ftb3VudAoBEWNhbGNTY3JpcHRBY3Rpb25zAgNhY2MHYmFsYW5jZQQNJHQwMTQ5MTYxNDk0NAUDYWNjBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTQ5MTYxNDk0NAJfMQQBaQgFDSR0MDE0OTE2MTQ5NDQCXzIEB3dBbW91bnQJAGsDBQdiYWxhbmNlBQ53aXRoZHJhd0Ftb3VudAULc2hhcmVTdXBwbHkDCQEGYXNzZXJ0AQkAZwIFB3dBbW91bnQJAJEDAgUKbWluQW1vdW50cwUBaQkAAgECMFdpdGhkcmF3YWwgcmVzdWx0ZWQgaW4gZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAQCdXMJAQd1bnN0YWtlAgUHd0Ftb3VudAkAkQMCBQhhc3NldElkcwUBaQMJAAACBQJ1cwUCdXMJAJQKAgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UJAGUCBQdiYWxhbmNlBQd3QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQd3QW1vdW50CQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMTU0MzMxNTUwMQoAAiRsCQEDX3hwAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWNhbGNTY3JpcHRBY3Rpb25zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTU0MzMxNTUwMQJfMQQBaQgFDSR0MDE1NDMzMTU1MDECXzIJAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBlAgULc2hhcmVTdXBwbHkFDndpdGhkcmF3QW1vdW50BQNuaWwBGmNhbGNXaXRoZHJhd09uZUNvaW5FbnRyaWVzBANtc2cIdG9rZW5PdXQJbWluQW1vdW50DHVubG9ja0Ftb3VudAQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwxvcmlnaW5DYWxsZXIIBQNtc2cIcGF5bWVudHMECXBtdEFtb3VudAMJAGYCCQCQAwEIBQNtc2cIcGF5bWVudHMAAAQKcG10QXNzZXRJZAgJAJEDAggFA21zZwhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQxzaGFyZUFzc2V0SWQFCnBtdEFzc2V0SWQJAAIBAhV1bmtub3duIHBheW1lbnQgdG9rZW4ICQCRAwIIBQNtc2cIcGF5bWVudHMAAAZhbW91bnQAAAQIb3V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAt0b2tlbk91dEI1OAkA2QQBBQh0b2tlbk91dAQOd2l0aGRyYXdBbW91bnQJAGQCBQlwbXRBbW91bnQFDHVubG9ja0Ftb3VudAQCeHAJAQNfeHAABA0kdDAxNjM2MzE2NDUwCQEUX2NhbGNXaXRoZHJhd09uZUNvaW4EBQJ4cAUOd2l0aGRyYXdBbW91bnQFCG91dEluZGV4CAUDbXNnDG9yaWdpbkNhbGxlcgQCZHkIBQ0kdDAxNjM2MzE2NDUwAl8xBAZkeV9mZWUIBQ0kdDAxNjM2MzE2NDUwAl8yAwkBBmFzc2VydAEJAGcCBQJkeQUJbWluQW1vdW50CQACAQIYTm90IGVub3VnaCBjb2lucyByZW1vdmVkBA5nb3Zlcm5hbmNlRmVlcwkAawMFBmR5X2ZlZQUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2BApkeV9hbmRfZmVlCQBkAgUCZHkFBmR5X2ZlZQoBD21ha2VOZXdCYWxhbmNlcwIDYWNjDHRva2VuQmFsYW5jZQQNJHQwMTY3MDgxNjczNAUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDE2NzA4MTY3MzQCXzEEAWkIBQ0kdDAxNjcwODE2NzM0Al8yAwkAAAIFAWkFCG91dEluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGUCBQx0b2tlbkJhbGFuY2UFCmR5X2FuZF9mZWUJAGQCBQFpAAEJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUMdG9rZW5CYWxhbmNlCQBkAgUBaQABBA0kdDAxNjkwMTE2OTYyCgACJGwFAnhwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPbWFrZU5ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtuZXdCYWxhbmNlcwgFDSR0MDE2OTAxMTY5NjICXzEEAXYIBQ0kdDAxNjkwMTE2OTYyAl8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJ1cwkBB3Vuc3Rha2UCBQpkeV9hbmRfZmVlBQh0b2tlbk91dAMJAAACBQJ1cwUCdXMEBmxwRmVlcwkAZQIFBmR5X2ZlZQUOZ292ZXJuYW5jZUZlZXMEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0b2tlbk91dEI1OAUGbHBGZWVzBQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUIb3V0SW5kZXgFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQhvdXRJbmRleAUKZHlfYW5kX2ZlZQkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwULdG9rZW5PdXRCNTgJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBlAgULc2hhcmVTdXBwbHkFDndpdGhkcmF3QW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4UA21zZwEBRAICeHADYW1wBAFECQEOZ2V0X0RfaW50ZXJuYWwCBQJ4cAUDYW1wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQICAUQFAUQFA25pbAUBRANtc2cBBGluaXQDCGFzc2V0SWRzAl9BEl9kQXBwVGhyZXNob2xkQ29lZgMJAQEhAQkAnggBBQR0aGlzCQACAQITQWxyZWFkeSBpbml0aWFsaXplZAMJAGcCAAAFAl9BCQACAQIUQW1wIG11c3QgYmUgbXVzdCA+IDADCQBnAgAABRJfZEFwcFRocmVzaG9sZENvZWYJAAIBAh9kQXBwIFRocmVzaG9sZCBDb2VmIG11c3QgYmUgPiAwBAlzaGFyZU5hbWUCC3NfTXVsdGlfVVNEBBBzaGFyZURlc2NyaXB0aW9uCQCsAgICQlNoYXJlVG9rZW4gb2YgU3dvcEZpIHByb3RvY29sIGZvciBNdWx0aVN0YWJsZSBVU0QgcG9vbCBhdCBhZGRyZXNzIAkApQgBBQR0aGlzBAppc3N1ZVRva2VuCQDCCAUFCXNoYXJlTmFtZQUQc2hhcmVEZXNjcmlwdGlvbgAAAAYGBAd0b2tlbklkCQC4CAEFCmlzc3VlVG9rZW4DCQEKY2hlY2tDb2lucwEFCGFzc2V0SWRzCQEFdGhyb3cACQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tBc3NldHMFCGFzc2V0SWRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFAl9BCQDMCAIJAQxJbnRlZ2VyRW50cnkCAghmdXR1cmVfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfZmxhdAkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFB3Rva2VuSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtEQXBwVGhyZXNob2xkQ29lZgUSX2RBcHBUaHJlc2hvbGRDb2VmCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCBQppc3N1ZVRva2VuBQNuaWwDbXNnAQxhZGRMaXF1aWRpdHkDDW1pbk1pbnRBbW91bnQMc3Rha2VGYXJtaW5nCGxvY2tUeXBlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEMaXNEZXByaWNhdGVkAAQDYW1wCQECX0EABAJ4cAkBA194cAAEAkQwAwkAAAIFC3NoYXJlU3VwcGx5AAAAAAkBB2dldERNZW0CBQJ4cAUDYW1wBA0kdDAxOTEzMTE5Mzg1AwMJAGYCBQhsb2NrVHlwZQAACQAAAggJAJEDAggFA21zZwhwYXltZW50cwkAZQIJAJADAQgFA21zZwhwYXltZW50cwABB2Fzc2V0SWQFBHVuaXQHCQCUCgIJANEIAggFA21zZwhwYXltZW50cwkAZQIJAJADAQgFA21zZwhwYXltZW50cwABCQDMCAIJAJEDAggFA21zZwhwYXltZW50cwkAZQIJAJADAQgFA21zZwhwYXltZW50cwABBQNuaWwJAJQKAggFA21zZwhwYXltZW50cwUDbmlsBAhwYXltZW50cwgFDSR0MDE5MTMxMTkzODUCXzEEB2xvY2tGZWUIBQ0kdDAxOTEzMTE5Mzg1Al8yBAxwYXltZW50c1NpemUJAJADAQUIcGF5bWVudHMKAQ12YWxpZFBheW1lbnRzAQFuAwkAZgIFDHBheW1lbnRzU2l6ZQUGbkNvaW5zCQACAQkArAICAhBwYXltZW50cyBzaXplID4gCQCkAwEFBm5Db2lucwMJAGYCAAEFDHBheW1lbnRzU2l6ZQkAAgECEXBheW1lbnRzIHNpemUgPCAxAwMJAAACBQtzaGFyZVN1cHBseQAACQECIT0CBQZuQ29pbnMFDHBheW1lbnRzU2l6ZQcJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zCgEMcGF5bWFudFZhbGlkAgNhY2MHcGF5bWVudAMJAQ9jb250YWluc0VsZW1lbnQCBQhhc3NldElkcwkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBgkAAgECGEludmFsaWQgYXNzZXQgaW4gcGF5bWVudAoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxwYXltYW50VmFsaWQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQEBIQEJAQ12YWxpZFBheW1lbnRzAQUMcGF5bWVudHNTaXplCQEFdGhyb3cABApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcgUIcGF5bWVudHMKAQ1wYXJzZVBheW1lbnRzAgNhY2MHYXNzZXRJZAQNJHQwMjAyNTUyMDI4MQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDIwMjU1MjAyODECXzEEAWkIBQ0kdDAyMDI1NTIwMjgxAl8yCgEMcGFyc2VQYXltZW50AgpuZXdCYWxhbmNlB3BheW1lbnQDCQAAAgkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBQdhc3NldElkCQBkAgUKbmV3QmFsYW5jZQgFB3BheW1lbnQGYW1vdW50BQpuZXdCYWxhbmNlBAluZXdCYWxhY2UKAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCRAwIFAnhwBQFpCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxwYXJzZVBheW1lbnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUJbmV3QmFsYWNlCQBkAgUBaQABBA0kdDAyMDYzMTIwNjk4CgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcGFyc2VQYXltZW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLbmV3QmFsYW5jZXMIBQ0kdDAyMDYzMTIwNjk4Al8xBAFrCAUNJHQwMjA2MzEyMDY5OAJfMgMJARJjaGVja0RBcHBUaHJlc2hvbGQBBQtuZXdCYWxhbmNlcwkBBXRocm93AAQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAMJAQZhc3NlcnQBCQBmAgUCRDEFAkQwCQACAQIHRDEgPiBEMAQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIBQNtc2cGY2FsbGVyCgERY2FsY1NjcmlwdEFjdGlvbnMCA2FjYwpuZXdCYWxhbmNlBA0kdDAyMTAxODIxMDU5BQNhY2MEC2ludkJhbGFuY2VzCAUNJHQwMjEwMTgyMTA1OQJfMQQNc2NyaXB0QWN0aW9ucwgFDSR0MDIxMDE4MjEwNTkCXzIEAWkIBQ0kdDAyMTAxODIxMDU5Al8zAwkAZgIFC3NoYXJlU3VwcGx5AAAEBF9mZWUJAGkCCQBoAgkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUGbkNvaW5zCQBoAgAECQBlAgUGbkNvaW5zAAEEBGZlZXMEDGlkZWFsQmFsYW5jZQkAawMFAkQxCQCRAwIFAnhwBQFpBQJEMAQKZGlmZmVyZW5jZQMJAGYCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQxpZGVhbEJhbGFuY2UJAGsDBQRfZmVlBQpkaWZmZXJlbmNlBQlmZWVTY2FsZTYEDmdvdmVybmFuY2VGZWVzCQBrAwUEZmVlcwUNZmVlR292ZXJuYW5jZQUJZmVlU2NhbGU2BAxmaW5hbEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzBBBpbnZhcmlhbnRCYWxhbmNlCQBlAgUKbmV3QmFsYW5jZQUEZmVlcwQDcG10CQBlAgUKbmV3QmFsYW5jZQkAkQMCBQJ4cAUBaQQGbHBGZWVzCQBlAgUEZmVlcwUOZ292ZXJuYW5jZUZlZXMEA2ludgMJAGYCBQNwbXQAAAkBBXN0YWtlAgkAZQIFA3BtdAUEZmVlcwkAkQMCBQhhc3NldElkcwUBaQkBB3Vuc3Rha2UCBQRmZWVzCQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFA2ludgUDaW52BAdhaXJkcm9wAwkAZgIFBmxwRmVlcwAACQD8BwQFEGxwRmFybWluZ0FkZHJlc3MCB2FpckRyb3AFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpBQZscEZlZXMFA25pbAAAAwkAAAIFB2FpcmRyb3AFB2FpcmRyb3AJAJUKAwkAzQgCBQtpbnZCYWxhbmNlcwUQaW52YXJpYW50QmFsYW5jZQkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMJANkEAQkAkQMCBQhhc3NldElkcwUBaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQxmaW5hbEJhbGFuY2UFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQDaW52CQEFc3Rha2UCBQpuZXdCYWxhbmNlCQCRAwIFCGFzc2V0SWRzBQFpAwkAAAIFA2ludgUDaW52CQCVCgMJAM0IAgULaW52QmFsYW5jZXMFCm5ld0JhbGFuY2UJAM0IAgUNc2NyaXB0QWN0aW9ucwkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUBaQUNa0Fzc2V0QmFsYW5jZQUKbmV3QmFsYW5jZQkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMjI3NjQyMjg1MgoAAiRsBQtuZXdCYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQERY2FsY1NjcmlwdEFjdGlvbnMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEC2ludkJhbGFuY2VzCAUNJHQwMjI3NjQyMjg1MgJfMQQNc2NyaXB0QWN0aW9ucwgFDSR0MDIyNzY0MjI4NTICXzIEAkQyCQEHZ2V0RE1lbQIFC2ludkJhbGFuY2VzBQNhbXAEC21pbnRfYW1vdW50AwkAAAIFC3NoYXJlU3VwcGx5AAAFAkQxCQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwAwkBBmFzc2VydAEJAGcCBQttaW50X2Ftb3VudAUNbWluTWludEFtb3VudAkAAgECFFNsaXBwYWdlIHNjcmV3ZWQgeW91AwUMc3Rha2VGYXJtaW5nBAJyZQkA/AcEBQR0aGlzAgxyZWlzc3VlU2hhcmUJAMwIAgULbWludF9hbW91bnQFA25pbAUDbmlsAwkAAAIFAnJlBQJyZQQBcwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIXbG9ja1NoYXJlVG9rZW5zRnJvbVBvb2wJAMwIAggIBQNtc2cGY2FsbGVyBWJ5dGVzCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQhsb2NrVHlwZQUDbmlsCQDOCAIJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAULbWludF9hbW91bnQFA25pbAUHbG9ja0ZlZQMJAAACBQFzBQFzCQDNCAIFDXNjcmlwdEFjdGlvbnMJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFC3NoYXJlU3VwcGx5BQttaW50X2Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQdSZWlzc3VlAwUMc2hhcmVBc3NldElkBQttaW50X2Ftb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFC21pbnRfYW1vdW50BQxzaGFyZUFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWtTaGFyZUFzc2V0U3VwcGx5CQBkAgULc2hhcmVTdXBwbHkFC21pbnRfYW1vdW50BQNuaWwDbXNnAQ5jYWxjTWludEFtb3VudAILbmV3QmFsYW5jZXMEdXNlcgQDYW1wCQECX0EABAJ4cAkBA194cAAEAkQxCQEHZ2V0RE1lbQIFC25ld0JhbGFuY2VzBQNhbXADCQAAAgULc2hhcmVTdXBwbHkAAAkAlAoCBQNuaWwFAkQxBAJEMAkBB2dldERNZW0CBQJ4cAUDYW1wBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQUEdXNlcgoBD2NhbGNJbnZCYWxhbmNlcwIDYWNjCm5ld0JhbGFuY2UEDSR0MDI0MTMwMjQxNTYFA2FjYwQLaW52QmFsYW5jZXMIBQ0kdDAyNDEzMDI0MTU2Al8xBAFpCAUNJHQwMjQxMzAyNDE1NgJfMgQEX2ZlZQkAaQIJAGgCCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQZuQ29pbnMJAGgCAAQJAGUCBQZuQ29pbnMAAQQEZmVlcwQMaWRlYWxCYWxhbmNlCQBrAwUCRDEJAJEDAgUCeHAFAWkFAkQwBApkaWZmZXJlbmNlAwkAZgIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFDGlkZWFsQmFsYW5jZQkAawMFBF9mZWUFCmRpZmZlcmVuY2UFCWZlZVNjYWxlNgQQaW52YXJpYW50QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFBGZlZXMJAJQKAgkAzQgCBQtpbnZCYWxhbmNlcwUQaW52YXJpYW50QmFsYW5jZQkAZAIFAWkAAQQNJHQwMjQ3NTgyNDgyOAoAAiRsBQtuZXdCYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD2NhbGNJbnZCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLaW52QmFsYW5jZXMIBQ0kdDAyNDc1ODI0ODI4Al8xBAFrCAUNJHQwMjQ3NTgyNDgyOAJfMgQCRDIJAQdnZXRETWVtAgULaW52QmFsYW5jZXMFA2FtcAQKbWludEFtb3VudAkAawMFC3NoYXJlU3VwcGx5CQBlAgUCRDIFAkQwBQJEMAkAlAoCBQNuaWwFCm1pbnRBbW91bnQDbXNnAQxyZWlzc3VlU2hhcmUBBmFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCmlzU2VsZkNhbGwBBQNtc2cJAMwIAgkBB1JlaXNzdWUDBQxzaGFyZUFzc2V0SWQFBmFtb3VudAYFA25pbANtc2cBBWdldER5BAlhc3NldEZyb20HYXNzZXRUbwJkeAt1c2VyQWRkcmVzcwQCeHAJAQNfeHAABAlmcm9tSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUJYXNzZXRGcm9tAhB1bmtub3duIHRva2VuIGluBAd0b0luZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFB2Fzc2V0VG8CEXVua25vd24gdG9rZW4gb3V0BAF4CQBkAgkAkQMCBQJ4cAUJZnJvbUluZGV4BQJkeAQBeQkBBGdldFkEBQlmcm9tSW5kZXgFB3RvSW5kZXgFAXgFAnhwBAJkeQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQF5AAEEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCQEHQWRkcmVzcwEJANkEAQULdXNlckFkZHJlc3MEBF9mZWUJAGsDCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQJkeQUJZmVlU2NhbGU2CQCUCgIFA25pbAkAlAoCCQBlAgUCZHkFBF9mZWUFBF9mZWUDbXNnAQhleGNoYW5nZQIIdG9rZW5PdXQGbWluX2R5CQELdmFsdWVPckVsc2UCCQEMaXNEZXByaWNhdGVkAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwABCQACAQITc2l6ZShwYXltZW50cykgIT0gMQQKc3VzcGljaW91cwkBD2NoZWNrU3VzcGljaW91cwADCAUKc3VzcGljaW91cwJfMQkAzggCCQERc3VzcGVuZFN1c3BpY2lvdXMBCAUKc3VzcGljaW91cwJfMgkBDnJldHVyblBheW1lbnRzAggFA21zZwZjYWxsZXIIBQNtc2cIcGF5bWVudHMEB3BheW1lbnQJAJEDAggFA21zZwhwYXltZW50cwAABAd0b2tlbkluCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQEC3Rva2VuT3V0QjU4CQDZBAEFCHRva2VuT3V0BAJkeAgFB3BheW1lbnQGYW1vdW50BAlmcm9tSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHdG9rZW5JbgIQdW5rbm93biB0b2tlbiBpbgQHdG9JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQEAnhwCQEDX3hwAAQBeAkAZAIJAJEDAgUCeHAFCWZyb21JbmRleAUCZHgEAXkJAQRnZXRZBAUJZnJvbUluZGV4BQd0b0luZGV4BQF4BQJ4cAQDX2R5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEIBQNtc2cMb3JpZ2luQ2FsbGVyBARfZmVlCQBrAwUDX2R5CQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQlmZWVTY2FsZTYEAmR5CQBlAgUDX2R5BQRfZmVlBA5nb3Zlcm5hbmNlRmVlcwkAawMFBF9mZWUFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgMJAQZhc3NlcnQBCQBnAgUCZHkFBm1pbl9keQkAAgECLkV4Y2hhbmdlIHJlc3VsdGVkIGluIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQKAQ9tYWtlTmV3QmFsYW5jZXMCA2FjYwx0b2tlbkJhbGFuY2UEDSR0MDI2OTk4MjcwMjQFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAyNjk5ODI3MDI0Al8xBAFpCAUNJHQwMjY5OTgyNzAyNAJfMgMJAAACBQFpBQlmcm9tSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZAIFDHRva2VuQmFsYW5jZQUCZHgJAGQCBQFpAAEDCQAAAgUBaQUHdG9JbmRleAkAlAoCCQDNCAIFC25ld0JhbGFuY2VzCQBlAgUMdG9rZW5CYWxhbmNlBQNfZHkJAGQCBQFpAAEJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUMdG9rZW5CYWxhbmNlCQBkAgUBaQABBA0kdDAyNzMwNzI3MzY4CgACJGwFAnhwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPbWFrZU5ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAtuZXdCYWxhbmNlcwgFDSR0MDI3MzA3MjczNjgCXzEEAWkIBQ0kdDAyNzMwNzI3MzY4Al8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAFzCQEFc3Rha2UCCAUHcGF5bWVudAZhbW91bnQJAQ1nZXRTdHJBc3NldElkAQgFB3BheW1lbnQHYXNzZXRJZAMJAAACBQFzBQFzBAJ1cwkBB3Vuc3Rha2UCBQNfZHkFCHRva2VuT3V0AwkAAAIFAnVzBQJ1cwQGbHBGZWVzCQBlAgUEX2ZlZQUOZ292ZXJuYW5jZUZlZXMEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0b2tlbk91dEI1OAUGbHBGZWVzBQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUHdG9rZW5JbgUNa0Fzc2V0QmFsYW5jZQUBeAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQh0b2tlbk91dAUNa0Fzc2V0QmFsYW5jZQkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFA19keQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUDbXNnBmNhbGxlcgUCZHkFC3Rva2VuT3V0QjU4CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMFC3Rva2VuT3V0QjU4BQNuaWwJAMwIAgUCZHkJAMwIAgULdG9rZW5PdXRCNTgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBCHdpdGhkcmF3AQptaW5BbW91bnRzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQEMY2FsY1dpdGhkcmF3AwUDbXNnBQptaW5BbW91bnRzAAADbXNnARJ3aXRoZHJhd1dpdGhVbmxvY2sCCm1pbkFtb3VudHMMdW5sb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkAZwIAAAUMdW5sb2NrQW1vdW50CQACAQIeVW5sb2NrIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlBAZ1bmxvY2sJAPwHBAUOZmFybWluZ0FkZHJlc3MCG3dpdGhkcmF3U2hhcmVUb2tlbnNGcm9tUG9vbAkAzAgCCAgFA21zZwZjYWxsZXIFYnl0ZXMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUGdW5sb2NrBQZ1bmxvY2sJAQxjYWxjV2l0aGRyYXcDBQNtc2cFCm1pbkFtb3VudHMFDHVubG9ja0Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBE2NhbGNXaXRoZHJhd09uZUNvaW4DC3Rva2VuQW1vdW50CHRva2VuT3V0BHVzZXIDCQBnAgAABQt0b2tlbkFtb3VudAkAAgECF0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlBAFpCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAkAlAoCBQNuaWwICQEUX2NhbGNXaXRoZHJhd09uZUNvaW4ECQEDX3hwAAULdG9rZW5BbW91bnQFAWkJAQdBZGRyZXNzAQkA2QQBBQR1c2VyAl8xA21zZwEPd2l0aGRyYXdPbmVDb2luAgh0b2tlbk91dAltaW5BbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQxpc0RlcHJpY2F0ZWQACQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxCQEaY2FsY1dpdGhkcmF3T25lQ29pbkVudHJpZXMEBQNtc2cFCHRva2VuT3V0BQltaW5BbW91bnQAAANtc2cBGXdpdGhkcmF3T25lQ29pbldpdGhVbmxvY2sDCHRva2VuT3V0CW1pbkFtb3VudAx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQxpc0RlcHJpY2F0ZWQACQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkAZgIAAAUMdW5sb2NrQW1vdW50CQACAQIeVW5sb2NrIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlBAZ1bmxvY2sJAPwHBAUOZmFybWluZ0FkZHJlc3MCG3dpdGhkcmF3U2hhcmVUb2tlbnNGcm9tUG9vbAkAzAgCCAgFA21zZwZjYWxsZXIFYnl0ZXMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUGdW5sb2NrBQZ1bmxvY2sJARpjYWxjV2l0aGRyYXdPbmVDb2luRW50cmllcwQFA21zZwUIdG9rZW5PdXQFCW1pbkFtb3VudAUMdW5sb2NrQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwEBQQAJAJQKAgUDbmlsCQECX0EAA21zZwEPZ2V0VmlydHVhbFByaWNlAAQBRAkBBWdldF9EAgkBA194cAAJAQJfQQAJAJQKAgUDbmlsCQBrAwUBRAUJUFJFQ0lTSU9OBQtzaGFyZVN1cHBseQNtc2cBD2NhbGNUb2tlbkFtb3VudAIHYW1vdW50cwdkZXBvc2l0BANhbXAJAQJfQQAECGJhbGFuY2VzCQEDX3hwAAQCRDAJAQdnZXRETWVtAgUIYmFsYW5jZXMFA2FtcAoBD2NhbGNOZXdCYWxhbmNlcwIDYWNjB2JhbGFuY2UEDSR0MDMwMTU4MzAxODQFA2FjYwQLbmV3QmFsYW5jZXMIBQ0kdDAzMDE1ODMwMTg0Al8xBAFpCAUNJHQwMzAxNTgzMDE4NAJfMgQKbmV3QmFsYW5jZQkAZAIFB2JhbGFuY2UDBQdkZXBvc2l0CQCRAwIFB2Ftb3VudHMFAWkJAQEtAQkAkQMCBQdhbW91bnRzBQFpCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFCm5ld0JhbGFuY2UJAGQCBQFpAAEEC25ld0JhbGFuY2VzCAoAAiRsBQhiYWxhbmNlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD2NhbGNOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgJfMQQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAQEZGlmZgMFB2RlcG9zaXQJAGUCBQJEMQUCRDAJAGUCBQJEMAUCRDEJAJQKAgUDbmlsCQBrAwUEZGlmZgULc2hhcmVTdXBwbHkFAkQwA21zZwEFcmFtcEECCF9mdXR1cmVBC19mdXR1cmVUaW1lCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEGYXNzZXJ0AQkAZwIFDmJsb2NrVGltZXN0YW1wCQBkAgUOaW5pdGlhbF9BX3RpbWUFDU1JTl9SQU1QX1RJTUUJAAIBAgl0b28gb2Z0ZW4DCQEGYXNzZXJ0AQkAZwIFC19mdXR1cmVUaW1lCQBkAgUOYmxvY2tUaW1lc3RhbXAFDU1JTl9SQU1QX1RJTUUJAAIBAhFpbnN1ZmZpY2llbnQgdGltZQQKX2luaXRpYWxfQQkBAl9BAAMJAQZhc3NlcnQBAwkAZgIFCF9mdXR1cmVBAAAJAGYCBQVNQVhfQQUIX2Z1dHVyZUEHCQACAQIRb3V0IG9mIGJhc2UgcmFuZ2UDCQEGYXNzZXJ0AQMDCQBnAgUIX2Z1dHVyZUEFCl9pbml0aWFsX0EJAGcCCQBoAgUKX2luaXRpYWxfQQUMTUFYX0FfQ0hBTkdFBQhfZnV0dXJlQQcGAwkAZgIFCl9pbml0aWFsX0EFCF9mdXR1cmVBCQBnAgkAaAIFCF9mdXR1cmVBBQxNQVhfQV9DSEFOR0UFCl9pbml0aWFsX0EHCQACAQIMb3V0IG9mIHJhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCl9pbml0aWFsX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhfZnV0dXJlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQtfZnV0dXJlVGltZQUDbmlsA21zZwEJc3RvcFJhbXBBAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnBAhjdXJyZW50QQkBAl9BAAkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCGN1cnJlbnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5pbml0aWFsX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFDmJsb2NrVGltZXN0YW1wBQNuaWwDbXNnAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluA21zZwEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDBQZhY3RpdmUJAQ10aHJvd0lzQWN0aXZlAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwDbXNnARl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQFY2xhaW0DCQEPY29udGFpbnNFbGVtZW50AgUIYXNzZXRJZHMJANgEAQUEVVNETgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDGNsYWltUmV3YXJkcwUDbmlsBQNuaWwAAAMJAAACBQVjbGFpbQUFY2xhaW0DCQECIT0CCAUDbXNnBmNhbGxlcgUPbW9uZXlCb3hBZGRyZXNzCQACAQImT25seSB0aGUgd2FsbGV0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24ECGJhbGFuY2VzCQEDX3hwAAoBDnRha2VFeHRyYUZ1bmRzAgNhY2MHYXNzZXRJZAQNJHQwMzI3NjkzMjc4NwUDYWNjBANzdW0IBQ0kdDAzMjc2OTMyNzg3Al8xBAFpCAUNJHQwMzI3NjkzMjc4NwJfMgQIdG9rZW5CNTgJANkEAQUHYXNzZXRJZAQIckJhbGFuY2UJAGQCCQDwBwIFBHRoaXMFCHRva2VuQjU4CQEMc3Rha2VkQW1vdW50AQUIdG9rZW5CNTgEDGVucm9sbEFtb3VudAkAZQIFCHJCYWxhbmNlCQCRAwIFCGJhbGFuY2VzBQFpAwkAZgIAAAUMZW5yb2xsQW1vdW50CQEHc3VzcGVuZAEJAKwCAgIgRW5yb2xsIGFtb3VudCBuZWdhdGl2ZSBmb3IgYXNzZXQFB2Fzc2V0SWQEB2FpcmRyb3ADCQBmAgUMZW5yb2xsQW1vdW50AAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQh0b2tlbkI1OAUMZW5yb2xsQW1vdW50BQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQCUCgIJAGQCBQNzdW0FDGVucm9sbEFtb3VudAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQBawoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDnRha2VFeHRyYUZ1bmRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAwkAAAIIBQFrAl8xAAAJAAIBAhBObyBtb25leSB0byB0YWtlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDAEE2NhbGxUYWtlSW50b0FjY291bnQDCQAAAggFA2ludgRkQXBwBQR0aGlzCQAAAggFA2ludghmdW5jdGlvbgIZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwcEDXNpZ25lZEJ5QWRtaW4DAwMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MgYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFEWFkbWluUHViS2V5SW52b2tlAwMFE2NhbGxUYWtlSW50b0FjY291bnQFDXNpZ25lZEJ5QWRtaW4HBgUTbXVsdGlTaWduZWRCeUFkbWlucwUTbXVsdGlTaWduZWRCeUFkbWlucy2FIkY=", "height": 2418954, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FbXLcUUVxS49nf1G4eh1ADR3RqnVT2NB9b6uniAz9UD7 Next: 5tT6XwQQFwkinEru9Pqsyn9oVmBDA9ud2jL59uuQ8w6R Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let PRECISION = 1000000
55
66 let MAX_A = 1000000
77
88 let MAX_A_CHANGE = 10
99
1010 let DECIMALS = 6
1111
1212 let MIN_RAMP_TIME = (86400 / 60)
1313
1414 let version = "3.0.0"
1515
1616 let kVersion = "version"
1717
1818 let kAssets = "asset_ids"
1919
2020 let kAssetBalance = "_balance"
2121
2222 let kActive = "active"
2323
2424 let kActiveGlob = "active_all_contracts"
2525
2626 let kDeprecated = "deprecated_"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let kShareAssetId = "share_asset_id"
3131
3232 let kShareAssetSupply = "share_asset_supply"
3333
3434 let kFee = "commission"
3535
3636 let kDAppThresholdCoef = "dAppThresholdCoef"
3737
3838 let kUSDNAddress = "staking_usdnnsbt_address"
3939
4040 let kDiscounts = "discounts"
4141
4242 let kDiscountValues = "discount_values"
4343
4444 let kUserSwopInGov = "_SWOP_amount"
4545
4646 let kUserGSwopInGov = "_GSwop_amount"
4747
4848 let kAdminPubKey1 = "admin_pub_1"
4949
5050 let kAdminPubKey2 = "admin_pub_2"
5151
5252 let kAdminPubKey3 = "admin_pub_3"
5353
5454 let kAdminInvokePubKey = "admin_invoke_pub"
5555
5656 let kMoneyBoxAddress = "money_box_address"
5757
5858 let kGovAddress = "governance_address"
5959
6060 let kVotingAddress = "voting_address"
6161
6262 let kFarmingAddress = "farming_address"
6363
6464 let kLPFarmingAddress = "lp_farming"
6565
6666 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
6767
6868 func getBase58FromOracle (key) = match getString(oracle, key) {
6969 case string: String =>
7070 fromBase58String(string)
7171 case nothing =>
7272 throw((key + "is empty"))
7373 }
7474
7575
7676 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
7777
7878 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
7979
8080 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8181
8282 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
8383
8484 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
8585
8686 let govAddress = Address(getBase58FromOracle(kGovAddress))
8787
8888 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
8989
9090 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
9191
9292 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9393
9494 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
9595
9696 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
9797
9898 let stakingAssets = [toBase58String(USDN)]
9999
100100 let active = getBooleanValue(this, kActive)
101101
102102 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
103103
104104 let deprecatedPool = valueOrElse(getBoolean(oracle, (kDeprecated + toString(this))), false)
105105
106106 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
107107
108108 let shareSupply = getIntegerValue(this, kShareAssetSupply)
109109
110110 let feeScale6 = 1000000
111111
112112 let fee = getIntegerValue(this, kFee)
113113
114114 let feeGovernance = fraction(40, feeScale6, 100)
115115
116116 let initial_A = getIntegerValue(this, "initial_A")
117117
118118 let future_A = getIntegerValue(this, "future_A")
119119
120120 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
121121
122122 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
123123
124124 let assetIds = split(getStringValue(this, kAssets), ",")
125125
126126 let nCoins = size(assetIds)
127127
128128 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
129129
130130
131131 func throwIsActive () = throw("DApp is already active")
132132
133133
134134 func isActive () = if (if (active)
135135 then activeGlob
136136 else false)
137137 then unit
138138 else throw("DApp is inactive at this moment")
139139
140140
141141 func isDepricated () = if (!(deprecatedPool))
142142 then unit
143143 else throw("Pool is deprecated. Only withdraw action allowed.")
144144
145145
146146 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
147147 then unit
148148 else throw("Only admin can call this function")
149149
150150
151151 func isSelfCall (i) = if ((this == i.caller))
152152 then unit
153153 else throw("Only contract itself can call this function")
154154
155155
156156 let big2 = toBigInt(2)
157157
158158 let iter10 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
159159
160160 let iter15 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
161161
162162 let iter16 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
163163
164164 let blockTimestamp = height
165165
166166 func assert (a) = if (a)
167167 then false
168168 else true
169169
170170
171171 func calculateFeeDiscount (userAddr) = {
172172 let user = match userAddr {
173173 case u: Address =>
174174 toString(u)
175175 case u: String =>
176176 u
177177 case _ =>
178178 throw("Unknow type of user Addr")
179179 }
180180 let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), 0)
181181 let gSwopAmount = valueOrElse(getInteger(govAddress, (user + kUserGSwopInGov)), swopAmount)
182182 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
183183 let discounts = split(getStringValue(oracle, kDiscounts), ",")
184184 if (if ((gSwopAmount >= parseIntValue(discountValues[0])))
185185 then (parseIntValue(discountValues[1]) > gSwopAmount)
186186 else false)
187187 then (feeScale6 - parseIntValue(discounts[0]))
188188 else if (if ((gSwopAmount >= parseIntValue(discountValues[1])))
189189 then (parseIntValue(discountValues[2]) > gSwopAmount)
190190 else false)
191191 then (feeScale6 - parseIntValue(discounts[1]))
192192 else if (if ((gSwopAmount >= parseIntValue(discountValues[2])))
193193 then (parseIntValue(discountValues[3]) > gSwopAmount)
194194 else false)
195195 then (feeScale6 - parseIntValue(discounts[2]))
196196 else if (if ((gSwopAmount >= parseIntValue(discountValues[3])))
197197 then (parseIntValue(discountValues[4]) > gSwopAmount)
198198 else false)
199199 then (feeScale6 - parseIntValue(discounts[3]))
200200 else if ((gSwopAmount >= parseIntValue(discountValues[4])))
201201 then (feeScale6 - parseIntValue(discounts[4]))
202202 else feeScale6
203203 }
204204
205205
206206 func _A () = {
207207 let t1 = future_A_time
208208 let A1 = future_A
209209 if ((t1 > blockTimestamp))
210210 then {
211211 let A0 = initial_A
212212 let t0 = initial_A_time
213213 if ((A1 > A0))
214214 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
215215 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
216216 }
217217 else A1
218218 }
219219
220220
221221 func _xp () = {
222222 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
223223
224224 let $l = assetIds
225225 let $s = size($l)
226226 let $acc0 = nil
227227 func $f0_1 ($a,$i) = if (($i >= $s))
228228 then $a
229229 else assetBalances($a, $l[$i])
230230
231231 func $f0_2 ($a,$i) = if (($i >= $s))
232232 then $a
233233 else throw("List size exceeds 10")
234234
235235 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
236236 }
237237
238238
239239 func _xp_mem (xp) = xp
240240
241241
242242 func sumList (acc,element) = (acc + element)
243243
244244
245245 func get_D (xp,amp) = {
246246 let @ = invoke(this, "D", [xp, amp], nil)
247247 if ($isInstanceOf(@, "Int"))
248248 then @
249249 else throw(($getType(@) + " couldn't be cast to Int"))
250250 }
251251
252252
253253 func get_D_internal (xp,amp) = {
254254 let S = {
255255 let $l = xp
256256 let $s = size($l)
257257 let $acc0 = 0
258258 func $f0_1 ($a,$i) = if (($i >= $s))
259259 then $a
260260 else sumList($a, $l[$i])
261261
262262 func $f0_2 ($a,$i) = if (($i >= $s))
263263 then $a
264264 else throw("List size exceeds 10")
265265
266266 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
267267 }
268268 if ((S == 0))
269269 then 0
270270 else {
271271 let Ann = (amp * nCoins)
272272 let AnnS = (toBigInt(Ann) * toBigInt(S))
273273 let Ann1 = toBigInt((Ann - 1))
274274 func Dproc (acc,i) = if ((acc._2 == true))
275275 then acc
276276 else {
277277 let Dprev = acc._1
278278 func D_PProc (D_P,i) = if ((nCoins > i))
279279 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
280280 else D_P
281281
282282 let D_P = {
283283 let $l = iter10
284284 let $s = size($l)
285285 let $acc0 = Dprev
286286 func $f1_1 ($a,$i) = if (($i >= $s))
287287 then $a
288288 else D_PProc($a, $l[$i])
289289
290290 func $f1_2 ($a,$i) = if (($i >= $s))
291291 then $a
292292 else throw("List size exceeds 10")
293293
294294 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
295295 }
296296 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
297297 if ((D > Dprev))
298298 then if ((1 >= toInt((D - Dprev))))
299299 then $Tuple2(D, true)
300300 else $Tuple2(D, false)
301301 else if ((1 >= toInt((Dprev - D))))
302302 then $Tuple2(D, true)
303303 else $Tuple2(D, false)
304304 }
305305
306306 let $t068206886 = {
307307 let $l = iter15
308308 let $s = size($l)
309309 let $acc0 = $Tuple2(toBigInt(S), false)
310310 func $f1_1 ($a,$i) = if (($i >= $s))
311311 then $a
312312 else Dproc($a, $l[$i])
313313
314314 func $f1_2 ($a,$i) = if (($i >= $s))
315315 then $a
316316 else throw("List size exceeds 15")
317317
318318 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
319319 }
320320 let D = $t068206886._1
321321 let finished = $t068206886._2
322322 if ((finished == false))
323323 then throw(("get_D() not finished with " + toString(D)))
324324 else toInt(D)
325325 }
326326 }
327327
328328
329329 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
330330
331331
332332 func getY (in,out,x,xp_) = if (assert((in != out)))
333333 then throw("same coin")
334334 else if (assert(if ((out >= 0))
335335 then (in >= 0)
336336 else false))
337337 then throw("below zero")
338338 else if (assert(if ((nCoins > out))
339339 then (nCoins > in)
340340 else false))
341341 then throw("above N_COINS")
342342 else {
343343 let amp = _A()
344344 let D = get_D(xp_, amp)
345345 let Ann = (amp * nCoins)
346346 func S_c (acc,i) = {
347347 let $t074577474 = acc
348348 let S_ = $t074577474._1
349349 let c = $t074577474._2
350350 let x_ = if ((in == i))
351351 then x
352352 else xp_[i]
353353 if (if ((i != out))
354354 then (nCoins > i)
355355 else false)
356356 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
357357 else $Tuple2(S_, c)
358358 }
359359
360360 let $t076827737 = {
361361 let $l = iter10
362362 let $s = size($l)
363363 let $acc0 = $Tuple2(0, toBigInt(D))
364364 func $f0_1 ($a,$i) = if (($i >= $s))
365365 then $a
366366 else S_c($a, $l[$i])
367367
368368 func $f0_2 ($a,$i) = if (($i >= $s))
369369 then $a
370370 else throw("List size exceeds 10")
371371
372372 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
373373 }
374374 let S_ = $t076827737._1
375375 let c_ = $t076827737._2
376376 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
377377 let bD = toBigInt(((S_ + (D / Ann)) - D))
378378 func y_proc (acc,_i) = if ((acc._2 == true))
379379 then acc
380380 else {
381381 let y_prev = acc._1
382382 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
383383 if ((y > y_prev))
384384 then if ((1 >= toInt((y - y_prev))))
385385 then $Tuple2(y, true)
386386 else $Tuple2(y, false)
387387 else if ((1 >= toInt((y_prev - y))))
388388 then $Tuple2(y, true)
389389 else $Tuple2(y, false)
390390 }
391391
392392 let $t082198286 = {
393393 let $l = iter16
394394 let $s = size($l)
395395 let $acc0 = $Tuple2(toBigInt(D), false)
396396 func $f1_1 ($a,$i) = if (($i >= $s))
397397 then $a
398398 else y_proc($a, $l[$i])
399399
400400 func $f1_2 ($a,$i) = if (($i >= $s))
401401 then $a
402402 else throw("List size exceeds 16")
403403
404404 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
405405 }
406406 let y = $t082198286._1
407407 let finished = $t082198286._2
408408 if ((finished == false))
409409 then throw(("getY() not finished with " + toString(y)))
410410 else toInt(y)
411411 }
412412
413413
414414 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
415415 then throw("i below zero")
416416 else if (assert((nCoins > in)))
417417 then throw("i above N_COINS")
418418 else {
419419 let Ann = (A_ * nCoins)
420420 func S_c (acc,i) = {
421421 let $t086658682 = acc
422422 let S_ = $t086658682._1
423423 let c = $t086658682._2
424424 let x_ = if (if ((in != i))
425425 then (nCoins > i)
426426 else false)
427427 then xp[i]
428428 else 0
429429 if (if ((nCoins > i))
430430 then (in != i)
431431 else false)
432432 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
433433 else $Tuple2(S_, c)
434434 }
435435
436436 let $t089028957 = {
437437 let $l = iter10
438438 let $s = size($l)
439439 let $acc0 = $Tuple2(0, toBigInt(D))
440440 func $f0_1 ($a,$i) = if (($i >= $s))
441441 then $a
442442 else S_c($a, $l[$i])
443443
444444 func $f0_2 ($a,$i) = if (($i >= $s))
445445 then $a
446446 else throw("List size exceeds 10")
447447
448448 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
449449 }
450450 let S_ = $t089028957._1
451451 let c_ = $t089028957._2
452452 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
453453 let bD = toBigInt(((S_ + (D / Ann)) - D))
454454 func y_D_proc (acc,i) = if ((acc._2 == true))
455455 then acc
456456 else {
457457 let y_prev = acc._1
458458 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
459459 if ((y > y_prev))
460460 then if ((1 >= toInt((y - y_prev))))
461461 then $Tuple2(y, true)
462462 else $Tuple2(y, false)
463463 else if ((1 >= toInt((y_prev - y))))
464464 then $Tuple2(y, true)
465465 else $Tuple2(y, false)
466466 }
467467
468468 let $t094409509 = {
469469 let $l = iter16
470470 let $s = size($l)
471471 let $acc0 = $Tuple2(toBigInt(D), false)
472472 func $f1_1 ($a,$i) = if (($i >= $s))
473473 then $a
474474 else y_D_proc($a, $l[$i])
475475
476476 func $f1_2 ($a,$i) = if (($i >= $s))
477477 then $a
478478 else throw("List size exceeds 16")
479479
480480 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
481481 }
482482 let y = $t094409509._1
483483 let finished = $t094409509._2
484484 if ((finished == false))
485485 then throw(("get_y_D() not finished with " + toString(y)))
486486 else toInt(y)
487487 }
488488
489489
490490 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
491491 let feeDiscount = calculateFeeDiscount(caller)
492492 let amp = _A()
493493 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
494494 let total_supply = shareSupply
495495 let D0 = get_D(xp, amp)
496496 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
497497 let new_y = get_y_D(amp, i, xp, D1)
498498 let dy_0 = (xp[i] - new_y)
499499 func xp_reduced_proc (acc,xp_j) = {
500500 let $t01015010179 = acc
501501 let xp_reduced = $t01015010179._1
502502 let index = $t01015010179._2
503503 let dx_expected = if ((index == i))
504504 then (fraction(xp_j, D1, D0) - new_y)
505505 else (xp_j - fraction(xp_j, D1, D0))
506506 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
507507 }
508508
509509 let $t01044110505 = {
510510 let $l = xp
511511 let $s = size($l)
512512 let $acc0 = $Tuple2(nil, 0)
513513 func $f0_1 ($a,$i) = if (($i >= $s))
514514 then $a
515515 else xp_reduced_proc($a, $l[$i])
516516
517517 func $f0_2 ($a,$i) = if (($i >= $s))
518518 then $a
519519 else throw("List size exceeds 10")
520520
521521 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
522522 }
523523 let xp_reduced = $t01044110505._1
524524 let index = $t01044110505._2
525525 let xp_reduced_i = xp_reduced[i]
526526 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
527527 $Tuple2(dy, (dy_0 - dy))
528528 }
529529
530530
531531 func getStrAssetId (assetId) = match assetId {
532532 case id: ByteVector =>
533533 toBase58String(id)
534534 case waves: Unit =>
535535 "WAVES"
536536 case _ =>
537537 throw("Match error")
538538 }
539539
540540
541541 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
542542 then $Tuple2("lockNeutrino", stakingUSDNAddress)
543543 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
544544
545545
546546 func calcStakingParams (stake,amount,assetId) = if (stake)
547547 then {
548548 let $t01106911135 = calcStakingFuncAndAddres(stake, assetId)
549549 let call = $t01106911135._1
550550 let stakingAddr = $t01106911135._2
551551 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
552552 }
553553 else {
554554 let $t01122111287 = calcStakingFuncAndAddres(stake, assetId)
555555 let call = $t01122111287._1
556556 let stakingAddr = $t01122111287._2
557557 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
558558 }
559559
560560
561561 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
562562 then {
563563 let $t01147411576 = calcStakingParams(true, amount, fromBase58String(assetIdString))
564564 let call = $t01147411576._1
565565 let addr = $t01147411576._2
566566 let params = $t01147411576._3
567567 let payments = $t01147411576._4
568568 invoke(addr, call, params, payments)
569569 }
570570 else 0
571571
572572
573573 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
574574 then {
575575 let $t01176111864 = calcStakingParams(false, amount, fromBase58String(assetIdString))
576576 let call = $t01176111864._1
577577 let addr = $t01176111864._2
578578 let params = $t01176111864._3
579579 let payments = $t01176111864._4
580580 invoke(addr, call, params, payments)
581581 }
582582 else 0
583583
584584
585585 func stakedAmount (assetId) = {
586586 let stakedAmountCalculated = match assetId {
587587 case aId: ByteVector =>
588588 if ((aId == USDN))
589589 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
590590 else 0
591591 case _: Unit =>
592592 0
593593 case _ =>
594594 throw("Match error")
595595 }
596596 match stakedAmountCalculated {
597597 case i: Int =>
598598 i
599599 case _ =>
600600 0
601601 }
602602 }
603603
604604
605605 func checkSuspicious () = {
606606 let contractBalances = _xp()
607607 func checkBalance (acc,assetId) = {
608608 let $t01247512500 = acc
609609 let suspicious = $t01247512500._1
610610 let i = $t01247512500._2
611611 if (suspicious)
612612 then $Tuple2(suspicious, i)
613613 else {
614614 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
615615 if ((contractBalances[i] > aBalance))
616616 then $Tuple2(true, i)
617617 else $Tuple2(false, (i + 1))
618618 }
619619 }
620620
621621 let $l = assetIds
622622 let $s = size($l)
623623 let $acc0 = $Tuple2(false, 0)
624624 func $f0_1 ($a,$i) = if (($i >= $s))
625625 then $a
626626 else checkBalance($a, $l[$i])
627627
628628 func $f0_2 ($a,$i) = if (($i >= $s))
629629 then $a
630630 else throw("List size exceeds 10")
631631
632632 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
633633 }
634634
635635
636636 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
637637
638638
639639 func returnPayments (caller,payments) = {
640640 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
641641
642642 let $l = payments
643643 let $s = size($l)
644644 let $acc0 = nil
645645 func $f0_1 ($a,$i) = if (($i >= $s))
646646 then $a
647647 else parsePayments($a, $l[$i])
648648
649649 func $f0_2 ($a,$i) = if (($i >= $s))
650650 then $a
651651 else throw("List size exceeds 10")
652652
653653 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
654654 }
655655
656656
657657 func checkDAppThreshold (newBalances) = {
658658 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
659659 let thresholdScale = 10000
660660 let maxBalance = max(newBalances)
661661 let minBalance = min(newBalances)
662662 let ratio = fraction(maxBalance, thresholdScale, minBalance)
663663 if ((ratio > (dAppThresholdCoef * thresholdScale)))
664664 then throw("New balance in assets of the DApp is less than threshold")
665665 else false
666666 }
667667
668668
669669 func checkCoins (assetIds) = {
670670 let coins = split(assetIds, ",")
671671 if ((size(coins) > 10))
672672 then throw("To many coins, max coins size 10")
673673 else {
674674 func checkCoin (error,assetId) = {
675675 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
676676 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
677677 if ((decimals != DECIMALS))
678678 then throw("wrong decimals")
679679 else false
680680 }
681681
682682 let $l = coins
683683 let $s = size($l)
684684 let $acc0 = false
685685 func $f0_1 ($a,$i) = if (($i >= $s))
686686 then $a
687687 else checkCoin($a, $l[$i])
688688
689689 func $f0_2 ($a,$i) = if (($i >= $s))
690690 then $a
691691 else throw("List size exceeds 10")
692692
693693 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
694694 }
695695 }
696696
697697
698698 func calcWithdraw (msg,minAmounts,unlockAmount) = {
699699 let suspicious = checkSuspicious()
700700 if (suspicious._1)
701701 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
702702 else {
703703 let pmtAmount = if ((size(msg.payments) > 0))
704704 then if ((size(msg.payments) != 1))
705705 then throw("size(payments) != 1")
706706 else {
707707 let pmtAssetId = msg.payments[0].assetId
708708 if ((shareAssetId != pmtAssetId))
709709 then throw("unknown payment token")
710710 else msg.payments[0].amount
711711 }
712712 else 0
713713 let withdrawAmount = (pmtAmount + unlockAmount)
714714 func calcScriptActions (acc,balance) = {
715715 let $t01491614944 = acc
716716 let scriptActions = $t01491614944._1
717717 let i = $t01491614944._2
718718 let wAmount = fraction(balance, withdrawAmount, shareSupply)
719719 if (assert((wAmount >= minAmounts[i])))
720720 then throw("Withdrawal resulted in fewer coins than expected")
721721 else {
722722 let us = unstake(wAmount, assetIds[i])
723723 if ((us == us))
724724 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.caller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
725725 else throw("Strict value is not equal to itself.")
726726 }
727727 }
728728
729729 let $t01543315501 = {
730730 let $l = _xp()
731731 let $s = size($l)
732732 let $acc0 = $Tuple2(nil, 0)
733733 func $f0_1 ($a,$i) = if (($i >= $s))
734734 then $a
735735 else calcScriptActions($a, $l[$i])
736736
737737 func $f0_2 ($a,$i) = if (($i >= $s))
738738 then $a
739739 else throw("List size exceeds 10")
740740
741741 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
742742 }
743743 let scriptActions = $t01543315501._1
744744 let i = $t01543315501._2
745745 (scriptActions ++ [Burn(shareAssetId, withdrawAmount), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))])
746746 }
747747 }
748748
749749
750750 func calcWithdrawOneCoinEntries (msg,tokenOut,minAmount,unlockAmount) = {
751751 let suspicious = checkSuspicious()
752752 if (suspicious._1)
753753 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
754754 else {
755755 let pmtAmount = if ((size(msg.payments) > 0))
756756 then {
757757 let pmtAssetId = msg.payments[0].assetId
758758 if ((shareAssetId != pmtAssetId))
759759 then throw("unknown payment token")
760760 else msg.payments[0].amount
761761 }
762762 else 0
763763 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
764764 let tokenOutB58 = fromBase58String(tokenOut)
765765 let withdrawAmount = (pmtAmount + unlockAmount)
766766 let xp = _xp()
767767 let $t01636316450 = _calcWithdrawOneCoin(xp, withdrawAmount, outIndex, msg.originCaller)
768768 let dy = $t01636316450._1
769769 let dy_fee = $t01636316450._2
770770 if (assert((dy >= minAmount)))
771771 then throw("Not enough coins removed")
772772 else {
773773 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
774774 let dy_and_fee = (dy + dy_fee)
775775 func makeNewBalances (acc,tokenBalance) = {
776776 let $t01670816734 = acc
777777 let newBalances = $t01670816734._1
778778 let i = $t01670816734._2
779779 if ((i == outIndex))
780780 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
781781 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
782782 }
783783
784784 let $t01690116962 = {
785785 let $l = xp
786786 let $s = size($l)
787787 let $acc0 = $Tuple2(nil, 0)
788788 func $f0_1 ($a,$i) = if (($i >= $s))
789789 then $a
790790 else makeNewBalances($a, $l[$i])
791791
792792 func $f0_2 ($a,$i) = if (($i >= $s))
793793 then $a
794794 else throw("List size exceeds 10")
795795
796796 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
797797 }
798798 let newBalances = $t01690116962._1
799799 let v = $t01690116962._2
800800 if (checkDAppThreshold(newBalances))
801801 then throw()
802802 else {
803803 let us = unstake(dy_and_fee, tokenOut)
804804 if ((us == us))
805805 then {
806806 let lpFees = (dy_fee - governanceFees)
807807 let airdrop = if ((lpFees > 0))
808808 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
809809 else 0
810810 if ((airdrop == airdrop))
811811 then [ScriptTransfer(msg.originCaller, dy, tokenOutB58), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), IntegerEntry(kShareAssetSupply, (shareSupply - withdrawAmount))]
812812 else throw("Strict value is not equal to itself.")
813813 }
814814 else throw("Strict value is not equal to itself.")
815815 }
816816 }
817817 }
818818 }
819819
820820
821821 @Callable(msg)
822822 func D (xp,amp) = {
823823 let D = get_D_internal(xp, amp)
824824 $Tuple2([IntegerEntry("D", D)], D)
825825 }
826826
827827
828828
829829 @Callable(msg)
830830 func init (assetIds,_A,_dAppThresholdCoef) = if (!(isDataStorageUntouched(this)))
831831 then throw("Already initialized")
832832 else if ((0 >= _A))
833833 then throw("Amp must be must > 0")
834834 else if ((0 >= _dAppThresholdCoef))
835835 then throw("dApp Threshold Coef must be > 0")
836836 else {
837837 let shareName = "s_Multi_USD"
838838 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
839839 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
840840 let tokenId = calculateAssetId(issueToken)
841841 if (checkCoins(assetIds))
842842 then throw()
843843 else [StringEntry(kVersion, version), StringEntry(kAssets, assetIds), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, _dAppThresholdCoef), BooleanEntry(kActive, true), issueToken]
844844 }
845845
846846
847847
848848 @Callable(msg)
849849 func addLiquidity (minMintAmount,stakeFarming,lockType) = valueOrElse(isActive(), valueOrElse(isDepricated(), {
850850 let amp = _A()
851851 let xp = _xp()
852852 let D0 = if ((shareSupply == 0))
853853 then 0
854854 else getDMem(xp, amp)
855855 let $t01913119385 = if (if ((lockType > 0))
856856 then (msg.payments[(size(msg.payments) - 1)].assetId == unit)
857857 else false)
858858 then $Tuple2(removeByIndex(msg.payments, (size(msg.payments) - 1)), [msg.payments[(size(msg.payments) - 1)]])
859859 else $Tuple2(msg.payments, nil)
860860 let payments = $t01913119385._1
861861 let lockFee = $t01913119385._2
862862 let paymentsSize = size(payments)
863863 func validPayments (n) = if ((paymentsSize > nCoins))
864864 then throw(("payments size > " + toString(nCoins)))
865865 else if ((1 > paymentsSize))
866866 then throw("payments size < 1")
867867 else if (if ((shareSupply == 0))
868868 then (nCoins != paymentsSize)
869869 else false)
870870 then throw("initial deposit requires all coins")
871871 else {
872872 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
873873 then true
874874 else throw("Invalid asset in payment")
875875
876876 let $l = payments
877877 let $s = size($l)
878878 let $acc0 = false
879879 func $f0_1 ($a,$i) = if (($i >= $s))
880880 then $a
881881 else paymantValid($a, $l[$i])
882882
883883 func $f0_2 ($a,$i) = if (($i >= $s))
884884 then $a
885885 else throw("List size exceeds 10")
886886
887887 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
888888 }
889889
890890 if (!(validPayments(paymentsSize)))
891891 then throw()
892892 else {
893893 let suspicious = checkSuspicious()
894894 if (suspicious._1)
895895 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
896896 else {
897897 func parsePayments (acc,assetId) = {
898898 let $t02025520281 = acc
899899 let newBalances = $t02025520281._1
900900 let i = $t02025520281._2
901901 func parsePayment (newBalance,payment) = if ((getStrAssetId(payment.assetId) == assetId))
902902 then (newBalance + payment.amount)
903903 else newBalance
904904
905905 let newBalace = {
906906 let $l = payments
907907 let $s = size($l)
908908 let $acc0 = xp[i]
909909 func $f0_1 ($a,$i) = if (($i >= $s))
910910 then $a
911911 else parsePayment($a, $l[$i])
912912
913913 func $f0_2 ($a,$i) = if (($i >= $s))
914914 then $a
915915 else throw("List size exceeds 10")
916916
917917 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
918918 }
919919 $Tuple2((newBalances :+ newBalace), (i + 1))
920920 }
921921
922922 let $t02063120698 = {
923923 let $l = assetIds
924924 let $s = size($l)
925925 let $acc0 = $Tuple2(nil, 0)
926926 func $f0_1 ($a,$i) = if (($i >= $s))
927927 then $a
928928 else parsePayments($a, $l[$i])
929929
930930 func $f0_2 ($a,$i) = if (($i >= $s))
931931 then $a
932932 else throw("List size exceeds 10")
933933
934934 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
935935 }
936936 let newBalances = $t02063120698._1
937937 let k = $t02063120698._2
938938 if (checkDAppThreshold(newBalances))
939939 then throw()
940940 else {
941941 let D1 = getDMem(newBalances, amp)
942942 if (assert((D1 > D0)))
943943 then throw("D1 > D0")
944944 else {
945945 let feeDiscount = calculateFeeDiscount(msg.caller)
946946 func calcScriptActions (acc,newBalance) = {
947947 let $t02101821059 = acc
948948 let invBalances = $t02101821059._1
949949 let scriptActions = $t02101821059._2
950950 let i = $t02101821059._3
951951 if ((shareSupply > 0))
952952 then {
953953 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
954954 let fees = {
955955 let idealBalance = fraction(D1, xp[i], D0)
956956 let difference = if ((idealBalance > newBalance))
957957 then (idealBalance - newBalance)
958958 else (newBalance - idealBalance)
959959 fraction(_fee, difference, feeScale6)
960960 }
961961 let governanceFees = fraction(fees, feeGovernance, feeScale6)
962962 let finalBalance = (newBalance - fees)
963963 let invariantBalance = (newBalance - fees)
964964 let pmt = (newBalance - xp[i])
965965 let lpFees = (fees - governanceFees)
966966 let inv = if ((pmt > 0))
967967 then stake((pmt - fees), assetIds[i])
968968 else unstake(fees, assetIds[i])
969969 if ((inv == inv))
970970 then {
971971 let airdrop = if ((lpFees > 0))
972972 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
973973 else 0
974974 if ((airdrop == airdrop))
975975 then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
976976 else throw("Strict value is not equal to itself.")
977977 }
978978 else throw("Strict value is not equal to itself.")
979979 }
980980 else {
981981 let inv = stake(newBalance, assetIds[i])
982982 if ((inv == inv))
983983 then $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
984984 else throw("Strict value is not equal to itself.")
985985 }
986986 }
987987
988988 let $t02276422852 = {
989989 let $l = newBalances
990990 let $s = size($l)
991991 let $acc0 = $Tuple3(nil, nil, 0)
992992 func $f1_1 ($a,$i) = if (($i >= $s))
993993 then $a
994994 else calcScriptActions($a, $l[$i])
995995
996996 func $f1_2 ($a,$i) = if (($i >= $s))
997997 then $a
998998 else throw("List size exceeds 10")
999999
10001000 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
10011001 }
10021002 let invBalances = $t02276422852._1
10031003 let scriptActions = $t02276422852._2
10041004 let D2 = getDMem(invBalances, amp)
10051005 let mint_amount = if ((shareSupply == 0))
10061006 then D1
10071007 else fraction(shareSupply, (D2 - D0), D0)
10081008 if (assert((mint_amount >= minMintAmount)))
10091009 then throw("Slippage screwed you")
10101010 else if (stakeFarming)
10111011 then {
10121012 let re = invoke(this, "reissueShare", [mint_amount], nil)
10131013 if ((re == re))
10141014 then {
10151015 let s = invoke(farmingAddress, "lockShareTokensFromPool", [msg.caller.bytes, toString(this), lockType], ([AttachedPayment(shareAssetId, mint_amount)] ++ lockFee))
10161016 if ((s == s))
10171017 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
10181018 else throw("Strict value is not equal to itself.")
10191019 }
10201020 else throw("Strict value is not equal to itself.")
10211021 }
10221022 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
10231023 }
10241024 }
10251025 }
10261026 }
10271027 }))
10281028
10291029
10301030
10311031 @Callable(msg)
10321032 func calcMintAmount (newBalances,user) = {
10331033 let amp = _A()
10341034 let xp = _xp()
10351035 let D1 = getDMem(newBalances, amp)
10361036 if ((shareSupply == 0))
10371037 then $Tuple2(nil, D1)
10381038 else {
10391039 let D0 = getDMem(xp, amp)
10401040 let feeDiscount = calculateFeeDiscount(user)
10411041 func calcInvBalances (acc,newBalance) = {
10421042 let $t02413024156 = acc
10431043 let invBalances = $t02413024156._1
10441044 let i = $t02413024156._2
10451045 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
10461046 let fees = {
10471047 let idealBalance = fraction(D1, xp[i], D0)
10481048 let difference = if ((idealBalance > newBalance))
10491049 then (idealBalance - newBalance)
10501050 else (newBalance - idealBalance)
10511051 fraction(_fee, difference, feeScale6)
10521052 }
10531053 let invariantBalance = (newBalance - fees)
10541054 $Tuple2((invBalances :+ invariantBalance), (i + 1))
10551055 }
10561056
10571057 let $t02475824828 = {
10581058 let $l = newBalances
10591059 let $s = size($l)
10601060 let $acc0 = $Tuple2(nil, 0)
10611061 func $f0_1 ($a,$i) = if (($i >= $s))
10621062 then $a
10631063 else calcInvBalances($a, $l[$i])
10641064
10651065 func $f0_2 ($a,$i) = if (($i >= $s))
10661066 then $a
10671067 else throw("List size exceeds 10")
10681068
10691069 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
10701070 }
10711071 let invBalances = $t02475824828._1
10721072 let k = $t02475824828._2
10731073 let D2 = getDMem(invBalances, amp)
10741074 let mintAmount = fraction(shareSupply, (D2 - D0), D0)
10751075 $Tuple2(nil, mintAmount)
10761076 }
10771077 }
10781078
10791079
10801080
10811081 @Callable(msg)
10821082 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
10831083
10841084
10851085
10861086 @Callable(msg)
10871087 func getDy (assetFrom,assetTo,dx,userAddress) = {
10881088 let xp = _xp()
10891089 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
10901090 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
10911091 let x = (xp[fromIndex] + dx)
10921092 let y = getY(fromIndex, toIndex, x, xp)
10931093 let dy = ((xp[toIndex] - y) - 1)
10941094 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
10951095 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
10961096 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
10971097 }
10981098
10991099
11001100
11011101 @Callable(msg)
11021102 func exchange (tokenOut,min_dy) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((size(msg.payments) != 1))
11031103 then throw("size(payments) != 1")
11041104 else {
11051105 let suspicious = checkSuspicious()
11061106 if (suspicious._1)
11071107 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
11081108 else {
11091109 let payment = msg.payments[0]
11101110 let tokenIn = getStrAssetId(payment.assetId)
11111111 let tokenOutB58 = fromBase58String(tokenOut)
11121112 let dx = payment.amount
11131113 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
11141114 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
11151115 let xp = _xp()
11161116 let x = (xp[fromIndex] + dx)
11171117 let y = getY(fromIndex, toIndex, x, xp)
11181118 let _dy = ((xp[toIndex] - y) - 1)
11191119 let feeDiscount = calculateFeeDiscount(msg.originCaller)
11201120 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
11211121 let dy = (_dy - _fee)
11221122 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
11231123 if (assert((dy >= min_dy)))
11241124 then throw("Exchange resulted in fewer coins than expected")
11251125 else {
11261126 func makeNewBalances (acc,tokenBalance) = {
11271127 let $t02699827024 = acc
11281128 let newBalances = $t02699827024._1
11291129 let i = $t02699827024._2
11301130 if ((i == fromIndex))
11311131 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
11321132 else if ((i == toIndex))
11331133 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
11341134 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
11351135 }
11361136
11371137 let $t02730727368 = {
11381138 let $l = xp
11391139 let $s = size($l)
11401140 let $acc0 = $Tuple2(nil, 0)
11411141 func $f0_1 ($a,$i) = if (($i >= $s))
11421142 then $a
11431143 else makeNewBalances($a, $l[$i])
11441144
11451145 func $f0_2 ($a,$i) = if (($i >= $s))
11461146 then $a
11471147 else throw("List size exceeds 10")
11481148
11491149 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
11501150 }
11511151 let newBalances = $t02730727368._1
11521152 let i = $t02730727368._2
11531153 if (checkDAppThreshold(newBalances))
11541154 then throw()
11551155 else {
11561156 let s = stake(payment.amount, getStrAssetId(payment.assetId))
11571157 if ((s == s))
11581158 then {
11591159 let us = unstake(_dy, tokenOut)
11601160 if ((us == us))
11611161 then {
11621162 let lpFees = (_fee - governanceFees)
11631163 let airdrop = if ((lpFees > 0))
11641164 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
11651165 else 0
11661166 if ((airdrop == airdrop))
11671167 then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
11681168 else throw("Strict value is not equal to itself.")
11691169 }
11701170 else throw("Strict value is not equal to itself.")
11711171 }
11721172 else throw("Strict value is not equal to itself.")
11731173 }
11741174 }
11751175 }
11761176 }))
11771177
11781178
11791179
11801180 @Callable(msg)
11811181 func withdraw (minAmounts) = valueOrElse(isActive(), calcWithdraw(msg, minAmounts, 0))
11821182
11831183
11841184
11851185 @Callable(msg)
11861186 func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
11871187 then throw("Unlock amount must be positive")
11881188 else {
11891189 let unlock = invoke(farmingAddress, "withdrawShareTokensFromPool", [msg.caller.bytes, toString(this), unlockAmount], nil)
11901190 if ((unlock == unlock))
11911191 then calcWithdraw(msg, minAmounts, unlockAmount)
11921192 else throw("Strict value is not equal to itself.")
11931193 })
11941194
11951195
11961196
11971197 @Callable(msg)
11981198 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = if ((0 >= tokenAmount))
11991199 then throw("Amount must be positive")
12001200 else {
12011201 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
12021202 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
12031203 }
12041204
12051205
12061206
12071207 @Callable(msg)
12081208 func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((size(msg.payments) != 1))
12091209 then throw("size(payments) != 1")
12101210 else calcWithdrawOneCoinEntries(msg, tokenOut, minAmount, 0)))
12111211
12121212
12131213
12141214 @Callable(msg)
12151215 func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isDepricated(), valueOrElse(isActive(), if ((0 > unlockAmount))
12161216 then throw("Unlock amount must be positive")
12171217 else {
12181218 let unlock = invoke(farmingAddress, "withdrawShareTokensFromPool", [msg.caller.bytes, toString(this), unlockAmount], nil)
12191219 if ((unlock == unlock))
12201220 then calcWithdrawOneCoinEntries(msg, tokenOut, minAmount, unlockAmount)
12211221 else throw("Strict value is not equal to itself.")
12221222 }))
12231223
12241224
12251225
12261226 @Callable(msg)
12271227 func A () = $Tuple2(nil, _A())
12281228
12291229
12301230
12311231 @Callable(msg)
12321232 func getVirtualPrice () = {
12331233 let D = get_D(_xp(), _A())
12341234 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
12351235 }
12361236
12371237
12381238
12391239 @Callable(msg)
12401240 func calcTokenAmount (amounts,deposit) = {
12411241 let amp = _A()
12421242 let balances = _xp()
12431243 let D0 = getDMem(balances, amp)
12441244 func calcNewBalances (acc,balance) = {
12451245 let $t03015830184 = acc
12461246 let newBalances = $t03015830184._1
12471247 let i = $t03015830184._2
12481248 let newBalance = (balance + (if (deposit)
12491249 then amounts[i]
12501250 else -(amounts[i])))
12511251 $Tuple2((newBalances :+ newBalance), (i + 1))
12521252 }
12531253
12541254 let newBalances = ( let $l = balances
12551255 let $s = size($l)
12561256 let $acc0 = $Tuple2(nil, 0)
12571257 func $f0_1 ($a,$i) = if (($i >= $s))
12581258 then $a
12591259 else calcNewBalances($a, $l[$i])
12601260
12611261 func $f0_2 ($a,$i) = if (($i >= $s))
12621262 then $a
12631263 else throw("List size exceeds 10")
12641264
12651265 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10))._1
12661266 let D1 = getDMem(newBalances, amp)
12671267 let diff = if (deposit)
12681268 then (D1 - D0)
12691269 else (D0 - D1)
12701270 $Tuple2(nil, fraction(diff, shareSupply, D0))
12711271 }
12721272
12731273
12741274
12751275 @Callable(msg)
12761276 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
12771277 then throw("too often")
12781278 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
12791279 then throw("insufficient time")
12801280 else {
12811281 let _initial_A = _A()
12821282 if (assert(if ((_futureA > 0))
12831283 then (MAX_A > _futureA)
12841284 else false))
12851285 then throw("out of base range")
12861286 else if (assert(if (if ((_futureA >= _initial_A))
12871287 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
12881288 else false)
12891289 then true
12901290 else if ((_initial_A > _futureA))
12911291 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
12921292 else false))
12931293 then throw("out of range")
12941294 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
12951295 }))
12961296
12971297
12981298
12991299 @Callable(msg)
13001300 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
13011301 let currentA = _A()
13021302 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
13031303 }))
13041304
13051305
13061306
13071307 @Callable(msg)
13081308 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
13091309 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
13101310 else suspend("Paused by admin"))
13111311
13121312
13131313
13141314 @Callable(msg)
13151315 func activate () = valueOrElse(isAdminCall(msg), if (active)
13161316 then throwIsActive()
13171317 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
13181318
13191319
13201320
13211321 @Callable(msg)
13221322 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
13231323 let claim = if (containsElement(assetIds, toBase58String(USDN)))
13241324 then invoke(stakingUSDNAddress, "claimRewards", nil, nil)
13251325 else 0
13261326 if ((claim == claim))
13271327 then if ((msg.caller != moneyBoxAddress))
13281328 then throw("Only the wallet can call this function")
13291329 else {
13301330 let balances = _xp()
13311331 func takeExtraFunds (acc,assetId) = {
13321332 let $t03276932787 = acc
13331333 let sum = $t03276932787._1
13341334 let i = $t03276932787._2
13351335 let tokenB58 = fromBase58String(assetId)
13361336 let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
13371337 let enrollAmount = (rBalance - balances[i])
13381338 if ((0 > enrollAmount))
13391339 then suspend(("Enroll amount negative for asset" + assetId))
13401340 else {
13411341 let airdrop = if ((enrollAmount > 0))
13421342 then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenB58, enrollAmount)])
13431343 else 0
13441344 if ((airdrop == airdrop))
13451345 then $Tuple2((sum + enrollAmount), (i + 1))
13461346 else throw("Strict value is not equal to itself.")
13471347 }
13481348 }
13491349
13501350 let k = {
13511351 let $l = assetIds
13521352 let $s = size($l)
13531353 let $acc0 = $Tuple2(0, 0)
13541354 func $f0_1 ($a,$i) = if (($i >= $s))
13551355 then $a
13561356 else takeExtraFunds($a, $l[$i])
13571357
13581358 func $f0_2 ($a,$i) = if (($i >= $s))
13591359 then $a
13601360 else throw("List size exceeds 10")
13611361
13621362 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
13631363 }
13641364 if ((k._1 == 0))
13651365 then throw("No money to take")
13661366 else nil
13671367 }
13681368 else throw("Strict value is not equal to itself.")
13691369 })
13701370
13711371
13721372 @Verifier(tx)
13731373 func verify () = {
13741374 let multiSignedByAdmins = {
13751375 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13761376 then 1
13771377 else 0
13781378 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
13791379 then 1
13801380 else 0
13811381 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
13821382 then 1
13831383 else 0
13841384 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
13851385 }
13861386 match tx {
13871387 case inv: InvokeScriptTransaction =>
13881388 let callTakeIntoAccount = if ((inv.dApp == this))
13891389 then (inv.function == "takeIntoAccountExtraFunds")
13901390 else false
13911391 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
13921392 then true
13931393 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
13941394 then true
13951395 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
13961396 then true
13971397 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
13981398 if (if (callTakeIntoAccount)
13991399 then signedByAdmin
14001400 else false)
14011401 then true
14021402 else multiSignedByAdmins
14031403 case _ =>
14041404 multiSignedByAdmins
14051405 }
14061406 }
14071407

github/deemru/w8io/3ef1775 
157.81 ms