tx · 7EYmVN4bsGkpXRNwu8omCtmm7inQu7pZqWhPjn9m9t5S

3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt:  -0.06300000 Waves

2023.11.02 16:01 [2825745] smart account 3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt > SELF 0.00000000 Waves

{ "type": 13, "id": "7EYmVN4bsGkpXRNwu8omCtmm7inQu7pZqWhPjn9m9t5S", "fee": 6300000, "feeAssetId": null, "timestamp": 1698929898585, "version": 2, "chainId": 84, "sender": "3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt", "senderPublicKey": "3fNYAZ872D7hsaic3sPDZd5uAk59U5CiWiA153FUZ6Qv", "proofs": [ "29Vk1SvvW9hQ7qtPJPJXWEcMXx5i1tmWKgdp1gC5ToG3vWityyrjQ6ErNZzypvidmnRM49btbwxNT6D8MbFgUF1m" ], "script": "base64:BgJ3CAISEAoOGBgBAQgIAQEBAQEIAQgSAwoBARIDCgEBEgASBAoCCAESBAoCCAESAwoBARIECgIIARIDCgEBEgQKAggBEgUKAwgIARIDCgEIEgASABIDCgEIEgASAwoBARIDCgEIEgASABIDCgEIEgQKAggBEgMKAQh7AANTRVACAl9fAAVXQVZFUwIFd2F2ZXMAB01BWF9JTlQA//////////9/AAdNQVhfRkVFAMCEPQANTUFYX0FNUExJRklFUgDAhD0AFE1BWF9XRUlHSFRfQU1QTElGSUVSAMCEPQAKTUFYX1dFSUdIVADAhD0AFFNMSVBQQUdFX1JBVEVfRkFDVE9SAMCEPQAPRkVFX1JBVEVfRkFDVE9SAMCEPQALUkFURV9GQUNUT1IAwIQ9AA5QRVJDRU5UX0ZBQ1RPUgkAtgIBAICAkLu61q3wDQAQWkVST19JTlRfTElTVF8xMAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAAQWkVST19JTlRfTElTVF8xMQkAzQgCBRBaRVJPX0lOVF9MSVNUXzEwAAAAC1pFUk9fQklHSU5UCQC2AgEAAAATWkVST19CSUdJTlRfTElTVF8xMQkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAUDbmlsAAxJTlRfREVDSU1BTFMACAAPQklHSU5UX0RFQ0lNQUxTABIAB0xJU1RfNjQJAL0JAgJ/MF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMAIBXwAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgALS0VZX1NUT1JBR0UCB1NUT1JBR0UACktFWV9BU1NFVFMCBkFTU0VUUwASS0VZX0FTU0VUX0JBTEFOQ0VTAg5BU1NFVF9CQUxBTkNFUwARS0VZX0FTU0VUX1dFSUdIVFMCDUFTU0VUX1dFSUdIVFMACktFWV9MUF9GRUUCBkxQX0ZFRQAQS0VZX1BST1RPQ09MX0ZFRQIMUFJPVE9DT0xfRkVFAA1LRVlfUFJFQ0lTSU9OAglQUkVDSVNJT04AFEtFWV9TSUdNQV9GRUVfUEVSX0xQAhBTSUdNQV9GRUVfUEVSX0xQABlLRVlfVVNFUl9TSUdNQV9GRUVfUEVSX0xQAhVVU0VSX1NJR01BX0ZFRV9QRVJfTFAAC0tFWV9VU0VSX0xQAgdVU0VSX0xQAAxLRVlfVE9UQUxfTFACCFRPVEFMX0xQABBLRVlfVVNFUl9QUk9GSVRTAgxVU0VSX1BST0ZJVFMADEtFWV9XQVRDSERPRwIIV0FUQ0hET0cAE0tFWV9XQVRDSERPR19PRkZTRVQCD1dBVENIRE9HX09GRlNFVAATS0VZX1dBVENIRE9HX0hFSUdIVAIPV0FUQ0hET0dfSEVJR0hUARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ1fdmFsaWRhdGVCb29sAwR2YWxfB3RhcmdldF8EZXJyXwMJAQIhPQIFBHZhbF8FB3RhcmdldF8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBXZhbDFfBXZhbDJfBGVycl8DCQAAAgUFdmFsMV8FBXZhbDJfCQACAQUEZXJyXwYBEF92YWxpZGF0ZUludExpc3QEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQHJG1hdGNoMAkAtgkBBQRlbGVtAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAMFA2FjYwkBDF92YWxpZGF0ZUludAQFAWEFDmxvd2VyQm91bmRhcnlfBQ51cHBlckJvdW5kYXJ5XwUEZXJyXwcJAAIBBQRlcnJfCgACJGwFBHZhbF8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBD192YWxpZGF0ZUFzc2V0cwIHYXNzZXRzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwUDYWNjCQEOX3ZhbGlkYXRlQXNzZXQCBQRlbGVtBQRlcnJfBwoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARJfdmFsaWRhdGVJbnRFcXVhbHMDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgESX3ZhbGlkYXRlVG9rZW5OYW1lAgR2YWxfBGVycl8DAwkAZgIABAkAsQIBBQR2YWxfBgkAZgIJALECAQUEdmFsXwAQCQACAQUEZXJyXwYBE192YWxpZGF0ZVRva2VuRGVzY3ICBHZhbF8EZXJyXwMJAGYCCQCxAgEFBHZhbF8A6AcJAAIBBQRlcnJfBgERX3ZhbGlkYXRlRGVjaW1hbHMCBHZhbF8EZXJyXwMDCQBmAgAABQR2YWxfBgkAZgIFBHZhbF8ACAkAAgEFBGVycl8GARBfdmFsaWRhdGVQYXltZW50BAhwYXltZW50Xwhhc3NldElkXw9yZXF1aXJlZEFtb3VudF8EZXJyXwQHJG1hdGNoMAgFCHBheW1lbnRfB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAMJAQIhPQIFCGFzc2V0SWRfCQDYBAEFAWEJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQDCQBmAgUPcmVxdWlyZWRBbW91bnRfCAUIcGF5bWVudF8GYW1vdW50CQACAQkArAICBQRlcnJfAgg6IGFtb3VudAYJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFbGlzdF8EdmFsXwRlcnJfAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUFbGlzdF8FBHZhbF8JAAIBBQRlcnJfBgELX2Fzc2V0VG9TdHIBBmFzc2V0XwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQUFV0FWRVMBC19zdHJUb0Fzc2V0AQZhc3NldF8DAwkAAAIFBmFzc2V0XwUFV0FWRVMGCQAAAgUGYXNzZXRfAgAFBHVuaXQJANkEAQUGYXNzZXRfAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDF9sb2FkU3RvcmFnZQAEByRtYXRjaDAJAKIIAQULS0VZX1NUT1JBR0UDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUDU0VQCQCcCgoJANkEAQkAkQMCBQZzdHJ1Y3QAAAkAAAIJAJEDAgUGc3RydWN0AAECATEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAGCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QACAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQZzdHJ1Y3QACQkAnAoKAQAHAAAAAAAAAAAAAAAAAAAJAQdBZGRyZXNzAQEAAQxfc2F2ZVN0b3JhZ2UBCHN0b3JhZ2VfCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9TVE9SQUdFCQC5CQIJAMwIAgkA2AQBCAUIc3RvcmFnZV8CXzEJAMwIAgMIBQhzdG9yYWdlXwJfMgIBMQIBMAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfMwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNQkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNgkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOQkAzAgCCQClCAEIBQhzdG9yYWdlXwNfMTAFA25pbAUDU0VQBQNuaWwBC19sb2FkQXNzZXRzAAQHJG1hdGNoMAkAoggBBQpLRVlfQVNTRVRTAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAkAvQkCBQFhBQNTRVAFA25pbAUDbmlsAQtfc2F2ZUFzc2V0cwEHYXNzZXRzXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfQVNTRVRTCQC7CQIFB2Fzc2V0c18FA1NFUAUDbmlsARJfbG9hZEFzc2V0QmFsYW5jZXMACgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAdiYWxhbmNlCQENcGFyc2VJbnRWYWx1ZQEFBGVsZW0JAJQKAgkAzQgCCAUDYWNjAl8xBQdiYWxhbmNlCQBkAggFA2FjYwJfMgUHYmFsYW5jZQQHJG1hdGNoMAkAoggBBRJLRVlfQVNTRVRfQkFMQU5DRVMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACgACJGwJAL0JAgUBYQUDU0VQCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8x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CgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFA1NFUAUDbmlsAQ1fbG9hZFdhdGNoZG9nAAQHJG1hdGNoMAkAoggBBQxLRVlfV0FUQ0hET0cDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVXYXRjaGRvZwEJd2F0Y2hkb2dfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9XQVRDSERPRwkApQgBBQl3YXRjaGRvZ18FA25pbAETX2xvYWRXYXRjaGRvZ09mZnNldAAEByRtYXRjaDAJAJ8IAQUTS0VZX1dBVENIRE9HX09GRlNFVAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAETX3NhdmVXYXRjaGRvZ09mZnNldAEHb2Zmc2V0XwkAzAgCCQEMSW50ZWdlckVudHJ5AgUTS0VZX1dBVENIRE9HX09GRlNFVAUHb2Zmc2V0XwUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAMJAQIhPQIIBQdzdG9yYWdlAl8xAQAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQAAAggFB3N0b3JhZ2UCXzEBAAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEOX2NoZWNrV2F0Y2hkb2cABAJ3ZAQHJG1hdGNoMAkAmggCCQENX2xvYWRXYXRjaGRvZwAFE0tFWV9XQVRDSERPR19IRUlHSFQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwCQBkAgUBYQkBE19sb2FkV2F0Y2hkb2dPZmZzZXQAAAADCQBmAgUGaGVpZ2h0BQJ3ZAkAAgECFl9jaGVja1dhdGNoZG9nOiByZXZlcnQGAQxfZ2V0RGVjaW1hbHMBCGFzc2V0SWRfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAIBQFhCGRlY2ltYWxzCQACAQkArAICAhdfZ2V0RGVjaW1hbHM6IG5vIGFzc2V0PQUIYXNzZXRJZF8BEl9ub3JtYWxpemVEZWNpbWFscwQHYW1vdW50Xw9zb3VyY2VEZWNpbWFsc18PdGFyZ2V0RGVjaW1hbHNfBnJvdW5kXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAbgQFB2Ftb3VudF8AAQkAbAYACgAACQBlAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18AAAAABQRET1dOBQZyb3VuZF8JAGgCBQdhbW91bnRfCQBsBgAKAAAJAGUCBQ90YXJnZXREZWNpbWFsc18FD3NvdXJjZURlY2ltYWxzXwAAAAAFBERPV04BFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEHYXNzZXRzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MAAAoAAiRsBQdh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XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCCAUGcmVzdWx0Al8yCAUGcmVzdWx0Al8zARxfaW5jcmVtZW50QmFsYW5jZXNCeVBheW1lbnRzBQliYWxhbmNlc18JcGF5bWVudHNfB2Fzc2V0c18JZGVjaW1hbHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBAdwYXltZW50CQCRAwIFCXBheW1lbnRzXwUFaW5kZXgED3BheW1lbnRBc3NldFN0cgkBC19hc3NldFRvU3RyAQgFB3BheW1lbnQHYXNzZXRJZAQDZXJyAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyCQCRAwIFB2Fzc2V0c18FBWluZGV4CQACAQkArAICCQCsAgIFBGVycl8CCDogaW5kZXg9CQCkAwEFBWluZGV4BQR1bml0AwkAAAIFA2VycgUDZXJyBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUPcGF5bWVudEFzc2V0U3RyBApuZXdCYWxhbmNlCQBkAgUEZWxlbQkBEl9ub3JtYWxpemVEZWNpbWFscwQICQCRAwIFCXBheW1lbnRzXwUFaW5kZXgGYW1vdW50BQ1hc3NldERlY2ltYWxzBQlkZWNpbWFsc18FBERPV04JAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUKbmV3QmFsYW5jZQkAZAIIBQNhY2MCXzMFCm5ld0JhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBnJlc3VsdAoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmls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aXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEYX2dldFBheW1lbnRzRnJvbUJhbGFuY2VzBAdhc3NldHNfCWJhbGFuY2VzXwpyZWNpcGllbnRfD3NvdXJjZURlY2ltYWxzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVjaXBpZW50XwkBEl9ub3JtYWxpemVEZWNpbWFscwQJAJEDAgUJYmFsYW5jZXNfBQVpbmRleAUPc291cmNlRGVjaW1hbHNfCQEMX2dldERlY2ltYWxzAQUEZWxlbQUERE9XTgkBC19zdHJUb0Fzc2V0AQUEZWxlbQQGcmVzdWx0CgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgESX2NhbGN1bGF0ZU1pY3JvRmVlBQhiYWxhbmNlXwxlcXVpbGlicml1bV8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfAwkAZgIFDGVxdWlsaWJyaXVtXwUIYmFsYW5jZV8ECXRocmVzaG9sZAkAawMFDGVxdWlsaWJyaXVtXwkAZQIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAGYCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAxtYXhEZXZpYXRpb24JAGUCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAdmZWVSYXRlCQBrAwkAawMFDG1heERldmlhdGlvbgUNc2xpcHBhZ2VSYXRlXwUUU0xJUFBBR0VfUkFURV9GQUNUT1IFD0ZFRV9SQVRFX0ZBQ1RPUgUMZXF1aWxpYnJpdW1fAwkAZgIFB2ZlZVJhdGUFC2ZlZU1heFJhdGVfCQBrAwUMbWF4RGV2aWF0aW9uBQtmZWVNYXhSYXRlXwUPRkVFX1JBVEVfRkFDVE9SCQBrAwUMbWF4RGV2aWF0aW9uBQdmZWVSYXRlBQ9GRUVfUkFURV9GQUNUT1IAAAQJdGhyZXNob2xkCQBrAwUMZXF1aWxpYnJpdW1fCQBkAgUUTUFYX1dFSUdIVF9BTVBMSUZJRVIFEHdlaWdodEFtcGxpZmllcl8FFE1BWF9XRUlHSFRfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEDG1heERldmlhdGlvbgkAZQIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEB2ZlZVJhdGUJAGsDCQBrAwUMbWF4RGV2aWF0aW9uBQ1zbGlwcGFnZVJhdGVfBRRTTElQUEFHRV9SQVRFX0ZBQ1RPUgUPRkVFX1JBVEVfRkFDVE9SBQxlcXVpbGlicml1bV8DCQBmAgUHZmVlUmF0ZQULZmVlTWF4UmF0ZV8JAGsDBQxtYXhEZXZpYXRpb24FC2ZlZU1heFJhdGVfBQ9GRUVfUkFURV9GQUNUT1IJAGsDBQxtYXhEZXZpYXRpb24FB2ZlZVJhdGUFD0ZFRV9SQVRFX0ZBQ1RPUgAAAQ1fY2FsY3VsYXRlRmVlBwliYWxhbmNlc18SYXNzZXRzVG90YWxTdXBwbHlfCHdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8AAAEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CxJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZMcFRvdGFsU3VwcGx5Xw5scFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8DAwkAAAIFEnByZXZMcFRvdGFsU3VwcGx5XwAABgkAAAIFDmxwVG90YWxTdXBwbHlfAAAGBA5wcmV2QXNzZXRzUmF0ZQkAawMJAGUCBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUScHJldkFzc2V0QmFsYW5jZXNfBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8FC1JBVEVfRkFDVE9SBRJwcmV2THBUb3RhbFN1cHBseV8EDW5ld0Fzc2V0c1JhdGUJAGsDCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBQtSQVRFX0ZBQ1RPUgUObHBUb3RhbFN1cHBseV8EBGRpZmYJAGUCBQ1uZXdBc3NldHNSYXRlBQ5wcmV2QXNzZXRzUmF0ZQMDCQBnAgAABQRkaWZmCQBmAgkAaAIA////////////AQkBDl9sb2FkUHJlY2lzaW9uAAUEZGlmZgcJAAIBCQCsAgICKl92YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudDogcmV2ZXJ0OiBkaWZmPQkApAMBBQRkaWZmBgEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkScHJldkFzc2V0QmFsYW5jZXNfFXByZXZBc3NldFRvdGFsU3VwcGx5Xw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8ECHByZXZVdGlsCQBlAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBAduZXdVdGlsCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBARkaWZmCQBlAgUHbmV3VXRpbAUIcHJldlV0aWwDAwkAZwIAAAUEZGlmZgkAZgIJAGgCAP///////////wEJAQ5fbG9hZFByZWNpc2lvbgAFBGRpZmYHCQACAQkArAICAiVfdmFsaWRhdGVTd2FwSW52YXJpYW50OiByZXZlcnQ6IGRpZmY9CQCkAwEFBGRpZmYGARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HCGJhbGFuY2VfEWFzc2V0VG90YWxTdXBwbHlfDHByZXZCYWxhbmNlXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8Hd2VpZ2h0XwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBAtlcXVpbGlicml1bQkAawMFEWFzc2V0VG90YWxTdXBwbHlfBQd3ZWlnaHRfBQxzaWdtYVdlaWdodF8EEG1heEFsbG9jYXRpb25BbXADCQBmAgUIYmFsYW5jZV8FC2VxdWlsaWJyaXVtCQBkAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfCQBlAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfBA1tYXhBbGxvY2F0aW9uCQBrAwULZXF1aWxpYnJpdW0FEG1heEFsbG9jYXRpb25BbXAFDU1BWF9BTVBMSUZJRVIEEXByZXZNYXhBbGxvY2F0aW9uCQBrAwkAawMFFXByZXZBc3NldFRvdGFsU3VwcGx5XwUHd2VpZ2h0XwUMc2lnbWFXZWlnaHRfBRBtYXhBbGxvY2F0aW9uQW1wBQ1NQVhfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQMJAGYCBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgMJAGYCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIgX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgdXADCQBmAgkAZQIFCGJhbGFuY2VfBQ1tYXhBbGxvY2F0aW9uCQBlAgUMcHJldkJhbGFuY2VfBRFwcmV2TWF4QWxsb2NhdGlvbgkAAgECIl92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogc3RpbGwgdXAGBgMJAGYCBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwMJAGYCBQxwcmV2QmFsYW5jZV8FEXByZXZNYXhBbGxvY2F0aW9uCQACAQIiX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgZG93bgMJAGYCCQBlAgUNbWF4QWxsb2NhdGlvbgUIYmFsYW5jZV8JAGUCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIkX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBzdGlsbCBkb3duBgYBE192YWxpZGF0ZUFsbG9jYXRpb24HDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQkAlAoCCQBkAgUFaW5kZXgAAQMIBQNhY2MCXzIJARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HBQRlbGVtBRFhc3NldFRvdGFsU3VwcGx5XwkAkQMCBRJwcmV2QXNzZXRCYWxhbmNlc18FBWluZGV4BRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAJEDAgUNYXNzZXRXZWlnaHRzXwUFaW5kZXgFDHNpZ21hV2VpZ2h0XwUMbWF4QWxsb2NBbXBfBwQGcmVzdWx0CgACJGwFDmFzc2V0QmFsYW5jZXNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgELX2NoZWNrcG9pbnQBBXVzZXJfBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBXVzZXJfBAt1c2VyUHJvZml0cwkBEF9sb2FkVXNlclByb2ZpdHMBBQV1c2VyXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEEXVzZXJTaWdtYUZlZVBlckxwCQEWX2xvYWRVc2VyU2lnbWFGZWVQZXJMcAEFBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQNcHJvZml0VXBkYXRlZAkAZAIJAJEDAgULdXNlclByb2ZpdHMFBWluZGV4CQCgAwEJALwCAwkAtgIBBQZ1c2VyTHAJALgCAgkAkQMCBQ1zaWdtYUZlZVBlckxwBQVpbmRleAkAkQMCBRF1c2VyU2lnbWFGZWVQZXJMcAUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFDXByb2ZpdFVwZGF0ZWQEDSR0MDI1NTIwMjU1OTMKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI1NTIwMjU1OTMCXzEEDnByb2ZpdHNVcGRhdGVkCAUNJHQwMjU1MjAyNTU5MwJfMgkAlAoCCQDOCAIJARBfc2F2ZVVzZXJQcm9maXRzAgUFdXNlcl8FDnByb2ZpdHNVcGRhdGVkCQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFBXVzZXJfBQ1zaWdtYUZlZVBlckxwBQ5wcm9maXRzVXBkYXRlZAEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEDnNpZ21hRmVlUGVyTHBfCHRvdGFsTHBfBmluZGV4XwZscEZlZV8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQZpbmRleF8FBWluZGV4CQC3AgIJAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQC8AgMJALYCAQUGbHBGZWVfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQh0b3RhbExwXwkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQEDSR0MDI2MjQzMjYzMjIKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI2MjQzMjYzMjICXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMjYyNDMyNjMyMgJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQLYXNzZXRJbmRleF8HYW1vdW50XwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjY1NDMyNjgxOAMJAAACBQd0b3RhbExwAAAJAJQKAgAACQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwUHTUFYX0ZFRQkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUEBWxwRmVlCAUNJHQwMjY1NDMyNjgxOAJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNjU0MzI2ODE4Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQVscEZlZQAABQ1zaWdtYUZlZVBlckxwCQEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEBQ1zaWdtYUZlZVBlckxwBQd0b3RhbExwBQthc3NldEluZGV4XwUFbHBGZWUJAJUKAwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAELX2RlcG9zaXRBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjczMjcyNzM4MAkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjczMjcyNzM4MAJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyNzMyNzI3MzgwAl8yBA0kdDAyNzM4NTI3NDUzCQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyNzM4NTI3NDUzAl8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI3Mzg1Mjc0NTMCXzIEDSR0MDI3NDU5Mjg2ODkDCQAAAgUUcHJldkFzc2V0VG90YWxTdXBwbHkAAAoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAawMJAJEDAgUMYXNzZXRXZWlnaHRzBQVpbmRleAUHYW1vdW50XwULc2lnbWFXZWlnaHQJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyNzkwMTI3OTc1CgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyNzkwMTI3OTc1Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjc5MDEyNzk3NQJfMgkAlAoCBQdhbW91bnRfBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBAVyYXRpbwkAvAIDCQC2AgEFB2Ftb3VudF8FDlBFUkNFTlRfRkFDVE9SCQC2AgEFFHByZXZBc3NldFRvdGFsU3VwcGx5CgEJZm9sZEZ1bmMxAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAoAMBCQC8AgMFBXJhdGlvCQC2AgEJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQEDSR0MDI4NTE4Mjg1OTMKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZm9sZEZ1bmMxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyODUxODI4NTkzAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjg1MTgyODU5MwJfMgkAlAoCCQBrAwUHYW1vdW50XwUNbHBUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwMjc0NTkyODY4OQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI3NDU5Mjg2ODkCXzIEDSR0MDI4Njk1Mjg4MDgJARtfaW5jcmVtZW50QmFsYW5jZXNCeUFtb3VudHMCBRFwcmV2QXNzZXRCYWxhbmNlcwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQNYXNzZXRCYWxhbmNlcwgFDSR0MDI4Njk1Mjg4MDgCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyODY5NTI4ODA4Al8yBARlcnIyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUObHBUb2tlbnNUb01pbnQFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjIFBGVycjIJAJUKAwUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCF9kZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjk1NzEyOTYyNAkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjk1NzEyOTYyNAJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyOTU3MTI5NjI0Al8yBA0kdDAyOTYyOTI5NzQzCQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyOTYyOTI5NzQzAl8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI5NjI5Mjk3NDMCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBQdhbW91bnRfBBBhc3NldFRvdGFsU3VwcGx5CQBkAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB2Ftb3VudF8EBGVycjIJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgMJAAACBQRlcnIyBQRlcnIyBAdwcmV2RmVlCQENX2NhbGN1bGF0ZUZlZQcFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQObHBUb2tlbnNUb01pbnQDCQAAAgUNbHBUb3RhbFN1cHBseQAACQACAQIUX2RlcG9zaXQ6IGVtcHR5IHBvb2wECWFzc2V0RGlmZgkAZQIFEGFzc2V0VG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BAdmZWVEaWZmCQBlAgUDZmVlBQdwcmV2RmVlBBN1dGlsaXR5Q2hhbmdlRmFjdG9yCQBrAwkAZQIFCWFzc2V0RGlmZgUHZmVlRGlmZgULUkFURV9GQUNUT1IJAGUCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUHcHJldkZlZQQTbHBUb2tlbnNUb01pbnRJbm5lcgkAawMFDWxwVG90YWxTdXBwbHkFE3V0aWxpdHlDaGFuZ2VGYWN0b3IFC1JBVEVfRkFDVE9SBARlcnIzCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUTbHBUb2tlbnNUb01pbnRJbm5lcgUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDCQAAAgUEZXJyMwUEZXJyMwUTbHBUb2tlbnNUb01pbnRJbm5lcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMzE0MDUzMTUzNgkBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQAAAUObHBUb2tlbnNUb01pbnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDMxNDA1MzE1MzYCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzE0MDUzMTUzNgJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzMTQwNTMxNTM2Al8zCQCXCgUFDmxwVG9rZW5zVG9NaW50BQ1hc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxfd2l0aGRyYXdBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwMzE4NzAzMTkzOAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzE4NzAzMTkzOAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMTg3MDMxOTM4Al8yBA0kdDAzMTk0MzMxOTk2CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMTk0MzMxOTk2Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMxOTQzMzE5OTYCXzIEDmxwVG9rZW5zVG9CdXJuBQdhbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvQnVybgAABQdNQVhfSU5UAihfd2l0aGRyYXdBbGw6IGxwVG9rZW5zVG9CdXJuIGxlc3MgdGhhbiAwAwkAAAIFA2VycgUDZXJyBA0kdDAzMjEzODMyMjcxCQEcX2RlY3JlbWVudEJhbGFuY2VzQnlMcEFtb3VudAMFEXByZXZBc3NldEJhbGFuY2VzBQ5scFRva2Vuc1RvQnVybgUNbHBUb3RhbFN1cHBseQQNYXNzZXRCYWxhbmNlcwgFDSR0MDMyMTM4MzIyNzECXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMjEzODMyMjcxAl8yBA1iYWxhbmNlc1RvUGF5CAUNJHQwMzIxMzgzMjI3MQJfMwQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9CdXJuBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCVCgMFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfCWxwQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAlwcmVjaXNpb24JAQ5fbG9hZFByZWNpc2lvbgAEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMzMwNjMzMzEzMQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzMwNjMzMzEzMQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMzA2MzMzMTMxAl8yBA0kdDAzMzEzNjMzMTg5CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMzEzNjMzMTg5Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMzMTM2MzMxODkCXzIEEHRhcmdldEFzc2V0SW5kZXgJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQhhc3NldElkXwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUEAWsJALwCAwkAtgIBCQBlAgUNbHBUb3RhbFN1cHBseQUJbHBBbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BBJwcmV2VXRpbFZhbHVlV2l0aEsJAKADAQkAvAIDCQC2AgEFDXByZXZVdGlsVmFsdWUFAWsFDlBFUkNFTlRfRkFDVE9SBBJwcmV2VXRpbFZhbHVlRGl2THAJAL0CBAkAtgIBBQ1wcmV2VXRpbFZhbHVlBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BQdDRUlMSU5HCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwgFA2FjYwJfMQUDYWNjBApzdGFydElubmVyCAUDYWNjAl8yBAlzdG9wSW5uZXIIBQNhY2MCXzMEDWN1cnJlbnRBbW91bnQJAGkCCQBkAgUJc3RvcElubmVyBQpzdGFydElubmVyAAIEEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgFDWN1cnJlbnRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWN1cnJlbnRBbW91bnQECXV0aWxWYWx1ZQkAZQIFFHRlbXBBc3NldFRvdGFsU3VwcGx5CQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDAwkAZgIJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAaAIA////////////AQUJcHJlY2lzaW9uCQBmAgUJcHJlY2lzaW9uCQBlAgUJdXRpbFZhbHVlBRJwcmV2VXRpbFZhbHVlV2l0aEsHCQCXCgUGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwMJAGYCAAAJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAlwoFBwUKc3RhcnRJbm5lcgUNY3VycmVudEFtb3VudAUNY3VycmVudEFtb3VudAkAZQIFCXV0aWxWYWx1ZQUScHJldlV0aWxWYWx1ZVdpdGhLCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwQMdGFyZ2V0QW1vdW50BARzdG9wCQCgAwEJAL0CBAkAtgIBCQBkAgUJbHBBbW91bnRfBQdwcmV2RmVlBRJwcmV2VXRpbFZhbHVlRGl2THAFDlBFUkNFTlRfRkFDVE9SBQdDRUlMSU5HBA0kdDAzNTA1NTM1MTY3CgACJGwFB0xJU1RfNjQKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUHAAAFBHN0b3AAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNjQJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQAQHc3VjY2VzcwgFDSR0MDM1MDU1MzUxNjcCXzEECHN0YXJ0T3V0CAUNJHQwMzUwNTUzNTE2NwJfMgQHc3RvcE91dAgFDSR0MDM1MDU1MzUxNjcCXzMED3RhcmdldEFtb3VudE91dAgFDSR0MDM1MDU1MzUxNjcCXzQEB2RpZmZPdXQIBQ0kdDAzNTA1NTM1MTY3Al81AwkBASEBBQdzdWNjZXNzCQACAQkArAICCQCsAgIJAKwCAgIoX3dpdGhkcmF3OiBjYW4ndCBjYWxjdWxhdGUgdGFyZ2V0QW1vdW50PQkApAMBBQ90YXJnZXRBbW91bnRPdXQCBixkaWZmPQkApAMBBQdkaWZmT3V0BQ90YXJnZXRBbW91bnRPdXQEEmZpbmFsQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BQx0YXJnZXRBbW91bnQEFWZpbmFsQXNzZXRUb3RhbFN1cHBseQkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFCWxwQW1vdW50XwUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUHAwkAAAIFBGVycjEFBGVycjEEDSR0MDM2MTU5MzYzMDcJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgUQdGFyZ2V0QXNzZXRJbmRleAABBQx0YXJnZXRBbW91bnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDM2MTU5MzYzMDcCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzYxNTkzNjMwNwJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzNjE1OTM2MzA3Al8zCQCXCgUFDHRhcmdldEFtb3VudAUSZmluYWxBc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQVfc3dhcAMRc291cmNlQXNzZXRJbmRleF8RdGFyZ2V0QXNzZXRJbmRleF8Nc291cmNlQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkECXByZWNpc2lvbgkBDl9sb2FkUHJlY2lzaW9uAAQNJHQwMzY4ODkzNjk1NwkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzY4ODkzNjk1NwJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzNjg4OTM2OTU3Al8yBA0kdDAzNjk2MjM3MDE1CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzNjk2MjM3MDE1Al8xBAtzaWdtYVdlaWdodAgFDSR0MDM2OTYyMzcwMTUCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FDXNvdXJjZUFtb3VudF8EEGFzc2V0VG90YWxTdXBwbHkJAGQCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNc291cmNlQW1vdW50XwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUKAQhmb2xkRnVuYwIDYWNjBGVsZW0DCAUDYWNjAl8xBQNhY2MECnN0YXJ0SW5uZXIIBQNhY2MCXzIECXN0b3BJbm5lcggFA2FjYwJfMwQNY3VycmVudEFtb3VudAkAaQIJAGQCBQlzdG9wSW5uZXIFCnN0YXJ0SW5uZXIAAgQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUNY3VycmVudEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQ1jdXJyZW50QW1vdW50BAl1dGlsVmFsdWUJAGUCBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQkBDV9jYWxjdWxhdGVGZWUHBRF0ZW1wQXNzZXRCYWxhbmNlcwUUdGVtcEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwMJAGYCCQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQBoAgD///////////8BBQlwcmVjaXNpb24JAGYCBQlwcmVjaXNpb24JAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUHCQCXCgUGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUDCQBmAgAACQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCXCgUHBQpzdGFydElubmVyBQ1jdXJyZW50QW1vdW50BQ1jdXJyZW50QW1vdW50CQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUEDHRhcmdldEFtb3VudAQMdGFyZ2V0QW1vdW50BQ1zb3VyY2VBbW91bnRfBBF0ZW1wQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFDWFzc2V0QmFsYW5jZXMFEXRhcmdldEFzc2V0SW5kZXhfBQx0YXJnZXRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUQYXNzZXRUb3RhbFN1cHBseQUMdGFyZ2V0QW1vdW50BANmZWUJAQ1fY2FsY3VsYXRlRmVlBwURdGVtcEFzc2V0QmFsYW5jZXMFFHRlbXBBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQHZmVlRGlmZgkAZQIFA2ZlZQUHcHJldkZlZQMJAAACBQdmZWVEaWZmAAAFDHRhcmdldEFtb3VudAQNJHQwMzg5ODgzOTExOQoAAiRsBQdMSVNUXzY0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlwoFBwAACQBkAgUNc291cmNlQW1vdW50XwUHcHJldkZlZQAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2NAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBABAdzdWNjZXNzCAUNJHQwMzg5ODgzOTExOQJfMQQIc3RhcnRPdXQIBQ0kdDAzODk4ODM5MTE5Al8yBAdzdG9wT3V0CAUNJHQwMzg5ODgzOTExOQJfMwQPdGFyZ2V0QW1vdW50T3V0CAUNJHQwMzg5ODgzOTExOQJfNAQHZGlmZk91dAgFDSR0MDM4OTg4MzkxMTkCXzUDCQEBIQEFB3N1Y2Nlc3MJAAIBCQCsAgIJAKwCAgkArAICAiRfc3dhcDogY2FuJ3QgY2FsY3VsYXRlIHRhcmdldEFtb3VudD0JAKQDAQUPdGFyZ2V0QW1vdW50T3V0AgYsZGlmZj0JAKQDAQUHZGlmZk91dAUPdGFyZ2V0QW1vdW50T3V0BBJmaW5hbEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBVmaW5hbEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxBA0kdDAzOTk2NjQwMTA3CQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEXRhcmdldEFzc2V0SW5kZXhfAAEFDHRhcmdldEFtb3VudAUJbHBGZWVSYXRlBQ9wcm90b2NvbEZlZVJhdGUEBWxwRmVlCAUNJHQwMzk5NjY0MDEwNwJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAzOTk2NjQwMTA3Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDM5OTY2NDAxMDcCXzMJAJcKBQUMdGFyZ2V0QW1vdW50BRJmaW5hbEFzc2V0QmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4XAWkBBGluaXQOB2Fzc2V0c18NYXNzZXRXZWlnaHRzXwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8MbHBUb2tlbk5hbWVfDWxwVG9rZW5EZXNjcl8QbHBUb2tlbkRlY2ltYWxzXxdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8UcHJvdG9jb2xGZWVDb250cmFjdF8KcHJlY2lzaW9uXwdwYXVzZXJfBANlcnIDAwMDAwMDAwMDAwMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQETX3doZW5Ob3RJbml0aWFsaXplZAAHCQEQX3doZW5NdWx0aXNpZ1NldAAHCQEPX3ZhbGlkYXRlQXNzZXRzAgUHYXNzZXRzXwIUaW5pdDogaW52YWxpZCBhc3NldHMHCQEQX3ZhbGlkYXRlSW50TGlzdAQFDWFzc2V0V2VpZ2h0c18AAQUKTUFYX1dFSUdIVAIaaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBBQdhc3NldHNfCQCQAwEFDWFzc2V0V2VpZ2h0c18CH2luaXQ6IGludmFsaWQgYXNzZXRXZWlnaHRzIHNpemUHCQEMX3ZhbGlkYXRlSW50BAUKbHBGZWVSYXRlXwAABQdNQVhfRkVFAhRpbml0OiBpbnZhbGlkIGxwIGZlZQcJAQxfdmFsaWRhdGVJbnQEBRBwcm90b2NvbEZlZVJhdGVfAAAFB01BWF9GRUUCGmluaXQ6IGludmFsaWQgcHJvdG9jb2wgZmVlBwkBEl92YWxpZGF0ZVRva2VuTmFtZQIFDGxwVG9rZW5OYW1lXwISaW5pdDogaW52YWxpZCBuYW1lBwkBE192YWxpZGF0ZVRva2VuRGVzY3ICBQ1scFRva2VuRGVzY3JfAhNpbml0OiBpbnZhbGlkIGRlc2NyBwkBEV92YWxpZGF0ZURlY2ltYWxzAgUQbHBUb2tlbkRlY2ltYWxzXwIWaW5pdDogaW52YWxpZCBkZWNpbWFscwcJAQxfdmFsaWRhdGVJbnQEBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwAABQ1NQVhfQU1QTElGSUVSAiRpbml0OiBpbnZhbGlkIG1heEFsbG9jYXRpb25BbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUQd2VpZ2h0QW1wbGlmaWVyXwAABRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwIdaW5pdDogaW52YWxpZCB3ZWlnaHRBbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUNc2xpcHBhZ2VSYXRlXwAABQdNQVhfSU5UAhppbml0OiBpbnZhbGlkIHNsaXBwYWdlUmF0ZQcJAQxfdmFsaWRhdGVJbnQEBQtmZWVNYXhSYXRlXwAABQdNQVhfSU5UAhhpbml0OiBpbnZhbGlkIGZlZU1heFJhdGUHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFFHByb3RvY29sRmVlQ29udHJhY3RfAiFpbml0OiBpbnZhbGlkIHByb3RvY29sRmVlQ29udHJhY3QHCQEMX3ZhbGlkYXRlSW50BAUKcHJlY2lzaW9uXwABBQdNQVhfSU5UAhdpbml0OiBpbnZhbGlkIHByZWNpc2lvbgcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIUaW5pdDogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyBA0kdDA0MTk3MDQyMDM5CQEUX3ByZXBhcmVBc3NldFdlaWdodHMBBQ1hc3NldFdlaWdodHNfBAxhc3NldFdlaWdodHMIBQ0kdDA0MTk3MDQyMDM5Al8xBAtzaWdtYVdlaWdodAgFDSR0MDQxOTcwNDIwMzkCXzIEDWFzc2V0QmFsYW5jZXMJARVfcHJlcGFyZUFzc2V0QmFsYW5jZXMBBQdhc3NldHNfBAVpc3N1ZQkAwggFBQxscFRva2VuTmFtZV8FDWxwVG9rZW5EZXNjcl8AAAUQbHBUb2tlbkRlY2ltYWxzXwYECWxwQXNzZXRJZAkAuAgBBQVpc3N1ZQQOc3RvcmFnZVVwZGF0ZWQJAJwKCgUJbHBBc3NldElkBgAABQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8JARFAZXh0ck5hdGl2ZSgxMDYyKQEFFHByb3RvY29sRmVlQ29udHJhY3RfCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCBQVpc3N1ZQUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJAQtfc2F2ZUFzc2V0cwEFB2Fzc2V0c18JARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzCQERX3NhdmVBc3NldFdlaWdodHMBBQxhc3NldFdlaWdodHMJAQ5fc2F2ZVByZWNpc2lvbgEFCnByZWNpc2lvbl8JARJfc2F2ZVNpZ21hRmVlUGVyTHABCQESX2xvYWRTaWdtYUZlZVBlckxwAAkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpkZXBvc2l0QWxsAQdhbW91bnRfBANlcnIDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIaZGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDQzNzg5NDM4NzQJAQtfZGVwb3NpdEFsbAEFB2Ftb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNDM3ODk0Mzg3NAJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDQzNzg5NDM4NzQCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0Mzc4OTQzODc0Al8zCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQPcGF5bWVudEFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAQUcGF5bWVudEFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ9wYXltZW50QXNzZXRTdHIEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAkQMCBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBQVpbmRleAQOcmVxdWlyZWRBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFFHBheW1lbnRBc3NldERlY2ltYWxzBQdDRUlMSU5HBARlcnIxAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyBQRlbGVtCQACAQkArAICAiNkZXBvc2l0QWxsOiBpbnZhbGlkIHBheW1lbnQ6IGluZGV4PQkApAMBBQVpbmRleAMJAGcCAAAFDnJlcXVpcmVkQW1vdW50CQACAQImZGVwb3NpdEFsbDogdG9vIGxpdHRsZSBhbW91bnQgcmVxdWlyZWQFBHVuaXQDCQAAAgUEZXJyMQUEZXJyMQQGY2hhbmdlAwkAZgIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAUDbmlsAwkAZgIFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIoZGVwb3NpdEFsbDogaW5zdWZmaWNpZW50IHBheW1lbnQsIGluZGV4PQkApAMBBQVpbmRleAILLCByZXF1aXJlZD0JAKQDAQUOcmVxdWlyZWRBbW91bnQFA25pbAkAlAoCCQBkAgUFaW5kZXgAAQkAzggCCAUDYWNjAl8yBQZjaGFuZ2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDQ1MDE3NDUwNzkKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDQ1MDE3NDUwNzkCXzEEDWNoYW5nZUFjdGlvbnMIBQ0kdDA0NTAxNzQ1MDc5Al8yBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGQCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb01pbnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvTWludAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMFDWNoYW5nZUFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAEMbWluTHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQxtaW5McEFtb3VudF8AAAUHTUFYX0lOVAIeZGVwb3NpdDogaW52YWxpZCBtaW4gbHAgYW1vdW50AwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBGVycjEDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl9jaGVja1dhdGNoZG9nAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMACQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBAhhc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRTdHIEEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNDY1MTk0NjYzNQkBCF9kZXBvc2l0AgUIYXNzZXRTdHIFEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNDY1MTk0NjYzNQJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ2NTE5NDY2MzUCXzIEBWxwRmVlCAUNJHQwNDY1MTk0NjYzNQJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0NjUxOTQ2NjM1Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ2NTE5NDY2MzUCXzUEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUEBGVycjIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvU2VuZAUMbWluTHBBbW91bnRfBQdNQVhfSU5UAhZkZXBvc2l0OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjIFBGVycjIEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvU2VuZAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUMbHBBc3NldElkU3RyCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUMbHBBc3NldElkU3RyCQEQX3NhdmVQcm90b2NvbEZlZQIFDGxwQXNzZXRJZFN0cgkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDGxwQXNzZXRJZFN0cgkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3dpdGhkcmF3QWxsAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkA2AQBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECIndpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAiN3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ4MDk2NDgxODMJAQxfd2l0aGRyYXdBbGwBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQObHBUb2tlbnNUb0J1cm4IBQ0kdDA0ODA5NjQ4MTgzAl8xBA1iYWxhbmNlc1RvUGF5CAUNJHQwNDgwOTY0ODE4MwJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ4MDk2NDgxODMCXzMEDnBheW1lbnRBY3Rpb25zCQEYX2dldFBheW1lbnRzRnJvbUJhbGFuY2VzBAUGYXNzZXRzBQ1iYWxhbmNlc1RvUGF5CAUBaQZjYWxsZXIFCmxwRGVjaW1hbHMEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvQnVybggFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBBEJ1cm4CBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9CdXJuBQNuaWwFDnBheW1lbnRBY3Rpb25zCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Aghhc3NldElkXwptaW5BbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEOX2NoZWNrV2F0Y2hkb2cABwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAh93aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEFB01BWF9JTlQCIHdpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFBmFzc2V0cwUIYXNzZXRJZF8CGXdpdGhkcmF3OiBpbnZhbGlkIGFzc2V0SWQHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAht3aXRoZHJhdzogaW52YWxpZCBtaW5BbW91bnQHAwkAAAIFA2VycgUDZXJyBA0kdDA0OTUzNzQ5NjcxCQEJX3dpdGhkcmF3AgUIYXNzZXRJZF8ICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNDk1Mzc0OTY3MQJfMQQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwNDk1Mzc0OTY3MQJfMgQFbHBGZWUIBQ0kdDA0OTUzNzQ5NjcxAl8zBAtwcm90b2NvbEZlZQgFDSR0MDQ5NTM3NDk2NzECXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDk1Mzc0OTY3MQJfNQQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOBARlcnIxCQEMX3ZhbGlkYXRlSW50BAULZmluYWxBbW91bnQFCm1pbkFtb3VudF8FB01BWF9JTlQCF3dpdGhkcmF3OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjEFBGVycjEEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQRCdXJuAgUJbHBBc3NldElkCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQhhc3NldElkXwUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBRJmaW5hbEFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUIYXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQhhc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQhhc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFCGFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEc3dhcAIOdGFyZ2V0QXNzZXRJZF8KbWluQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA5zb3VyY2VBc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBBZzb3VyY2VBbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldFN0cgUKbHBEZWNpbWFscwUERE9XTgQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRTdHICGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fY2hlY2tXYXRjaGRvZwAHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAh9zd2FwOiBpbnZhbGlkIG1pbiB0YXJnZXQgYW1vdW50BwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50BwkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRTdHIFDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECG3N3YXA6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcDCQAAAgUDZXJyBQNlcnIEDSR0MDUxNzg0NTE5NDIJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1MTc4NDUxOTQyAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA1MTc4NDUxOTQyAl8yBAVscEZlZQgFDSR0MDUxNzg0NTE5NDICXzMEC3Byb3RvY29sRmVlCAUNJHQwNTE3ODQ1MTk0MgJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1MTc4NDUxOTQyAl81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDnRhcmdldEFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04EBGVycjEJAQxfdmFsaWRhdGVJbnQEBQtmaW5hbEFtb3VudAUKbWluQW1vdW50XwUHTUFYX0lOVAITc3dhcDogbGVzcyB0aGFuIG1pbgMJAAACBQRlcnIxBQRlcnIxCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQ50YXJnZXRBc3NldElkXwUDbmlsCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDnRhcmdldEFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUOdGFyZ2V0QXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQ50YXJnZXRBc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWdldERlcG9zaXRBbGwBCWxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUJbHBBbW91bnRfAAEFB01BWF9JTlQCHWdldERlcG9zaXRBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1MzA2MjUzMTQ5CQELX2RlcG9zaXRBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNTMwNjI1MzE0OQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDUzMDYyNTMxNDkCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MzA2MjUzMTQ5Al8zCQCUCgIFA25pbAkAlAoCBQ5scFRva2Vuc1RvTWludAUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpnZXREZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGWdldERlcG9zaXQ6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCGmdldERlcG9zaXQ6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAUHYW1vdW50XwUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNTM5MDg1NDAyNAkBCF9kZXBvc2l0AgUIYXNzZXRJZF8FEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNTM5MDg1NDAyNAJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDUzOTA4NTQwMjQCXzIEBWxwRmVlCAUNJHQwNTM5MDg1NDAyNAJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1MzkwODU0MDI0Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDUzOTA4NTQwMjQCXzUEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUJAJQKAgUDbmlsBQ5scFRva2Vuc1RvU2VuZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5nZXRXaXRoZHJhd0FsbAEJbHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQlscEFtb3VudF8AAAUHTUFYX0lOVAIeZ2V0V2l0aGRyYXdBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1NDQ2MzU0NTM5CQEMX3dpdGhkcmF3QWxsAQUJbHBBbW91bnRfBA5scFRva2Vuc1RvQnVybggFDSR0MDU0NDYzNTQ1MzkCXzEEDWJhbGFuY2VzVG9HZXQIBQ0kdDA1NDQ2MzU0NTM5Al8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNTQ0NjM1NDUzOQJfMwkAlAoCBQNuaWwFDWJhbGFuY2VzVG9HZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELZ2V0V2l0aGRyYXcCCGFzc2V0SWRfB2Ftb3VudF8EA2VycgMJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMABQhhc3NldElkXwIaZ2V0V2l0aGRyYXc6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCG2dldFdpdGhkcmF3OiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEDSR0MDU1MTkwNTUzMDYJAQlfd2l0aGRyYXcCBQhhc3NldElkXwUHYW1vdW50XwQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDU1MTkwNTUzMDYCXzEEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1NTE5MDU1MzA2Al8yBAVscEZlZQgFDSR0MDU1MTkwNTUzMDYCXzMEC3Byb3RvY29sRmVlCAUNJHQwNTUxOTA1NTMwNgJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1NTE5MDU1MzA2Al81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdnZXRTd2FwAw5zb3VyY2VBc3NldElkXw50YXJnZXRBc3NldElkXw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQFDXNvdXJjZUFtb3VudF8JAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldElkXwUKbHBEZWNpbWFscwUERE9XTgQDZXJyAwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50CQEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBQ5zb3VyY2VBc3NldElkXwUOdGFyZ2V0QXNzZXRJZF8CEXN3YXA6IHNhbWUgYXNzZXRzBwMJAAACBQNlcnIFA2VycgQNJHQwNTY3MTY1Njg3NAkBBV9zd2FwAwUQc291cmNlQXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDU2NzE2NTY4NzQCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDU2NzE2NTY4NzQCXzIEBWxwRmVlCAUNJHQwNTY3MTY1Njg3NAJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1NjcxNjU2ODc0Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDU2NzE2NTY4NzQCXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgkAlAoCBQNuaWwFC2ZpbmFsQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGdldENsYWltAQV1c2VyXwQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwIWZ2V0Q2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBA0kdDA1NzUxNjU3NTcyCQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU3NTE2NTc1NzICXzEEC3VzZXJQcm9maXRzCAUNJHQwNTc1MTY1NzU3MgJfMgkAlAoCBQNuaWwFC3VzZXJQcm9maXRzAWkBC2dldFV0aWxGdW5jAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwNTc5MDU1Nzk2NQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1NzkwNTU3OTY1Al8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwNTc5MDU1Nzk2NQJfMgQNJHQwNTc5NzA1ODAyMwkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwNTc5NzA1ODAyMwJfMQQLc2lnbWFXZWlnaHQIBQ0kdDA1Nzk3MDU4MDIzAl8yBANmZWUJAQ1fY2FsY3VsYXRlRmVlBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUECXV0aWxWYWx1ZQkAZQIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQkAlAoCBQNuaWwJAJQKAgUJdXRpbFZhbHVlBQ1scFRvdGFsU3VwcGx5AWkBCmdldEZlZUZ1bmMABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEDSR0MDU4NDU1NTg1MTUJARJfbG9hZEFzc2V0QmFsYW5jZXMABA1hc3NldEJhbGFuY2VzCAUNJHQwNTg0NTU1ODUxNQJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDU4NDU1NTg1MTUCXzIEDSR0MDU4NTIwNTg1NzMJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDU4NTIwNTg1NzMCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwNTg1MjA1ODU3MwJfMgQDZmVlCQENX2NhbGN1bGF0ZUZlZQcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlCQCUCgIFA25pbAUDZmVlAWkBCmNoZWNrcG9pbnQBBXVzZXJfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhhjaGVja3BvaW50OiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgkBC19jaGVja3BvaW50AQUEdXNlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEIBQdzdG9yYWdlAl8xBARlcnIxAwMJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHHN0YWtlOiBpbnZhbGlkIHBheW1lbnRzIHNpemUJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhxzdGFrZTogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCHXN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBA0kdDA1OTU4MTU5NjQxCQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTk1ODE1OTY0MQJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1OTU4MTU5NjQxAl8yCQCUCgIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBkAgkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDF9zYXZlVG90YWxMcAEJAGQCCQEMX2xvYWRUb3RhbExwAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5zdGFrZQEHYW1vdW50XwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQZ1c2VyTHACF3Vuc3Rha2U6IGludmFsaWQgYW1vdW50AwkAAAIFBGVycjEFBGVycjEEDSR0MDYwMTUyNjAyMTIJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA2MDE1MjYwMjEyAl8xBAt1c2VyUHJvZml0cwgFDSR0MDYwMTUyNjAyMTICXzIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FCWxwQXNzZXRJZAUDbmlsBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBlAgUGdXNlckxwBQdhbW91bnRfCQEMX3NhdmVUb3RhbExwAQkAZQIJAQxfbG9hZFRvdGFsTHAABQdhbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwITY2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQGdXNlckxwCQELX2xvYWRVc2VyTHABBQR1c2VyBA0kdDA2MDkzNTYwOTkxCQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDYwOTM1NjA5OTECXzEEC3VzZXJQcm9maXRzCAUNJHQwNjA5MzU2MDk5MQJfMgoBCGZvbGRGdW5jAgNhY2MGcHJvZml0BAVpbmRleAgFA2FjYwJfMQMDCQBnAgUIbWF4SW5kZXgFBWluZGV4CQBmAgUGcHJvZml0AAAHBAVhc3NldAkAkQMCBQZhc3NldHMFBWluZGV4CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAkAzQgCCAUDYWNjAl8zCQEOU2NyaXB0VHJhbnNmZXIDBQR1c2VyBQZwcm9maXQJAQtfc3RyVG9Bc3NldAEFBWFzc2V0CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFBnByb2ZpdAgFA2FjYwJfMwQNJHQwNjEzNjk2MTQ2MAoAAiRsBQt1c2VyUHJvZml0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwNjEzNjk2MTQ2MAJfMQQSdXNlclByb2ZpdHNVcGRhdGVkCAUNJHQwNjEzNjk2MTQ2MAJfMgQNcHJvZml0QWN0aW9ucwgFDSR0MDYxMzY5NjE0NjACXzMJAJQKAgkAzggCCQDOCAIFDXByb2ZpdEFjdGlvbnMJANEIAgURY2hlY2twb2ludEFjdGlvbnMAAAkBEF9zYXZlVXNlclByb2ZpdHMCBQR1c2VyBRJ1c2VyUHJvZml0c1VwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFcGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEGBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3VucGF1c2UABANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQELX3doZW5QYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEHBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVwZGF0ZVBhdXNlcgEHcGF1c2VyXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhx1cGRhdGVQYXVzZXI6IGludmFsaWQgcGF1c2VyBwMJAAACBQNlcnIFA2VycgkAlAoCCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDnVwZGF0ZVdhdGNoZG9nAgl3YXRjaGRvZ18Hb2Zmc2V0XwQDZXJyAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUJd2F0Y2hkb2dfAiB1cGRhdGVXYXRjaGRvZzogaW52YWxpZCB3YXRjaGRvZwcJAQxfdmFsaWRhdGVJbnQEBQdvZmZzZXRfAAAFB01BWF9JTlQCHnVwZGF0ZVdhdGNoZG9nOiBpbnZhbGlkIG9mZnNldAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQENX3NhdmVXYXRjaGRvZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXdhdGNoZG9nXwkBE19zYXZlV2F0Y2hkb2dPZmZzZXQBBQdvZmZzZXRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF92YWxpZGF0ZUFkZHJlc3MCBQltdWx0aXNpZ18CHXNldE11bHRpc2lnOiBpbnZhbGlkIG11bHRpc2lnBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQNTRVAHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5J4SrIg==", "height": 2825745, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 45EcZ4Gs9aJD2wdXAf97tZHLipSGDFcahParJbc6iX5Q Next: Hf3fvNhNvCyWnakTSnRyHEJT4VV933TgkD6LXrUQcEW2 Diff:
OldNewDifferences
6868 let KEY_TOTAL_LP = "TOTAL_LP"
6969
7070 let KEY_USER_PROFITS = "USER_PROFITS"
71+
72+let KEY_WATCHDOG = "WATCHDOG"
73+
74+let KEY_WATCHDOG_OFFSET = "WATCHDOG_OFFSET"
75+
76+let KEY_WATCHDOG_HEIGHT = "WATCHDOG_HEIGHT"
7177
7278 func _validateAddress (address_,err_) = match addressFromString(address_) {
7379 case a: Address =>
566572 }
567573
568574
575+func _loadWatchdog () = match getString(KEY_WATCHDOG) {
576+ case a: String =>
577+ addressFromStringValue(a)
578+ case _ =>
579+ Address(base58'')
580+}
581+
582+
583+func _saveWatchdog (watchdog_) = [StringEntry(KEY_WATCHDOG, toString(watchdog_))]
584+
585+
586+func _loadWatchdogOffset () = match getInteger(KEY_WATCHDOG_OFFSET) {
587+ case a: Int =>
588+ a
589+ case _ =>
590+ 0
591+}
592+
593+
594+func _saveWatchdogOffset (offset_) = [IntegerEntry(KEY_WATCHDOG_OFFSET, offset_)]
595+
596+
569597 func _onlyThisContract (caller_) = if ((caller_ != this))
570598 then throw("_onlyThisContract: revert")
571599 else true
605633 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
606634 then throw("_onlyPauser: revert")
607635 else true
636+
637+
638+func _checkWatchdog () = {
639+ let wd = match getInteger(_loadWatchdog(), KEY_WATCHDOG_HEIGHT) {
640+ case a: Int =>
641+ (a + _loadWatchdogOffset())
642+ case _ =>
643+ 0
644+ }
645+ if ((height > wd))
646+ then throw("_checkWatchdog: revert")
647+ else true
648+ }
608649
609650
610651 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
926967 }
927968
928969
929-func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
930- func foldFunc (acc,balance) = {
931- let index = acc._1
932- let equilibrium = fraction(assetsTotalSupply_, weights_[index], sigmaWeight_)
933- $Tuple2((index + 1), (acc._2 + _calculateMicroFee(balance, equilibrium, weightAmplifier_, slippageRate_, feeMaxRate_)))
934- }
935-
936- let result = {
937- let $l = balances_
938- let $s = size($l)
939- let $acc0 = $Tuple2(0, 0)
940- func $f0_1 ($a,$i) = if (($i >= $s))
941- then $a
942- else foldFunc($a, $l[$i])
943-
944- func $f0_2 ($a,$i) = if (($i >= $s))
945- then $a
946- else throw("List size exceeds 10")
947-
948- $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)
949- }
950- result._2
951- }
970+func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = 0
952971
953972
954973 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
10411060 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10421061 }
10431062
1044- let $t02460524678 = {
1063+ let $t02552025593 = {
10451064 let $l = ZERO_INT_LIST_11
10461065 let $s = size($l)
10471066 let $acc0 = $Tuple2(0, nil)
10551074
10561075 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10571076 }
1058- let idx = $t02460524678._1
1059- let profitsUpdated = $t02460524678._2
1077+ let idx = $t02552025593._1
1078+ let profitsUpdated = $t02552025593._2
10601079 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10611080 }
10621081
10701089 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10711090 }
10721091
1073- let $t02532825407 = {
1092+ let $t02624326322 = {
10741093 let $l = ZERO_INT_LIST_11
10751094 let $s = size($l)
10761095 let $acc0 = $Tuple2(0, nil)
10841103
10851104 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10861105 }
1087- let idx = $t02532825407._1
1088- let sigmaFeePerLpUpdated = $t02532825407._2
1106+ let idx = $t02624326322._1
1107+ let sigmaFeePerLpUpdated = $t02624326322._2
10891108 sigmaFeePerLpUpdated
10901109 }
10911110
10931112 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10941113 let sigmaFeePerLp = _loadSigmaFeePerLp()
10951114 let totalLp = _loadTotalLp()
1096- let $t02562825903 = if ((totalLp == 0))
1115+ let $t02654326818 = if ((totalLp == 0))
10971116 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10981117 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1099- let lpFee = $t02562825903._1
1100- let protocolFee = $t02562825903._2
1118+ let lpFee = $t02654326818._1
1119+ let protocolFee = $t02654326818._2
11011120 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11021121 then sigmaFeePerLp
11031122 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11121131 let slippageRate = storage._8
11131132 let feeMaxRate = storage._9
11141133 let assets = _loadAssets()
1115- let $t02641226465 = _loadAssetWeights()
1116- let assetWeights = $t02641226465._1
1117- let sigmaWeight = $t02641226465._2
1118- let $t02647026538 = _loadAssetBalances()
1119- let prevAssetBalances = $t02647026538._1
1120- let prevAssetTotalSupply = $t02647026538._2
1121- let $t02654427774 = if ((prevAssetTotalSupply == 0))
1134+ let $t02732727380 = _loadAssetWeights()
1135+ let assetWeights = $t02732727380._1
1136+ let sigmaWeight = $t02732727380._2
1137+ let $t02738527453 = _loadAssetBalances()
1138+ let prevAssetBalances = $t02738527453._1
1139+ let prevAssetTotalSupply = $t02738527453._2
1140+ let $t02745928689 = if ((prevAssetTotalSupply == 0))
11221141 then {
11231142 func foldFunc (acc,elem) = {
11241143 let index = acc._1
11261145 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11271146 }
11281147
1129- let $t02698627060 = {
1148+ let $t02790127975 = {
11301149 let $l = assets
11311150 let $s = size($l)
11321151 let $acc0 = $Tuple2(0, nil)
11401159
11411160 $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)
11421161 }
1143- let idx = $t02698627060._1
1144- let requiredAmountsNormalized = $t02698627060._2
1162+ let idx = $t02790127975._1
1163+ let requiredAmountsNormalized = $t02790127975._2
11451164 $Tuple2(amount_, requiredAmountsNormalized)
11461165 }
11471166 else {
11521171 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11531172 }
11541173
1155- let $t02760327678 = {
1174+ let $t02851828593 = {
11561175 let $l = assets
11571176 let $s = size($l)
11581177 let $acc0 = $Tuple2(0, nil)
11661185
11671186 $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)
11681187 }
1169- let idx = $t02760327678._1
1170- let requiredAmountsNormalized = $t02760327678._2
1188+ let idx = $t02851828593._1
1189+ let requiredAmountsNormalized = $t02851828593._2
11711190 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11721191 }
1173- let lpTokensToMint = $t02654427774._1
1174- let requiredAmountsNormalized = $t02654427774._2
1175- let $t02778027893 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1176- let assetBalances = $t02778027893._1
1177- let assetTotalSupply = $t02778027893._2
1192+ let lpTokensToMint = $t02745928689._1
1193+ let requiredAmountsNormalized = $t02745928689._2
1194+ let $t02869528808 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1195+ let assetBalances = $t02869528808._1
1196+ let assetTotalSupply = $t02869528808._2
11781197 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11791198 if ((err2 == err2))
11801199 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11921211 let slippageRate = storage._8
11931212 let feeMaxRate = storage._9
11941213 let assets = _loadAssets()
1195- let $t02865628709 = _loadAssetWeights()
1196- let assetWeights = $t02865628709._1
1197- let sigmaWeight = $t02865628709._2
1198- let $t02871428828 = _loadAssetBalances()
1199- let prevAssetBalances = $t02871428828._1
1200- let prevAssetTotalSupply = $t02871428828._2
1214+ let $t02957129624 = _loadAssetWeights()
1215+ let assetWeights = $t02957129624._1
1216+ let sigmaWeight = $t02957129624._2
1217+ let $t02962929743 = _loadAssetBalances()
1218+ let prevAssetBalances = $t02962929743._1
1219+ let prevAssetTotalSupply = $t02962929743._2
12011220 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12021221 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12031222 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12171236 then lpTokensToMintInner
12181237 else throw("Strict value is not equal to itself.")
12191238 }
1220- let $t03049030621 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1221- let lpFee = $t03049030621._1
1222- let protocolFee = $t03049030621._2
1223- let sigmaFeePerLpUpdated = $t03049030621._3
1239+ let $t03140531536 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1240+ let lpFee = $t03140531536._1
1241+ let protocolFee = $t03140531536._2
1242+ let sigmaFeePerLpUpdated = $t03140531536._3
12241243 $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12251244 }
12261245 else throw("Strict value is not equal to itself.")
12341253 let weightAmplifier = storage._7
12351254 let slippageRate = storage._8
12361255 let feeMaxRate = storage._9
1237- let $t03095531023 = _loadAssetBalances()
1238- let prevAssetBalances = $t03095531023._1
1239- let prevAssetTotalSupply = $t03095531023._2
1240- let $t03102831081 = _loadAssetWeights()
1241- let assetWeights = $t03102831081._1
1242- let sigmaWeight = $t03102831081._2
1256+ let $t03187031938 = _loadAssetBalances()
1257+ let prevAssetBalances = $t03187031938._1
1258+ let prevAssetTotalSupply = $t03187031938._2
1259+ let $t03194331996 = _loadAssetWeights()
1260+ let assetWeights = $t03194331996._1
1261+ let sigmaWeight = $t03194331996._2
12431262 let lpTokensToBurn = amount_
12441263 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12451264 if ((err == err))
12461265 then {
1247- let $t03122331356 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1248- let assetBalances = $t03122331356._1
1249- let assetTotalSupply = $t03122331356._2
1250- let balancesToPay = $t03122331356._3
1266+ let $t03213832271 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1267+ let assetBalances = $t03213832271._1
1268+ let assetTotalSupply = $t03213832271._2
1269+ let balancesToPay = $t03213832271._3
12511270 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12521271 if ((err2 == err2))
12531272 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12681287 let feeMaxRate = storage._9
12691288 let precision = _loadPrecision()
12701289 let assets = _loadAssets()
1271- let $t03214832216 = _loadAssetBalances()
1272- let prevAssetBalances = $t03214832216._1
1273- let prevAssetTotalSupply = $t03214832216._2
1274- let $t03222132274 = _loadAssetWeights()
1275- let assetWeights = $t03222132274._1
1276- let sigmaWeight = $t03222132274._2
1290+ let $t03306333131 = _loadAssetBalances()
1291+ let prevAssetBalances = $t03306333131._1
1292+ let prevAssetTotalSupply = $t03306333131._2
1293+ let $t03313633189 = _loadAssetWeights()
1294+ let assetWeights = $t03313633189._1
1295+ let sigmaWeight = $t03313633189._2
12771296 let targetAssetIndex = value(indexOf(assets, assetId_))
12781297 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12791298 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12801299 let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
12811300 let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
1301+ let prevUtilValueDivLp = fraction(toBigInt(prevUtilValue), PERCENT_FACTOR, toBigInt(lpTotalSupply), CEILING)
12821302 func foldFunc (acc,elem) = if (acc._1)
12831303 then acc
12841304 else {
12911311 if (if (((utilValue - prevUtilValueWithK) > (-1 * precision)))
12921312 then (precision > (utilValue - prevUtilValueWithK))
12931313 else false)
1294- then $Tuple4(true, startInner, stopInner, currentAmount)
1314+ then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
12951315 else if ((0 > (utilValue - prevUtilValueWithK)))
1296- then $Tuple4(false, startInner, currentAmount, currentAmount)
1297- else $Tuple4(false, currentAmount, stopInner, currentAmount)
1316+ then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValueWithK))
1317+ else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
12981318 }
12991319
13001320 let targetAmount = {
1301- let $t03380933924 = {
1321+ let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1322+ let $t03505535167 = {
13021323 let $l = LIST_64
13031324 let $s = size($l)
1304- let $acc0 = $Tuple4(false, 0, (lpAmount_ + prevFee), 0)
1325+ let $acc0 = $Tuple5(false, 0, stop, 0, 0)
13051326 func $f0_1 ($a,$i) = if (($i >= $s))
13061327 then $a
13071328 else foldFunc($a, $l[$i])
13121333
13131334 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
13141335 }
1315- let success = $t03380933924._1
1316- let startOut = $t03380933924._2
1317- let stopOut = $t03380933924._3
1318- let targetAmountOut = $t03380933924._4
1336+ let success = $t03505535167._1
1337+ let startOut = $t03505535167._2
1338+ let stopOut = $t03505535167._3
1339+ let targetAmountOut = $t03505535167._4
1340+ let diffOut = $t03505535167._5
13191341 if (!(success))
1320- then throw(("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)))
1342+ then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
13211343 else targetAmountOut
13221344 }
13231345 let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
13271349 else false
13281350 if ((err1 == err1))
13291351 then {
1330- let $t03488235030 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1331- let lpFee = $t03488235030._1
1332- let protocolFee = $t03488235030._2
1333- let sigmaFeePerLpUpdated = $t03488235030._3
1352+ let $t03615936307 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1353+ let lpFee = $t03615936307._1
1354+ let protocolFee = $t03615936307._2
1355+ let sigmaFeePerLpUpdated = $t03615936307._3
13341356 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13351357 }
13361358 else throw("Strict value is not equal to itself.")
13491371 let slippageRate = storage._8
13501372 let feeMaxRate = storage._9
13511373 let precision = _loadPrecision()
1352- let $t03561235680 = _loadAssetBalances()
1353- let prevAssetBalances = $t03561235680._1
1354- let prevAssetTotalSupply = $t03561235680._2
1355- let $t03568535738 = _loadAssetWeights()
1356- let assetWeights = $t03568535738._1
1357- let sigmaWeight = $t03568535738._2
1374+ let $t03688936957 = _loadAssetBalances()
1375+ let prevAssetBalances = $t03688936957._1
1376+ let prevAssetTotalSupply = $t03688936957._2
1377+ let $t03696237015 = _loadAssetWeights()
1378+ let assetWeights = $t03696237015._1
1379+ let sigmaWeight = $t03696237015._2
13581380 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13591381 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13601382 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13711393 if (if (((utilValue - prevUtilValue) > (-1 * precision)))
13721394 then (precision > (utilValue - prevUtilValue))
13731395 else false)
1374- then $Tuple4(true, startInner, stopInner, currentAmount)
1396+ then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValue))
13751397 else if ((0 > (utilValue - prevUtilValue)))
1376- then $Tuple4(false, startInner, currentAmount, currentAmount)
1377- else $Tuple4(false, currentAmount, stopInner, currentAmount)
1398+ then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValue))
1399+ else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValue))
13781400 }
13791401
13801402 let targetAmount = {
13861408 if ((feeDiff == 0))
13871409 then targetAmount
13881410 else {
1389- let $t03762537744 = {
1411+ let $t03898839119 = {
13901412 let $l = LIST_64
13911413 let $s = size($l)
1392- let $acc0 = $Tuple4(false, 0, (sourceAmount_ + prevFee), 0)
1414+ let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
13931415 func $f0_1 ($a,$i) = if (($i >= $s))
13941416 then $a
13951417 else foldFunc($a, $l[$i])
14001422
14011423 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
14021424 }
1403- let success = $t03762537744._1
1404- let startOut = $t03762537744._2
1405- let stopOut = $t03762537744._3
1406- let targetAmountOut = $t03762537744._4
1425+ let success = $t03898839119._1
1426+ let startOut = $t03898839119._2
1427+ let stopOut = $t03898839119._3
1428+ let targetAmountOut = $t03898839119._4
1429+ let diffOut = $t03898839119._5
14071430 if (!(success))
1408- then throw(("_swap: can't calculate targetAmount=" + toString(targetAmountOut)))
1431+ then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
14091432 else targetAmountOut
14101433 }
14111434 }
14161439 else false
14171440 if ((err1 == err1))
14181441 then {
1419- let $t03855738698 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1420- let lpFee = $t03855738698._1
1421- let protocolFee = $t03855738698._2
1422- let sigmaFeePerLpUpdated = $t03855738698._3
1442+ let $t03996640107 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1443+ let lpFee = $t03996640107._1
1444+ let protocolFee = $t03996640107._2
1445+ let sigmaFeePerLpUpdated = $t03996640107._3
14231446 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14241447 }
14251448 else throw("Strict value is not equal to itself.")
14651488 else false
14661489 if ((err == err))
14671490 then {
1468- let $t04056140630 = _prepareAssetWeights(assetWeights_)
1469- let assetWeights = $t04056140630._1
1470- let sigmaWeight = $t04056140630._2
1491+ let $t04197042039 = _prepareAssetWeights(assetWeights_)
1492+ let assetWeights = $t04197042039._1
1493+ let sigmaWeight = $t04197042039._2
14711494 let assetBalances = _prepareAssetBalances(assets_)
14721495 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14731496 let lpAssetId = calculateAssetId(issue)
14921515 let lpAssetId = storage._1
14931516 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14941517 let assets = _loadAssets()
1495- let $t04238042465 = _depositAll(amount_)
1496- let lpTokensToMint = $t04238042465._1
1497- let requiredAmountsNormalized = $t04238042465._2
1498- let assetBalances = $t04238042465._3
1518+ let $t04378943874 = _depositAll(amount_)
1519+ let lpTokensToMint = $t04378943874._1
1520+ let requiredAmountsNormalized = $t04378943874._2
1521+ let assetBalances = $t04378943874._3
14991522 func foldFunc (acc,elem) = {
15001523 let index = acc._1
15011524 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15191542 else throw("Strict value is not equal to itself.")
15201543 }
15211544
1522- let $t04360843670 = {
1545+ let $t04501745079 = {
15231546 let $l = assets
15241547 let $s = size($l)
15251548 let $acc0 = $Tuple2(0, nil)
15331556
15341557 $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)
15351558 }
1536- let idx = $t04360843670._1
1537- let changeActions = $t04360843670._2
1559+ let idx = $t04501745079._1
1560+ let changeActions = $t04501745079._2
15381561 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15391562 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15401563 }
15521575 let lpAssetId = storage._1
15531576 let lpAssetIdStr = _assetToStr(lpAssetId)
15541577 let lpDecimals = _getDecimals(lpAssetIdStr)
1555- let err1 = if (if (if (if (_whenInitialized())
1578+ let err1 = if (if (if (if (if (_whenInitialized())
15561579 then _whenNotPaused()
1580+ else false)
1581+ then _checkWatchdog()
15571582 else false)
15581583 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15591584 else false)
15661591 let assetStr = _assetToStr(i.payments[0].assetId)
15671592 let assetDecimals = _getDecimals(assetStr)
15681593 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1569- let $t04508245198 = _deposit(assetStr, amountNormalized)
1570- let lpTokensToMint = $t04508245198._1
1571- let assetBalances = $t04508245198._2
1572- let lpFee = $t04508245198._3
1573- let protocolFee = $t04508245198._4
1574- let sigmaFeePerLpUpdated = $t04508245198._5
1594+ let $t04651946635 = _deposit(assetStr, amountNormalized)
1595+ let lpTokensToMint = $t04651946635._1
1596+ let assetBalances = $t04651946635._2
1597+ let lpFee = $t04651946635._3
1598+ let protocolFee = $t04651946635._4
1599+ let sigmaFeePerLpUpdated = $t04651946635._5
15751600 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
15761601 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15771602 if ((err2 == err2))
15951620 let lpAssetIdStr = toBase58String(lpAssetId)
15961621 let lpDecimals = _getDecimals(lpAssetIdStr)
15971622 let assets = _loadAssets()
1598- let err = if (if (if (if (_whenInitialized())
1599- then _whenNotPaused()
1600- else false)
1623+ let err = if (if (if (_whenInitialized())
16011624 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
16021625 else false)
16031626 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
16061629 else false
16071630 if ((err == err))
16081631 then {
1609- let $t04668746774 = _withdrawAll(i.payments[0].amount)
1610- let lpTokensToBurn = $t04668746774._1
1611- let balancesToPay = $t04668746774._2
1612- let assetBalances = $t04668746774._3
1632+ let $t04809648183 = _withdrawAll(i.payments[0].amount)
1633+ let lpTokensToBurn = $t04809648183._1
1634+ let balancesToPay = $t04809648183._2
1635+ let assetBalances = $t04809648183._3
16131636 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16141637 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16151638 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16261649 let lpAssetIdStr = toBase58String(lpAssetId)
16271650 let lpDecimals = _getDecimals(lpAssetIdStr)
16281651 let assets = _loadAssets()
1629- let err = if (if (if (if (if (if (_whenInitialized())
1652+ let err = if (if (if (if (if (if (if (_whenInitialized())
16301653 then _whenNotPaused()
1654+ else false)
1655+ then _checkWatchdog()
16311656 else false)
16321657 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16331658 else false)
16411666 else false
16421667 if ((err == err))
16431668 then {
1644- let $t04810048234 = _withdraw(assetId_, i.payments[0].amount)
1645- let targetAmountNormalized = $t04810048234._1
1646- let finalAssetBalances = $t04810048234._2
1647- let lpFee = $t04810048234._3
1648- let protocolFee = $t04810048234._4
1649- let sigmaFeePerLpUpdated = $t04810048234._5
1669+ let $t04953749671 = _withdraw(assetId_, i.payments[0].amount)
1670+ let targetAmountNormalized = $t04953749671._1
1671+ let finalAssetBalances = $t04953749671._2
1672+ let lpFee = $t04953749671._3
1673+ let protocolFee = $t04953749671._4
1674+ let sigmaFeePerLpUpdated = $t04953749671._5
16501675 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16511676 let targetDecimals = _getDecimals(assetId_)
16521677 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16771702 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16781703 if ((targetAssetIndex == targetAssetIndex))
16791704 then {
1680- let err = if (if (if (if (if (_whenInitialized())
1705+ let err = if (if (if (if (if (if (_whenInitialized())
16811706 then _whenNotPaused()
1707+ else false)
1708+ then _checkWatchdog()
16821709 else false)
16831710 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16841711 else false)
16901717 else false
16911718 if ((err == err))
16921719 then {
1693- let $t05031950477 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1694- let targetAmountNormalized = $t05031950477._1
1695- let finalAssetBalances = $t05031950477._2
1696- let lpFee = $t05031950477._3
1697- let protocolFee = $t05031950477._4
1698- let sigmaFeePerLpUpdated = $t05031950477._5
1720+ let $t05178451942 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1721+ let targetAmountNormalized = $t05178451942._1
1722+ let finalAssetBalances = $t05178451942._2
1723+ let lpFee = $t05178451942._3
1724+ let protocolFee = $t05178451942._4
1725+ let sigmaFeePerLpUpdated = $t05178451942._5
16991726 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17001727 let targetDecimals = _getDecimals(targetAssetId_)
17011728 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17181745 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17191746 if ((err == err))
17201747 then {
1721- let $t05159751684 = _depositAll(lpAmount_)
1722- let lpTokensToMint = $t05159751684._1
1723- let requiredAmountsNormalized = $t05159751684._2
1724- let assetBalances = $t05159751684._3
1748+ let $t05306253149 = _depositAll(lpAmount_)
1749+ let lpTokensToMint = $t05306253149._1
1750+ let requiredAmountsNormalized = $t05306253149._2
1751+ let assetBalances = $t05306253149._3
17251752 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17261753 }
17271754 else throw("Strict value is not equal to itself.")
17411768 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17421769 let assetDecimals = _getDecimals(assetId_)
17431770 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1744- let $t05244352559 = _deposit(assetId_, amountNormalized)
1745- let lpTokensToMint = $t05244352559._1
1746- let assetBalances = $t05244352559._2
1747- let lpFee = $t05244352559._3
1748- let protocolFee = $t05244352559._4
1749- let sigmaFeePerLpUpdated = $t05244352559._5
1771+ let $t05390854024 = _deposit(assetId_, amountNormalized)
1772+ let lpTokensToMint = $t05390854024._1
1773+ let assetBalances = $t05390854024._2
1774+ let lpFee = $t05390854024._3
1775+ let protocolFee = $t05390854024._4
1776+ let sigmaFeePerLpUpdated = $t05390854024._5
17501777 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17511778 $Tuple2(nil, lpTokensToSend)
17521779 }
17601787 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17611788 if ((err == err))
17621789 then {
1763- let $t05299853074 = _withdrawAll(lpAmount_)
1764- let lpTokensToBurn = $t05299853074._1
1765- let balancesToGet = $t05299853074._2
1766- let assetBalances = $t05299853074._3
1790+ let $t05446354539 = _withdrawAll(lpAmount_)
1791+ let lpTokensToBurn = $t05446354539._1
1792+ let balancesToGet = $t05446354539._2
1793+ let assetBalances = $t05446354539._3
17671794 $Tuple2(nil, balancesToGet)
17681795 }
17691796 else throw("Strict value is not equal to itself.")
17811808 let storage = _loadStorage()
17821809 let lpAssetId = storage._1
17831810 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1784- let $t05372553841 = _withdraw(assetId_, amount_)
1785- let targetAmountNormalized = $t05372553841._1
1786- let assetBalances = $t05372553841._2
1787- let lpFee = $t05372553841._3
1788- let protocolFee = $t05372553841._4
1789- let sigmaFeePerLpUpdated = $t05372553841._5
1811+ let $t05519055306 = _withdraw(assetId_, amount_)
1812+ let targetAmountNormalized = $t05519055306._1
1813+ let assetBalances = $t05519055306._2
1814+ let lpFee = $t05519055306._3
1815+ let protocolFee = $t05519055306._4
1816+ let sigmaFeePerLpUpdated = $t05519055306._5
17901817 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17911818 let targetDecimals = _getDecimals(assetId_)
17921819 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18151842 else false
18161843 if ((err == err))
18171844 then {
1818- let $t05525555413 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1819- let targetAmountNormalized = $t05525555413._1
1820- let finalAssetBalances = $t05525555413._2
1821- let lpFee = $t05525555413._3
1822- let protocolFee = $t05525555413._4
1823- let sigmaFeePerLpUpdated = $t05525555413._5
1845+ let $t05671656874 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1846+ let targetAmountNormalized = $t05671656874._1
1847+ let finalAssetBalances = $t05671656874._2
1848+ let lpFee = $t05671656874._3
1849+ let protocolFee = $t05671656874._4
1850+ let sigmaFeePerLpUpdated = $t05671656874._5
18241851 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18251852 let targetDecimals = _getDecimals(targetAssetId_)
18261853 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18401867 let user = if ((size(user_) > 0))
18411868 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18421869 else i.caller
1843- let $t05605556111 = _checkpoint(user)
1844- let checkpointActions = $t05605556111._1
1845- let userProfits = $t05605556111._2
1870+ let $t05751657572 = _checkpoint(user)
1871+ let checkpointActions = $t05751657572._1
1872+ let userProfits = $t05751657572._2
18461873 $Tuple2(nil, userProfits)
18471874 }
18481875
18551882 let weightAmplifier = storage._7
18561883 let slippageRate = storage._8
18571884 let feeMaxRate = storage._9
1858- let $t05644456504 = _loadAssetBalances()
1859- let assetBalances = $t05644456504._1
1860- let assetTotalSupply = $t05644456504._2
1861- let $t05650956562 = _loadAssetWeights()
1862- let assetWeights = $t05650956562._1
1863- let sigmaWeight = $t05650956562._2
1885+ let $t05790557965 = _loadAssetBalances()
1886+ let assetBalances = $t05790557965._1
1887+ let assetTotalSupply = $t05790557965._2
1888+ let $t05797058023 = _loadAssetWeights()
1889+ let assetWeights = $t05797058023._1
1890+ let sigmaWeight = $t05797058023._2
18641891 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18651892 let utilValue = (assetTotalSupply - fee)
18661893 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18741901 let weightAmplifier = storage._7
18751902 let slippageRate = storage._8
18761903 let feeMaxRate = storage._9
1877- let $t05699457054 = _loadAssetBalances()
1878- let assetBalances = $t05699457054._1
1879- let assetTotalSupply = $t05699457054._2
1880- let $t05705957112 = _loadAssetWeights()
1881- let assetWeights = $t05705957112._1
1882- let sigmaWeight = $t05705957112._2
1904+ let $t05845558515 = _loadAssetBalances()
1905+ let assetBalances = $t05845558515._1
1906+ let assetTotalSupply = $t05845558515._2
1907+ let $t05852058573 = _loadAssetWeights()
1908+ let assetWeights = $t05852058573._1
1909+ let sigmaWeight = $t05852058573._2
18831910 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18841911 $Tuple2(nil, fee)
18851912 }
19191946 else false
19201947 if ((err1 == err1))
19211948 then {
1922- let $t05812058180 = _checkpoint(i.caller)
1923- let checkpointActions = $t05812058180._1
1924- let userProfits = $t05812058180._2
1949+ let $t05958159641 = _checkpoint(i.caller)
1950+ let checkpointActions = $t05958159641._1
1951+ let userProfits = $t05958159641._2
19251952 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19261953 }
19271954 else throw("Strict value is not equal to itself.")
19441971 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19451972 if ((err1 == err1))
19461973 then {
1947- let $t05869158751 = _checkpoint(i.caller)
1948- let checkpointActions = $t05869158751._1
1949- let userProfits = $t05869158751._2
1974+ let $t06015260212 = _checkpoint(i.caller)
1975+ let checkpointActions = $t06015260212._1
1976+ let userProfits = $t06015260212._2
19501977 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19511978 }
19521979 else throw("Strict value is not equal to itself.")
19721999 let assets = [lpAssetIdStr, _loadAssets()]
19732000 let maxIndex = (size(assets) - 1)
19742001 let userLp = _loadUserLp(user)
1975- let $t05947459530 = _checkpoint(user)
1976- let checkpointActions = $t05947459530._1
1977- let userProfits = $t05947459530._2
2002+ let $t06093560991 = _checkpoint(user)
2003+ let checkpointActions = $t06093560991._1
2004+ let userProfits = $t06093560991._2
19782005 func foldFunc (acc,profit) = {
19792006 let index = acc._1
19802007 if (if ((maxIndex >= index))
19872014 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19882015 }
19892016
1990- let $t05990859999 = {
2017+ let $t06136961460 = {
19912018 let $l = userProfits
19922019 let $s = size($l)
19932020 let $acc0 = $Tuple3(0, nil, nil)
20012028
20022029 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
20032030 }
2004- let idx = $t05990859999._1
2005- let userProfitsUpdated = $t05990859999._2
2006- let profitActions = $t05990859999._3
2031+ let idx = $t06136961460._1
2032+ let userProfitsUpdated = $t06136961460._2
2033+ let profitActions = $t06136961460._3
20072034 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
20082035 }
20092036 else throw("Strict value is not equal to itself.")
20272054
20282055 @Callable(i)
20292056 func unpause () = {
2030- let err = if (if (_onlyPauser(i.caller))
2057+ let err = if (if (_onlyThisContract(i.caller))
20312058 then _whenInitialized()
20322059 else false)
20332060 then _whenPaused()
20482075 else false
20492076 if ((err == err))
20502077 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
2078+ else throw("Strict value is not equal to itself.")
2079+ }
2080+
2081+
2082+
2083+@Callable(i)
2084+func updateWatchdog (watchdog_,offset_) = {
2085+ let err = if (if (if (_onlyThisContract(i.caller))
2086+ then _whenInitialized()
2087+ else false)
2088+ then _validateAddress(watchdog_, "updateWatchdog: invalid watchdog")
2089+ else false)
2090+ then _validateInt(offset_, 0, MAX_INT, "updateWatchdog: invalid offset")
2091+ else false
2092+ if ((err == err))
2093+ then $Tuple2((_saveWatchdog(addressFromStringValue(watchdog_)) ++ _saveWatchdogOffset(offset_)), unit)
20512094 else throw("Strict value is not equal to itself.")
20522095 }
20532096
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let WAVES = "waves"
77
88 let MAX_INT = 9223372036854775807
99
1010 let MAX_FEE = 1000000
1111
1212 let MAX_AMPLIFIER = 1000000
1313
1414 let MAX_WEIGHT_AMPLIFIER = 1000000
1515
1616 let MAX_WEIGHT = 1000000
1717
1818 let SLIPPAGE_RATE_FACTOR = 1000000
1919
2020 let FEE_RATE_FACTOR = 1000000
2121
2222 let RATE_FACTOR = 1000000
2323
2424 let PERCENT_FACTOR = toBigInt(1000000000000000000)
2525
2626 let ZERO_INT_LIST_10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2727
2828 let ZERO_INT_LIST_11 = (ZERO_INT_LIST_10 :+ 0)
2929
3030 let ZERO_BIGINT = toBigInt(0)
3131
3232 let ZERO_BIGINT_LIST_11 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
3333
3434 let INT_DECIMALS = 8
3535
3636 let BIGINT_DECIMALS = 18
3737
3838 let LIST_64 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
3939
4040 let KEY_MULTISIG = "MULTISIG"
4141
4242 let KEY_STATUS = "STATUS"
4343
4444 let KEY_PAUSED = "PAUSED"
4545
4646 let KEY_PAUSER = "PAUSER"
4747
4848 let KEY_STORAGE = "STORAGE"
4949
5050 let KEY_ASSETS = "ASSETS"
5151
5252 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
5353
5454 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5555
5656 let KEY_LP_FEE = "LP_FEE"
5757
5858 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
5959
6060 let KEY_PRECISION = "PRECISION"
6161
6262 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6363
6464 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6565
6666 let KEY_USER_LP = "USER_LP"
6767
6868 let KEY_TOTAL_LP = "TOTAL_LP"
6969
7070 let KEY_USER_PROFITS = "USER_PROFITS"
71+
72+let KEY_WATCHDOG = "WATCHDOG"
73+
74+let KEY_WATCHDOG_OFFSET = "WATCHDOG_OFFSET"
75+
76+let KEY_WATCHDOG_HEIGHT = "WATCHDOG_HEIGHT"
7177
7278 func _validateAddress (address_,err_) = match addressFromString(address_) {
7379 case a: Address =>
7480 true
7581 case _ =>
7682 throw(err_)
7783 }
7884
7985
8086 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
8187 then true
8288 else match assetInfo(fromBase58String(assetId_)) {
8389 case a: Asset =>
8490 true
8591 case _ =>
8692 throw(err_)
8793 }
8894
8995
9096 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
9197 then true
9298 else (val_ > upperBoundary_))
9399 then throw(err_)
94100 else true
95101
96102
97103 func _validateBool (val_,target_,err_) = if ((val_ != target_))
98104 then throw(err_)
99105 else true
100106
101107
102108 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
103109 then throw(err_)
104110 else true
105111
106112
107113 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
108114 then throw(err_)
109115 else true
110116
111117
112118 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
113119 func foldFunc (acc,elem) = match parseInt(elem) {
114120 case a: Int =>
115121 if (acc)
116122 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
117123 else false
118124 case _ =>
119125 throw(err_)
120126 }
121127
122128 let $l = val_
123129 let $s = size($l)
124130 let $acc0 = true
125131 func $f0_1 ($a,$i) = if (($i >= $s))
126132 then $a
127133 else foldFunc($a, $l[$i])
128134
129135 func $f0_2 ($a,$i) = if (($i >= $s))
130136 then $a
131137 else throw("List size exceeds 10")
132138
133139 $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)
134140 }
135141
136142
137143 func _validateAssets (assets_,err_) = {
138144 func foldFunc (acc,elem) = if (acc)
139145 then _validateAsset(elem, err_)
140146 else false
141147
142148 let $l = assets_
143149 let $s = size($l)
144150 let $acc0 = true
145151 func $f0_1 ($a,$i) = if (($i >= $s))
146152 then $a
147153 else foldFunc($a, $l[$i])
148154
149155 func $f0_2 ($a,$i) = if (($i >= $s))
150156 then $a
151157 else throw("List size exceeds 10")
152158
153159 $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)
154160 }
155161
156162
157163 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
158164 then throw(err_)
159165 else true
160166
161167
162168 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
163169 then true
164170 else (size(val_) > 16))
165171 then throw(err_)
166172 else true
167173
168174
169175 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
170176 then throw(err_)
171177 else true
172178
173179
174180 func _validateDecimals (val_,err_) = if (if ((0 > val_))
175181 then true
176182 else (val_ > 8))
177183 then throw(err_)
178184 else true
179185
180186
181187 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
182188 case a: ByteVector =>
183189 if ((assetId_ != toBase58String(a)))
184190 then throw((err_ + ": asset"))
185191 else if ((requiredAmount_ > payment_.amount))
186192 then throw((err_ + ": amount"))
187193 else true
188194 case _ =>
189195 throw((err_ + ": asset"))
190196 }
191197
192198
193199 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
194200 then throw(err_)
195201 else true
196202
197203
198204 func _assetToStr (asset_) = match asset_ {
199205 case a: ByteVector =>
200206 toBase58String(a)
201207 case _ =>
202208 WAVES
203209 }
204210
205211
206212 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
207213 then true
208214 else (asset_ == ""))
209215 then unit
210216 else fromBase58String(asset_)
211217
212218
213219 func _loadPause () = match getBoolean(KEY_PAUSED) {
214220 case a: Boolean =>
215221 a
216222 case _ =>
217223 false
218224 }
219225
220226
221227 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
222228
223229
224230 func _loadPauser () = match getString(KEY_PAUSER) {
225231 case a: String =>
226232 addressFromStringValue(a)
227233 case _ =>
228234 Address(base58'')
229235 }
230236
231237
232238 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
233239
234240
235241 func _loadMultisig () = match getString(KEY_MULTISIG) {
236242 case a: String =>
237243 addressFromStringValue(a)
238244 case _ =>
239245 Address(base58'')
240246 }
241247
242248
243249 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
244250
245251
246252 func _loadStorage () = match getString(KEY_STORAGE) {
247253 case a: String =>
248254 let struct = split(a, SEP)
249255 $Tuple10(fromBase58String(struct[0]), (struct[1] == "1"), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseIntValue(struct[5]), parseIntValue(struct[6]), parseIntValue(struct[7]), parseIntValue(struct[8]), addressFromStringValue(struct[9]))
250256 case _ =>
251257 $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
252258 }
253259
254260
255261 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
256262 then "1"
257263 else "0", toString(storage_._3), toString(storage_._4), toString(storage_._5), toString(storage_._6), toString(storage_._7), toString(storage_._8), toString(storage_._9), toString(storage_._10)], SEP))]
258264
259265
260266 func _loadAssets () = match getString(KEY_ASSETS) {
261267 case a: String =>
262268 if ((size(a) > 0))
263269 then split_51C(a, SEP)
264270 else nil
265271 case _ =>
266272 nil
267273 }
268274
269275
270276 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
271277
272278
273279 func _loadAssetBalances () = {
274280 func foldFunc (acc,elem) = {
275281 let balance = parseIntValue(elem)
276282 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
277283 }
278284
279285 match getString(KEY_ASSET_BALANCES) {
280286 case a: String =>
281287 if ((size(a) > 0))
282288 then {
283289 let $l = split_51C(a, SEP)
284290 let $s = size($l)
285291 let $acc0 = $Tuple2(nil, 0)
286292 func $f0_1 ($a,$i) = if (($i >= $s))
287293 then $a
288294 else foldFunc($a, $l[$i])
289295
290296 func $f0_2 ($a,$i) = if (($i >= $s))
291297 then $a
292298 else throw("List size exceeds 10")
293299
294300 $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)
295301 }
296302 else $Tuple2(ZERO_INT_LIST_10, 0)
297303 case _ =>
298304 $Tuple2(ZERO_INT_LIST_10, 0)
299305 }
300306 }
301307
302308
303309 func _saveAssetBalances (balances_) = {
304310 func foldFunc (acc,elem) = (acc :+ toString(elem))
305311
306312 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
307313 let $l = balances_
308314 let $s = size($l)
309315 let $acc0 = nil
310316 func $f0_1 ($a,$i) = if (($i >= $s))
311317 then $a
312318 else foldFunc($a, $l[$i])
313319
314320 func $f0_2 ($a,$i) = if (($i >= $s))
315321 then $a
316322 else throw("List size exceeds 10")
317323
318324 $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)
319325 }, SEP))]
320326 }
321327
322328
323329 func _loadAssetWeights () = {
324330 func foldFunc (acc,elem) = {
325331 let weight = parseIntValue(elem)
326332 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
327333 }
328334
329335 match getString(KEY_ASSET_WEIGHTS) {
330336 case a: String =>
331337 if ((size(a) > 0))
332338 then {
333339 let $l = split_51C(a, SEP)
334340 let $s = size($l)
335341 let $acc0 = $Tuple2(nil, 0)
336342 func $f0_1 ($a,$i) = if (($i >= $s))
337343 then $a
338344 else foldFunc($a, $l[$i])
339345
340346 func $f0_2 ($a,$i) = if (($i >= $s))
341347 then $a
342348 else throw("List size exceeds 10")
343349
344350 $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)
345351 }
346352 else $Tuple2(ZERO_INT_LIST_10, 0)
347353 case _ =>
348354 $Tuple2(ZERO_INT_LIST_10, 0)
349355 }
350356 }
351357
352358
353359 func _saveAssetWeights (weights_) = {
354360 func foldFunc (acc,elem) = (acc :+ toString(elem))
355361
356362 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
357363 let $l = weights_
358364 let $s = size($l)
359365 let $acc0 = nil
360366 func $f0_1 ($a,$i) = if (($i >= $s))
361367 then $a
362368 else foldFunc($a, $l[$i])
363369
364370 func $f0_2 ($a,$i) = if (($i >= $s))
365371 then $a
366372 else throw("List size exceeds 10")
367373
368374 $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)
369375 }, SEP))]
370376 }
371377
372378
373379 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
374380 case a: Int =>
375381 a
376382 case _ =>
377383 0
378384 }
379385
380386
381387 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
382388
383389
384390 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
385391 case a: Int =>
386392 a
387393 case _ =>
388394 0
389395 }
390396
391397
392398 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
393399
394400
395401 func _loadPrecision () = match getInteger(KEY_PRECISION) {
396402 case a: Int =>
397403 a
398404 case _ =>
399405 0
400406 }
401407
402408
403409 func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
404410
405411
406412 func _loadSigmaFeePerLp () = {
407413 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
408414
409415 match getString(KEY_SIGMA_FEE_PER_LP) {
410416 case a: String =>
411417 if ((size(a) > 0))
412418 then {
413419 let $l = split_51C(a, SEP)
414420 let $s = size($l)
415421 let $acc0 = nil
416422 func $f0_1 ($a,$i) = if (($i >= $s))
417423 then $a
418424 else foldFunc($a, $l[$i])
419425
420426 func $f0_2 ($a,$i) = if (($i >= $s))
421427 then $a
422428 else throw("List size exceeds 11")
423429
424430 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
425431 }
426432 else ZERO_BIGINT_LIST_11
427433 case _ =>
428434 ZERO_BIGINT_LIST_11
429435 }
430436 }
431437
432438
433439 func _saveSigmaFeePerLp (val_) = {
434440 func foldFunc (acc,elem) = (acc :+ toString(elem))
435441
436442 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
437443 let $l = val_
438444 let $s = size($l)
439445 let $acc0 = nil
440446 func $f0_1 ($a,$i) = if (($i >= $s))
441447 then $a
442448 else foldFunc($a, $l[$i])
443449
444450 func $f0_2 ($a,$i) = if (($i >= $s))
445451 then $a
446452 else throw("List size exceeds 11")
447453
448454 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
449455 }, SEP))]
450456 }
451457
452458
453459 func _loadUserSigmaFeePerLp (user_) = {
454460 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
455461
456462 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
457463 case a: String =>
458464 if ((size(a) > 0))
459465 then {
460466 let $l = split_51C(a, SEP)
461467 let $s = size($l)
462468 let $acc0 = nil
463469 func $f0_1 ($a,$i) = if (($i >= $s))
464470 then $a
465471 else foldFunc($a, $l[$i])
466472
467473 func $f0_2 ($a,$i) = if (($i >= $s))
468474 then $a
469475 else throw("List size exceeds 11")
470476
471477 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
472478 }
473479 else ZERO_BIGINT_LIST_11
474480 case _ =>
475481 ZERO_BIGINT_LIST_11
476482 }
477483 }
478484
479485
480486 func _saveUserSigmaFeePerLp (user_,val_) = {
481487 func foldFunc (acc,elem) = (acc :+ toString(elem))
482488
483489 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
484490 let $l = val_
485491 let $s = size($l)
486492 let $acc0 = nil
487493 func $f0_1 ($a,$i) = if (($i >= $s))
488494 then $a
489495 else foldFunc($a, $l[$i])
490496
491497 func $f0_2 ($a,$i) = if (($i >= $s))
492498 then $a
493499 else throw("List size exceeds 11")
494500
495501 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
496502 }, SEP))]
497503 }
498504
499505
500506 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
501507 case a: Int =>
502508 a
503509 case _ =>
504510 0
505511 }
506512
507513
508514 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
509515
510516
511517 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
512518 case a: Int =>
513519 a
514520 case _ =>
515521 0
516522 }
517523
518524
519525 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
520526
521527
522528 func _loadUserProfits (user_) = {
523529 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
524530
525531 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
526532 case a: String =>
527533 if ((size(a) > 0))
528534 then {
529535 let $l = split_51C(a, SEP)
530536 let $s = size($l)
531537 let $acc0 = nil
532538 func $f0_1 ($a,$i) = if (($i >= $s))
533539 then $a
534540 else foldFunc($a, $l[$i])
535541
536542 func $f0_2 ($a,$i) = if (($i >= $s))
537543 then $a
538544 else throw("List size exceeds 11")
539545
540546 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
541547 }
542548 else ZERO_INT_LIST_11
543549 case _ =>
544550 ZERO_INT_LIST_11
545551 }
546552 }
547553
548554
549555 func _saveUserProfits (user_,val_) = {
550556 func foldFunc (acc,elem) = (acc :+ toString(elem))
551557
552558 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
553559 let $l = val_
554560 let $s = size($l)
555561 let $acc0 = nil
556562 func $f0_1 ($a,$i) = if (($i >= $s))
557563 then $a
558564 else foldFunc($a, $l[$i])
559565
560566 func $f0_2 ($a,$i) = if (($i >= $s))
561567 then $a
562568 else throw("List size exceeds 11")
563569
564570 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
565571 }, SEP))]
566572 }
567573
568574
575+func _loadWatchdog () = match getString(KEY_WATCHDOG) {
576+ case a: String =>
577+ addressFromStringValue(a)
578+ case _ =>
579+ Address(base58'')
580+}
581+
582+
583+func _saveWatchdog (watchdog_) = [StringEntry(KEY_WATCHDOG, toString(watchdog_))]
584+
585+
586+func _loadWatchdogOffset () = match getInteger(KEY_WATCHDOG_OFFSET) {
587+ case a: Int =>
588+ a
589+ case _ =>
590+ 0
591+}
592+
593+
594+func _saveWatchdogOffset (offset_) = [IntegerEntry(KEY_WATCHDOG_OFFSET, offset_)]
595+
596+
569597 func _onlyThisContract (caller_) = if ((caller_ != this))
570598 then throw("_onlyThisContract: revert")
571599 else true
572600
573601
574602 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
575603 then throw("_whenMultisigSet: revert")
576604 else true
577605
578606
579607 func _whenNotInitialized () = {
580608 let storage = _loadStorage()
581609 if ((storage._1 != base58''))
582610 then throw("_whenNotInitialized: revert")
583611 else true
584612 }
585613
586614
587615 func _whenInitialized () = {
588616 let storage = _loadStorage()
589617 if ((storage._1 == base58''))
590618 then throw("_whenInitialized: revert")
591619 else true
592620 }
593621
594622
595623 func _whenNotPaused () = if (_loadPause())
596624 then throw("_whenNotPaused: revert")
597625 else true
598626
599627
600628 func _whenPaused () = if (!(_loadPause()))
601629 then throw("_whenPaused: revert")
602630 else true
603631
604632
605633 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
606634 then throw("_onlyPauser: revert")
607635 else true
636+
637+
638+func _checkWatchdog () = {
639+ let wd = match getInteger(_loadWatchdog(), KEY_WATCHDOG_HEIGHT) {
640+ case a: Int =>
641+ (a + _loadWatchdogOffset())
642+ case _ =>
643+ 0
644+ }
645+ if ((height > wd))
646+ then throw("_checkWatchdog: revert")
647+ else true
648+ }
608649
609650
610651 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
611652 case a: Asset =>
612653 a.decimals
613654 case _ =>
614655 throw(("_getDecimals: no asset=" + assetId_))
615656 }
616657
617658
618659 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
619660 then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
620661 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
621662
622663
623664 func _prepareAssetBalances (assets_) = {
624665 func foldFunc (acc,elem) = (acc :+ 0)
625666
626667 let $l = assets_
627668 let $s = size($l)
628669 let $acc0 = nil
629670 func $f0_1 ($a,$i) = if (($i >= $s))
630671 then $a
631672 else foldFunc($a, $l[$i])
632673
633674 func $f0_2 ($a,$i) = if (($i >= $s))
634675 then $a
635676 else throw("List size exceeds 10")
636677
637678 $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)
638679 }
639680
640681
641682 func _prepareAssetWeights (assetWeights_) = {
642683 func foldFunc (acc,elem) = {
643684 let weight = parseIntValue(elem)
644685 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
645686 }
646687
647688 let $l = assetWeights_
648689 let $s = size($l)
649690 let $acc0 = $Tuple2(nil, 0)
650691 func $f0_1 ($a,$i) = if (($i >= $s))
651692 then $a
652693 else foldFunc($a, $l[$i])
653694
654695 func $f0_2 ($a,$i) = if (($i >= $s))
655696 then $a
656697 else throw("List size exceeds 10")
657698
658699 $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)
659700 }
660701
661702
662703 func _getAssetBalances (assets_,decimals_) = {
663704 func foldFunc (acc,elem) = {
664705 let assetDecimals = _getDecimals(elem)
665706 let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
666707 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
667708 }
668709
669710 let $l = assets_
670711 let $s = size($l)
671712 let $acc0 = $Tuple2(nil, 0)
672713 func $f0_1 ($a,$i) = if (($i >= $s))
673714 then $a
674715 else foldFunc($a, $l[$i])
675716
676717 func $f0_2 ($a,$i) = if (($i >= $s))
677718 then $a
678719 else throw("List size exceeds 10")
679720
680721 $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)
681722 }
682723
683724
684725 func _listIntToString (assets_) = {
685726 func foldFunc (acc,elem) = (acc :+ toString(elem))
686727
687728 makeString({
688729 let $l = assets_
689730 let $s = size($l)
690731 let $acc0 = nil
691732 func $f0_1 ($a,$i) = if (($i >= $s))
692733 then $a
693734 else foldFunc($a, $l[$i])
694735
695736 func $f0_2 ($a,$i) = if (($i >= $s))
696737 then $a
697738 else throw("List size exceeds 11")
698739
699740 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
700741 }, SEP)
701742 }
702743
703744
704745 func _listBigIntToString (assets_) = {
705746 func foldFunc (acc,elem) = (acc :+ toString(elem))
706747
707748 makeString({
708749 let $l = assets_
709750 let $s = size($l)
710751 let $acc0 = nil
711752 func $f0_1 ($a,$i) = if (($i >= $s))
712753 then $a
713754 else foldFunc($a, $l[$i])
714755
715756 func $f0_2 ($a,$i) = if (($i >= $s))
716757 then $a
717758 else throw("List size exceeds 11")
718759
719760 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
720761 }, SEP)
721762 }
722763
723764
724765 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
725766 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
726767
727768 let $l = weights_
728769 let $s = size($l)
729770 let $acc0 = nil
730771 func $f0_1 ($a,$i) = if (($i >= $s))
731772 then $a
732773 else foldFunc($a, $l[$i])
733774
734775 func $f0_2 ($a,$i) = if (($i >= $s))
735776 then $a
736777 else throw("List size exceeds 10")
737778
738779 $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)
739780 }
740781
741782
742783 func _incrementBalancesByAmounts (balances_,amounts_) = {
743784 func foldFunc (acc,elem) = {
744785 let index = acc._1
745786 let amount = amounts_[index]
746787 let newBalance = (elem + amount)
747788 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
748789 }
749790
750791 let result = {
751792 let $l = balances_
752793 let $s = size($l)
753794 let $acc0 = $Tuple3(0, nil, 0)
754795 func $f0_1 ($a,$i) = if (($i >= $s))
755796 then $a
756797 else foldFunc($a, $l[$i])
757798
758799 func $f0_2 ($a,$i) = if (($i >= $s))
759800 then $a
760801 else throw("List size exceeds 10")
761802
762803 $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)
763804 }
764805 $Tuple2(result._2, result._3)
765806 }
766807
767808
768809 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
769810 func foldFunc (acc,elem) = {
770811 let index = acc._1
771812 let payment = payments_[index]
772813 let paymentAssetStr = _assetToStr(payment.assetId)
773814 let err = if ((paymentAssetStr != assets_[index]))
774815 then throw(((err_ + ": index=") + toString(index)))
775816 else unit
776817 if ((err == err))
777818 then {
778819 let assetDecimals = _getDecimals(paymentAssetStr)
779820 let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
780821 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
781822 }
782823 else throw("Strict value is not equal to itself.")
783824 }
784825
785826 let result = {
786827 let $l = balances_
787828 let $s = size($l)
788829 let $acc0 = $Tuple3(0, nil, 0)
789830 func $f0_1 ($a,$i) = if (($i >= $s))
790831 then $a
791832 else foldFunc($a, $l[$i])
792833
793834 func $f0_2 ($a,$i) = if (($i >= $s))
794835 then $a
795836 else throw("List size exceeds 10")
796837
797838 $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)
798839 }
799840 $Tuple2(result._2, result._3)
800841 }
801842
802843
803844 func _incrementBalanceByIndex (balances_,index_,amount_) = {
804845 func foldFunc (acc,elem) = {
805846 let index = acc._1
806847 if ((index == index_))
807848 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
808849 else $Tuple2((index + 1), (acc._2 :+ elem))
809850 }
810851
811852 let result = {
812853 let $l = balances_
813854 let $s = size($l)
814855 let $acc0 = $Tuple2(0, nil)
815856 func $f0_1 ($a,$i) = if (($i >= $s))
816857 then $a
817858 else foldFunc($a, $l[$i])
818859
819860 func $f0_2 ($a,$i) = if (($i >= $s))
820861 then $a
821862 else throw("List size exceeds 10")
822863
823864 $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)
824865 }
825866 result._2
826867 }
827868
828869
829870 func _decrementBalanceByIndex (balances_,index_,amount_) = {
830871 func foldFunc (acc,elem) = {
831872 let index = acc._1
832873 if ((index == index_))
833874 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
834875 else $Tuple2((index + 1), (acc._2 :+ elem))
835876 }
836877
837878 let result = {
838879 let $l = balances_
839880 let $s = size($l)
840881 let $acc0 = $Tuple2(0, nil)
841882 func $f0_1 ($a,$i) = if (($i >= $s))
842883 then $a
843884 else foldFunc($a, $l[$i])
844885
845886 func $f0_2 ($a,$i) = if (($i >= $s))
846887 then $a
847888 else throw("List size exceeds 10")
848889
849890 $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)
850891 }
851892 result._2
852893 }
853894
854895
855896 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
856897 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
857898 func foldFunc (acc,elem) = {
858899 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
859900 let deltaBalance = (elem - newBalance)
860901 $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
861902 }
862903
863904 let $l = balances_
864905 let $s = size($l)
865906 let $acc0 = $Tuple3(nil, 0, nil)
866907 func $f0_1 ($a,$i) = if (($i >= $s))
867908 then $a
868909 else foldFunc($a, $l[$i])
869910
870911 func $f0_2 ($a,$i) = if (($i >= $s))
871912 then $a
872913 else throw("List size exceeds 10")
873914
874915 $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)
875916 }
876917
877918
878919 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
879920 func foldFunc (acc,elem) = {
880921 let index = acc._1
881922 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
882923 }
883924
884925 let result = {
885926 let $l = assets_
886927 let $s = size($l)
887928 let $acc0 = $Tuple2(0, nil)
888929 func $f0_1 ($a,$i) = if (($i >= $s))
889930 then $a
890931 else foldFunc($a, $l[$i])
891932
892933 func $f0_2 ($a,$i) = if (($i >= $s))
893934 then $a
894935 else throw("List size exceeds 10")
895936
896937 $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)
897938 }
898939 result._2
899940 }
900941
901942
902943 func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
903944 then {
904945 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
905946 if ((threshold > balance_))
906947 then {
907948 let maxDeviation = (threshold - balance_)
908949 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
909950 if ((feeRate > feeMaxRate_))
910951 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
911952 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
912953 }
913954 else 0
914955 }
915956 else {
916957 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
917958 if ((balance_ > threshold))
918959 then {
919960 let maxDeviation = (balance_ - threshold)
920961 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
921962 if ((feeRate > feeMaxRate_))
922963 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
923964 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
924965 }
925966 else 0
926967 }
927968
928969
929-func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
930- func foldFunc (acc,balance) = {
931- let index = acc._1
932- let equilibrium = fraction(assetsTotalSupply_, weights_[index], sigmaWeight_)
933- $Tuple2((index + 1), (acc._2 + _calculateMicroFee(balance, equilibrium, weightAmplifier_, slippageRate_, feeMaxRate_)))
934- }
935-
936- let result = {
937- let $l = balances_
938- let $s = size($l)
939- let $acc0 = $Tuple2(0, 0)
940- func $f0_1 ($a,$i) = if (($i >= $s))
941- then $a
942- else foldFunc($a, $l[$i])
943-
944- func $f0_2 ($a,$i) = if (($i >= $s))
945- then $a
946- else throw("List size exceeds 10")
947-
948- $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)
949- }
950- result._2
951- }
970+func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = 0
952971
953972
954973 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
955974 then true
956975 else (lpTotalSupply_ == 0))
957976 then true
958977 else {
959978 let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
960979 let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
961980 let diff = (newAssetsRate - prevAssetsRate)
962981 if (if ((0 >= diff))
963982 then ((-1 * _loadPrecision()) > diff)
964983 else false)
965984 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
966985 else true
967986 }
968987
969988
970989 func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
971990 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
972991 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
973992 let diff = (newUtil - prevUtil)
974993 if (if ((0 >= diff))
975994 then ((-1 * _loadPrecision()) > diff)
976995 else false)
977996 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
978997 else true
979998 }
980999
9811000
9821001 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
9831002 let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
9841003 let maxAllocationAmp = if ((balance_ > equilibrium))
9851004 then (MAX_AMPLIFIER + maxAllocAmp_)
9861005 else (MAX_AMPLIFIER - maxAllocAmp_)
9871006 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
9881007 let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
9891008 if ((balance_ > equilibrium))
9901009 then if ((balance_ > maxAllocation))
9911010 then if ((prevMaxAllocation > prevBalance_))
9921011 then throw("_validateAssetAllocation: new up")
9931012 else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
9941013 then throw("_validateAssetAllocation: still up")
9951014 else true
9961015 else true
9971016 else if ((maxAllocation > balance_))
9981017 then if ((prevBalance_ > prevMaxAllocation))
9991018 then throw("_validateAssetAllocation: new down")
10001019 else if (((maxAllocation - balance_) > (prevMaxAllocation - prevBalance_)))
10011020 then throw("_validateAssetAllocation: still down")
10021021 else true
10031022 else true
10041023 }
10051024
10061025
10071026 func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = {
10081027 func foldFunc (acc,elem) = {
10091028 let index = acc._1
10101029 $Tuple2((index + 1), if (acc._2)
10111030 then _validateAssetAllocation(elem, assetTotalSupply_, prevAssetBalances_[index], prevAssetTotalSupply_, assetWeights_[index], sigmaWeight_, maxAllocAmp_)
10121031 else false)
10131032 }
10141033
10151034 let result = {
10161035 let $l = assetBalances_
10171036 let $s = size($l)
10181037 let $acc0 = $Tuple2(0, true)
10191038 func $f0_1 ($a,$i) = if (($i >= $s))
10201039 then $a
10211040 else foldFunc($a, $l[$i])
10221041
10231042 func $f0_2 ($a,$i) = if (($i >= $s))
10241043 then $a
10251044 else throw("List size exceeds 10")
10261045
10271046 $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)
10281047 }
10291048 result._2
10301049 }
10311050
10321051
10331052 func _checkpoint (user_) = {
10341053 let userLp = _loadUserLp(user_)
10351054 let userProfits = _loadUserProfits(user_)
10361055 let sigmaFeePerLp = _loadSigmaFeePerLp()
10371056 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10381057 func foldFunc (acc,elem) = {
10391058 let index = acc._1
10401059 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10411060 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10421061 }
10431062
1044- let $t02460524678 = {
1063+ let $t02552025593 = {
10451064 let $l = ZERO_INT_LIST_11
10461065 let $s = size($l)
10471066 let $acc0 = $Tuple2(0, nil)
10481067 func $f0_1 ($a,$i) = if (($i >= $s))
10491068 then $a
10501069 else foldFunc($a, $l[$i])
10511070
10521071 func $f0_2 ($a,$i) = if (($i >= $s))
10531072 then $a
10541073 else throw("List size exceeds 11")
10551074
10561075 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10571076 }
1058- let idx = $t02460524678._1
1059- let profitsUpdated = $t02460524678._2
1077+ let idx = $t02552025593._1
1078+ let profitsUpdated = $t02552025593._2
10601079 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10611080 }
10621081
10631082
10641083 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10651084 func foldFunc (acc,elem) = {
10661085 let index = acc._1
10671086 let sigmaFeePerLpUpdated = if ((index_ == index))
10681087 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10691088 else sigmaFeePerLp_[index]
10701089 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10711090 }
10721091
1073- let $t02532825407 = {
1092+ let $t02624326322 = {
10741093 let $l = ZERO_INT_LIST_11
10751094 let $s = size($l)
10761095 let $acc0 = $Tuple2(0, nil)
10771096 func $f0_1 ($a,$i) = if (($i >= $s))
10781097 then $a
10791098 else foldFunc($a, $l[$i])
10801099
10811100 func $f0_2 ($a,$i) = if (($i >= $s))
10821101 then $a
10831102 else throw("List size exceeds 11")
10841103
10851104 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
10861105 }
1087- let idx = $t02532825407._1
1088- let sigmaFeePerLpUpdated = $t02532825407._2
1106+ let idx = $t02624326322._1
1107+ let sigmaFeePerLpUpdated = $t02624326322._2
10891108 sigmaFeePerLpUpdated
10901109 }
10911110
10921111
10931112 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10941113 let sigmaFeePerLp = _loadSigmaFeePerLp()
10951114 let totalLp = _loadTotalLp()
1096- let $t02562825903 = if ((totalLp == 0))
1115+ let $t02654326818 = if ((totalLp == 0))
10971116 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10981117 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1099- let lpFee = $t02562825903._1
1100- let protocolFee = $t02562825903._2
1118+ let lpFee = $t02654326818._1
1119+ let protocolFee = $t02654326818._2
11011120 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11021121 then sigmaFeePerLp
11031122 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11041123 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11051124 }
11061125
11071126
11081127 func _depositAll (amount_) = {
11091128 let storage = _loadStorage()
11101129 let lpTotalSupply = storage._3
11111130 let weightAmplifier = storage._7
11121131 let slippageRate = storage._8
11131132 let feeMaxRate = storage._9
11141133 let assets = _loadAssets()
1115- let $t02641226465 = _loadAssetWeights()
1116- let assetWeights = $t02641226465._1
1117- let sigmaWeight = $t02641226465._2
1118- let $t02647026538 = _loadAssetBalances()
1119- let prevAssetBalances = $t02647026538._1
1120- let prevAssetTotalSupply = $t02647026538._2
1121- let $t02654427774 = if ((prevAssetTotalSupply == 0))
1134+ let $t02732727380 = _loadAssetWeights()
1135+ let assetWeights = $t02732727380._1
1136+ let sigmaWeight = $t02732727380._2
1137+ let $t02738527453 = _loadAssetBalances()
1138+ let prevAssetBalances = $t02738527453._1
1139+ let prevAssetTotalSupply = $t02738527453._2
1140+ let $t02745928689 = if ((prevAssetTotalSupply == 0))
11221141 then {
11231142 func foldFunc (acc,elem) = {
11241143 let index = acc._1
11251144 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11261145 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11271146 }
11281147
1129- let $t02698627060 = {
1148+ let $t02790127975 = {
11301149 let $l = assets
11311150 let $s = size($l)
11321151 let $acc0 = $Tuple2(0, nil)
11331152 func $f0_1 ($a,$i) = if (($i >= $s))
11341153 then $a
11351154 else foldFunc($a, $l[$i])
11361155
11371156 func $f0_2 ($a,$i) = if (($i >= $s))
11381157 then $a
11391158 else throw("List size exceeds 10")
11401159
11411160 $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)
11421161 }
1143- let idx = $t02698627060._1
1144- let requiredAmountsNormalized = $t02698627060._2
1162+ let idx = $t02790127975._1
1163+ let requiredAmountsNormalized = $t02790127975._2
11451164 $Tuple2(amount_, requiredAmountsNormalized)
11461165 }
11471166 else {
11481167 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
11491168 func foldFunc1 (acc,elem) = {
11501169 let index = acc._1
11511170 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
11521171 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11531172 }
11541173
1155- let $t02760327678 = {
1174+ let $t02851828593 = {
11561175 let $l = assets
11571176 let $s = size($l)
11581177 let $acc0 = $Tuple2(0, nil)
11591178 func $f0_1 ($a,$i) = if (($i >= $s))
11601179 then $a
11611180 else foldFunc1($a, $l[$i])
11621181
11631182 func $f0_2 ($a,$i) = if (($i >= $s))
11641183 then $a
11651184 else throw("List size exceeds 10")
11661185
11671186 $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)
11681187 }
1169- let idx = $t02760327678._1
1170- let requiredAmountsNormalized = $t02760327678._2
1188+ let idx = $t02851828593._1
1189+ let requiredAmountsNormalized = $t02851828593._2
11711190 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11721191 }
1173- let lpTokensToMint = $t02654427774._1
1174- let requiredAmountsNormalized = $t02654427774._2
1175- let $t02778027893 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1176- let assetBalances = $t02778027893._1
1177- let assetTotalSupply = $t02778027893._2
1192+ let lpTokensToMint = $t02745928689._1
1193+ let requiredAmountsNormalized = $t02745928689._2
1194+ let $t02869528808 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1195+ let assetBalances = $t02869528808._1
1196+ let assetTotalSupply = $t02869528808._2
11781197 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11791198 if ((err2 == err2))
11801199 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11811200 else throw("Strict value is not equal to itself.")
11821201 }
11831202
11841203
11851204 func _deposit (assetId_,amount_) = {
11861205 let storage = _loadStorage()
11871206 let lpTotalSupply = storage._3
11881207 let lpFeeRate = storage._4
11891208 let protocolFeeRate = storage._5
11901209 let maxAllocAmplifier = storage._6
11911210 let weightAmplifier = storage._7
11921211 let slippageRate = storage._8
11931212 let feeMaxRate = storage._9
11941213 let assets = _loadAssets()
1195- let $t02865628709 = _loadAssetWeights()
1196- let assetWeights = $t02865628709._1
1197- let sigmaWeight = $t02865628709._2
1198- let $t02871428828 = _loadAssetBalances()
1199- let prevAssetBalances = $t02871428828._1
1200- let prevAssetTotalSupply = $t02871428828._2
1214+ let $t02957129624 = _loadAssetWeights()
1215+ let assetWeights = $t02957129624._1
1216+ let sigmaWeight = $t02957129624._2
1217+ let $t02962929743 = _loadAssetBalances()
1218+ let prevAssetBalances = $t02962929743._1
1219+ let prevAssetTotalSupply = $t02962929743._2
12011220 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12021221 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12031222 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12041223 if ((err2 == err2))
12051224 then {
12061225 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12071226 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12081227 let lpTokensToMint = if ((lpTotalSupply == 0))
12091228 then throw("_deposit: empty pool")
12101229 else {
12111230 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12121231 let feeDiff = (fee - prevFee)
12131232 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
12141233 let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
12151234 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12161235 if ((err3 == err3))
12171236 then lpTokensToMintInner
12181237 else throw("Strict value is not equal to itself.")
12191238 }
1220- let $t03049030621 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1221- let lpFee = $t03049030621._1
1222- let protocolFee = $t03049030621._2
1223- let sigmaFeePerLpUpdated = $t03049030621._3
1239+ let $t03140531536 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1240+ let lpFee = $t03140531536._1
1241+ let protocolFee = $t03140531536._2
1242+ let sigmaFeePerLpUpdated = $t03140531536._3
12241243 $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12251244 }
12261245 else throw("Strict value is not equal to itself.")
12271246 }
12281247
12291248
12301249 func _withdrawAll (amount_) = {
12311250 let storage = _loadStorage()
12321251 let lpTotalSupply = storage._3
12331252 let maxAllocAmplifier = storage._6
12341253 let weightAmplifier = storage._7
12351254 let slippageRate = storage._8
12361255 let feeMaxRate = storage._9
1237- let $t03095531023 = _loadAssetBalances()
1238- let prevAssetBalances = $t03095531023._1
1239- let prevAssetTotalSupply = $t03095531023._2
1240- let $t03102831081 = _loadAssetWeights()
1241- let assetWeights = $t03102831081._1
1242- let sigmaWeight = $t03102831081._2
1256+ let $t03187031938 = _loadAssetBalances()
1257+ let prevAssetBalances = $t03187031938._1
1258+ let prevAssetTotalSupply = $t03187031938._2
1259+ let $t03194331996 = _loadAssetWeights()
1260+ let assetWeights = $t03194331996._1
1261+ let sigmaWeight = $t03194331996._2
12431262 let lpTokensToBurn = amount_
12441263 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12451264 if ((err == err))
12461265 then {
1247- let $t03122331356 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1248- let assetBalances = $t03122331356._1
1249- let assetTotalSupply = $t03122331356._2
1250- let balancesToPay = $t03122331356._3
1266+ let $t03213832271 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1267+ let assetBalances = $t03213832271._1
1268+ let assetTotalSupply = $t03213832271._2
1269+ let balancesToPay = $t03213832271._3
12511270 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12521271 if ((err2 == err2))
12531272 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12541273 else throw("Strict value is not equal to itself.")
12551274 }
12561275 else throw("Strict value is not equal to itself.")
12571276 }
12581277
12591278
12601279 func _withdraw (assetId_,lpAmount_) = {
12611280 let storage = _loadStorage()
12621281 let lpTotalSupply = storage._3
12631282 let lpFeeRate = storage._4
12641283 let protocolFeeRate = storage._5
12651284 let maxAllocAmplifier = storage._6
12661285 let weightAmplifier = storage._7
12671286 let slippageRate = storage._8
12681287 let feeMaxRate = storage._9
12691288 let precision = _loadPrecision()
12701289 let assets = _loadAssets()
1271- let $t03214832216 = _loadAssetBalances()
1272- let prevAssetBalances = $t03214832216._1
1273- let prevAssetTotalSupply = $t03214832216._2
1274- let $t03222132274 = _loadAssetWeights()
1275- let assetWeights = $t03222132274._1
1276- let sigmaWeight = $t03222132274._2
1290+ let $t03306333131 = _loadAssetBalances()
1291+ let prevAssetBalances = $t03306333131._1
1292+ let prevAssetTotalSupply = $t03306333131._2
1293+ let $t03313633189 = _loadAssetWeights()
1294+ let assetWeights = $t03313633189._1
1295+ let sigmaWeight = $t03313633189._2
12771296 let targetAssetIndex = value(indexOf(assets, assetId_))
12781297 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12791298 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12801299 let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
12811300 let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
1301+ let prevUtilValueDivLp = fraction(toBigInt(prevUtilValue), PERCENT_FACTOR, toBigInt(lpTotalSupply), CEILING)
12821302 func foldFunc (acc,elem) = if (acc._1)
12831303 then acc
12841304 else {
12851305 let startInner = acc._2
12861306 let stopInner = acc._3
12871307 let currentAmount = ((stopInner + startInner) / 2)
12881308 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
12891309 let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
12901310 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
12911311 if (if (((utilValue - prevUtilValueWithK) > (-1 * precision)))
12921312 then (precision > (utilValue - prevUtilValueWithK))
12931313 else false)
1294- then $Tuple4(true, startInner, stopInner, currentAmount)
1314+ then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
12951315 else if ((0 > (utilValue - prevUtilValueWithK)))
1296- then $Tuple4(false, startInner, currentAmount, currentAmount)
1297- else $Tuple4(false, currentAmount, stopInner, currentAmount)
1316+ then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValueWithK))
1317+ else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
12981318 }
12991319
13001320 let targetAmount = {
1301- let $t03380933924 = {
1321+ let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1322+ let $t03505535167 = {
13021323 let $l = LIST_64
13031324 let $s = size($l)
1304- let $acc0 = $Tuple4(false, 0, (lpAmount_ + prevFee), 0)
1325+ let $acc0 = $Tuple5(false, 0, stop, 0, 0)
13051326 func $f0_1 ($a,$i) = if (($i >= $s))
13061327 then $a
13071328 else foldFunc($a, $l[$i])
13081329
13091330 func $f0_2 ($a,$i) = if (($i >= $s))
13101331 then $a
13111332 else throw("List size exceeds 64")
13121333
13131334 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
13141335 }
1315- let success = $t03380933924._1
1316- let startOut = $t03380933924._2
1317- let stopOut = $t03380933924._3
1318- let targetAmountOut = $t03380933924._4
1336+ let success = $t03505535167._1
1337+ let startOut = $t03505535167._2
1338+ let stopOut = $t03505535167._3
1339+ let targetAmountOut = $t03505535167._4
1340+ let diffOut = $t03505535167._5
13191341 if (!(success))
1320- then throw(("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)))
1342+ then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
13211343 else targetAmountOut
13221344 }
13231345 let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
13241346 let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
13251347 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
13261348 then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13271349 else false
13281350 if ((err1 == err1))
13291351 then {
1330- let $t03488235030 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1331- let lpFee = $t03488235030._1
1332- let protocolFee = $t03488235030._2
1333- let sigmaFeePerLpUpdated = $t03488235030._3
1352+ let $t03615936307 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1353+ let lpFee = $t03615936307._1
1354+ let protocolFee = $t03615936307._2
1355+ let sigmaFeePerLpUpdated = $t03615936307._3
13341356 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13351357 }
13361358 else throw("Strict value is not equal to itself.")
13371359 }
13381360
13391361
13401362 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13411363 let storage = _loadStorage()
13421364 let lpAssetId = storage._1
13431365 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13441366 let lpTotalSupply = storage._3
13451367 let lpFeeRate = storage._4
13461368 let protocolFeeRate = storage._5
13471369 let maxAllocAmplifier = storage._6
13481370 let weightAmplifier = storage._7
13491371 let slippageRate = storage._8
13501372 let feeMaxRate = storage._9
13511373 let precision = _loadPrecision()
1352- let $t03561235680 = _loadAssetBalances()
1353- let prevAssetBalances = $t03561235680._1
1354- let prevAssetTotalSupply = $t03561235680._2
1355- let $t03568535738 = _loadAssetWeights()
1356- let assetWeights = $t03568535738._1
1357- let sigmaWeight = $t03568535738._2
1374+ let $t03688936957 = _loadAssetBalances()
1375+ let prevAssetBalances = $t03688936957._1
1376+ let prevAssetTotalSupply = $t03688936957._2
1377+ let $t03696237015 = _loadAssetWeights()
1378+ let assetWeights = $t03696237015._1
1379+ let sigmaWeight = $t03696237015._2
13581380 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13591381 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13601382 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13611383 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13621384 func foldFunc (acc,elem) = if (acc._1)
13631385 then acc
13641386 else {
13651387 let startInner = acc._2
13661388 let stopInner = acc._3
13671389 let currentAmount = ((stopInner + startInner) / 2)
13681390 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
13691391 let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
13701392 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
13711393 if (if (((utilValue - prevUtilValue) > (-1 * precision)))
13721394 then (precision > (utilValue - prevUtilValue))
13731395 else false)
1374- then $Tuple4(true, startInner, stopInner, currentAmount)
1396+ then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValue))
13751397 else if ((0 > (utilValue - prevUtilValue)))
1376- then $Tuple4(false, startInner, currentAmount, currentAmount)
1377- else $Tuple4(false, currentAmount, stopInner, currentAmount)
1398+ then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValue))
1399+ else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValue))
13781400 }
13791401
13801402 let targetAmount = {
13811403 let targetAmount = sourceAmount_
13821404 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
13831405 let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
13841406 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13851407 let feeDiff = (fee - prevFee)
13861408 if ((feeDiff == 0))
13871409 then targetAmount
13881410 else {
1389- let $t03762537744 = {
1411+ let $t03898839119 = {
13901412 let $l = LIST_64
13911413 let $s = size($l)
1392- let $acc0 = $Tuple4(false, 0, (sourceAmount_ + prevFee), 0)
1414+ let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
13931415 func $f0_1 ($a,$i) = if (($i >= $s))
13941416 then $a
13951417 else foldFunc($a, $l[$i])
13961418
13971419 func $f0_2 ($a,$i) = if (($i >= $s))
13981420 then $a
13991421 else throw("List size exceeds 64")
14001422
14011423 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
14021424 }
1403- let success = $t03762537744._1
1404- let startOut = $t03762537744._2
1405- let stopOut = $t03762537744._3
1406- let targetAmountOut = $t03762537744._4
1425+ let success = $t03898839119._1
1426+ let startOut = $t03898839119._2
1427+ let stopOut = $t03898839119._3
1428+ let targetAmountOut = $t03898839119._4
1429+ let diffOut = $t03898839119._5
14071430 if (!(success))
1408- then throw(("_swap: can't calculate targetAmount=" + toString(targetAmountOut)))
1431+ then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
14091432 else targetAmountOut
14101433 }
14111434 }
14121435 let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
14131436 let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
14141437 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
14151438 then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
14161439 else false
14171440 if ((err1 == err1))
14181441 then {
1419- let $t03855738698 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1420- let lpFee = $t03855738698._1
1421- let protocolFee = $t03855738698._2
1422- let sigmaFeePerLpUpdated = $t03855738698._3
1442+ let $t03996640107 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1443+ let lpFee = $t03996640107._1
1444+ let protocolFee = $t03996640107._2
1445+ let sigmaFeePerLpUpdated = $t03996640107._3
14231446 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14241447 }
14251448 else throw("Strict value is not equal to itself.")
14261449 }
14271450
14281451
14291452 @Callable(i)
14301453 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
14311454 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
14321455 then _whenNotInitialized()
14331456 else false)
14341457 then _whenMultisigSet()
14351458 else false)
14361459 then _validateAssets(assets_, "init: invalid assets")
14371460 else false)
14381461 then _validateIntList(assetWeights_, 1, MAX_WEIGHT, "init: invalid assetWeights")
14391462 else false)
14401463 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
14411464 else false)
14421465 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
14431466 else false)
14441467 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
14451468 else false)
14461469 then _validateTokenName(lpTokenName_, "init: invalid name")
14471470 else false)
14481471 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
14491472 else false)
14501473 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14511474 else false)
14521475 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
14531476 else false)
14541477 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14551478 else false)
14561479 then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
14571480 else false)
14581481 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14591482 else false)
14601483 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
14611484 else false)
14621485 then _validateInt(precision_, 1, MAX_INT, "init: invalid precision")
14631486 else false)
14641487 then _validateAddress(pauser_, "init: invalid pauser")
14651488 else false
14661489 if ((err == err))
14671490 then {
1468- let $t04056140630 = _prepareAssetWeights(assetWeights_)
1469- let assetWeights = $t04056140630._1
1470- let sigmaWeight = $t04056140630._2
1491+ let $t04197042039 = _prepareAssetWeights(assetWeights_)
1492+ let assetWeights = $t04197042039._1
1493+ let sigmaWeight = $t04197042039._2
14711494 let assetBalances = _prepareAssetBalances(assets_)
14721495 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14731496 let lpAssetId = calculateAssetId(issue)
14741497 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
14751498 $Tuple2(((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14761499 }
14771500 else throw("Strict value is not equal to itself.")
14781501 }
14791502
14801503
14811504
14821505 @Callable(i)
14831506 func depositAll (amount_) = {
14841507 let err = if (if (_whenInitialized())
14851508 then _whenNotPaused()
14861509 else false)
14871510 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14881511 else false
14891512 if ((err == err))
14901513 then {
14911514 let storage = _loadStorage()
14921515 let lpAssetId = storage._1
14931516 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14941517 let assets = _loadAssets()
1495- let $t04238042465 = _depositAll(amount_)
1496- let lpTokensToMint = $t04238042465._1
1497- let requiredAmountsNormalized = $t04238042465._2
1498- let assetBalances = $t04238042465._3
1518+ let $t04378943874 = _depositAll(amount_)
1519+ let lpTokensToMint = $t04378943874._1
1520+ let requiredAmountsNormalized = $t04378943874._2
1521+ let assetBalances = $t04378943874._3
14991522 func foldFunc (acc,elem) = {
15001523 let index = acc._1
15011524 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15021525 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
15031526 let requiredAmountNormalized = requiredAmountsNormalized[index]
15041527 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
15051528 let err1 = if ((paymentAssetStr != elem))
15061529 then throw(("depositAll: invalid payment: index=" + toString(index)))
15071530 else if ((0 >= requiredAmount))
15081531 then throw("depositAll: too little amount required")
15091532 else unit
15101533 if ((err1 == err1))
15111534 then {
15121535 let change = if ((i.payments[index].amount > requiredAmount))
15131536 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
15141537 else if ((requiredAmount > i.payments[index].amount))
15151538 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
15161539 else nil
15171540 $Tuple2((index + 1), (acc._2 ++ change))
15181541 }
15191542 else throw("Strict value is not equal to itself.")
15201543 }
15211544
1522- let $t04360843670 = {
1545+ let $t04501745079 = {
15231546 let $l = assets
15241547 let $s = size($l)
15251548 let $acc0 = $Tuple2(0, nil)
15261549 func $f0_1 ($a,$i) = if (($i >= $s))
15271550 then $a
15281551 else foldFunc($a, $l[$i])
15291552
15301553 func $f0_2 ($a,$i) = if (($i >= $s))
15311554 then $a
15321555 else throw("List size exceeds 10")
15331556
15341557 $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)
15351558 }
1536- let idx = $t04360843670._1
1537- let changeActions = $t04360843670._2
1559+ let idx = $t04501745079._1
1560+ let changeActions = $t04501745079._2
15381561 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15391562 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15401563 }
15411564 else throw("Strict value is not equal to itself.")
15421565 }
15431566
15441567
15451568
15461569 @Callable(i)
15471570 func deposit (minLpAmount_) = {
15481571 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
15491572 if ((err == err))
15501573 then {
15511574 let storage = _loadStorage()
15521575 let lpAssetId = storage._1
15531576 let lpAssetIdStr = _assetToStr(lpAssetId)
15541577 let lpDecimals = _getDecimals(lpAssetIdStr)
1555- let err1 = if (if (if (if (_whenInitialized())
1578+ let err1 = if (if (if (if (if (_whenInitialized())
15561579 then _whenNotPaused()
1580+ else false)
1581+ then _checkWatchdog()
15571582 else false)
15581583 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15591584 else false)
15601585 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
15611586 else false)
15621587 then _validateInt(i.payments[0].amount, 1, MAX_INT, "deposit: invalid payment amount")
15631588 else false
15641589 if ((err1 == err1))
15651590 then {
15661591 let assetStr = _assetToStr(i.payments[0].assetId)
15671592 let assetDecimals = _getDecimals(assetStr)
15681593 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1569- let $t04508245198 = _deposit(assetStr, amountNormalized)
1570- let lpTokensToMint = $t04508245198._1
1571- let assetBalances = $t04508245198._2
1572- let lpFee = $t04508245198._3
1573- let protocolFee = $t04508245198._4
1574- let sigmaFeePerLpUpdated = $t04508245198._5
1594+ let $t04651946635 = _deposit(assetStr, amountNormalized)
1595+ let lpTokensToMint = $t04651946635._1
1596+ let assetBalances = $t04651946635._2
1597+ let lpFee = $t04651946635._3
1598+ let protocolFee = $t04651946635._4
1599+ let sigmaFeePerLpUpdated = $t04651946635._5
15751600 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
15761601 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15771602 if ((err2 == err2))
15781603 then {
15791604 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15801605 $Tuple2(((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15811606 }
15821607 else throw("Strict value is not equal to itself.")
15831608 }
15841609 else throw("Strict value is not equal to itself.")
15851610 }
15861611 else throw("Strict value is not equal to itself.")
15871612 }
15881613
15891614
15901615
15911616 @Callable(i)
15921617 func withdrawAll () = {
15931618 let storage = _loadStorage()
15941619 let lpAssetId = storage._1
15951620 let lpAssetIdStr = toBase58String(lpAssetId)
15961621 let lpDecimals = _getDecimals(lpAssetIdStr)
15971622 let assets = _loadAssets()
1598- let err = if (if (if (if (_whenInitialized())
1599- then _whenNotPaused()
1600- else false)
1623+ let err = if (if (if (_whenInitialized())
16011624 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
16021625 else false)
16031626 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
16041627 else false)
16051628 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdrawAll: invalid payment amount")
16061629 else false
16071630 if ((err == err))
16081631 then {
1609- let $t04668746774 = _withdrawAll(i.payments[0].amount)
1610- let lpTokensToBurn = $t04668746774._1
1611- let balancesToPay = $t04668746774._2
1612- let assetBalances = $t04668746774._3
1632+ let $t04809648183 = _withdrawAll(i.payments[0].amount)
1633+ let lpTokensToBurn = $t04809648183._1
1634+ let balancesToPay = $t04809648183._2
1635+ let assetBalances = $t04809648183._3
16131636 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16141637 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16151638 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16161639 }
16171640 else throw("Strict value is not equal to itself.")
16181641 }
16191642
16201643
16211644
16221645 @Callable(i)
16231646 func withdraw (assetId_,minAmount_) = {
16241647 let storage = _loadStorage()
16251648 let lpAssetId = storage._1
16261649 let lpAssetIdStr = toBase58String(lpAssetId)
16271650 let lpDecimals = _getDecimals(lpAssetIdStr)
16281651 let assets = _loadAssets()
1629- let err = if (if (if (if (if (if (_whenInitialized())
1652+ let err = if (if (if (if (if (if (if (_whenInitialized())
16301653 then _whenNotPaused()
1654+ else false)
1655+ then _checkWatchdog()
16311656 else false)
16321657 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16331658 else false)
16341659 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
16351660 else false)
16361661 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdraw: invalid payment amount")
16371662 else false)
16381663 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
16391664 else false)
16401665 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
16411666 else false
16421667 if ((err == err))
16431668 then {
1644- let $t04810048234 = _withdraw(assetId_, i.payments[0].amount)
1645- let targetAmountNormalized = $t04810048234._1
1646- let finalAssetBalances = $t04810048234._2
1647- let lpFee = $t04810048234._3
1648- let protocolFee = $t04810048234._4
1649- let sigmaFeePerLpUpdated = $t04810048234._5
1669+ let $t04953749671 = _withdraw(assetId_, i.payments[0].amount)
1670+ let targetAmountNormalized = $t04953749671._1
1671+ let finalAssetBalances = $t04953749671._2
1672+ let lpFee = $t04953749671._3
1673+ let protocolFee = $t04953749671._4
1674+ let sigmaFeePerLpUpdated = $t04953749671._5
16501675 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16511676 let targetDecimals = _getDecimals(assetId_)
16521677 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16531678 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: less than min")
16541679 if ((err1 == err1))
16551680 then {
16561681 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - i.payments[0].amount), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16571682 $Tuple2(((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16581683 }
16591684 else throw("Strict value is not equal to itself.")
16601685 }
16611686 else throw("Strict value is not equal to itself.")
16621687 }
16631688
16641689
16651690
16661691 @Callable(i)
16671692 func swap (targetAssetId_,minAmount_) = {
16681693 let storage = _loadStorage()
16691694 let lpAssetId = storage._1
16701695 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16711696 let assets = _loadAssets()
16721697 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
16731698 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16741699 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16751700 if ((sourceAssetIndex == sourceAssetIndex))
16761701 then {
16771702 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16781703 if ((targetAssetIndex == targetAssetIndex))
16791704 then {
1680- let err = if (if (if (if (if (_whenInitialized())
1705+ let err = if (if (if (if (if (if (_whenInitialized())
16811706 then _whenNotPaused()
1707+ else false)
1708+ then _checkWatchdog()
16821709 else false)
16831710 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16841711 else false)
16851712 then _validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount")
16861713 else false)
16871714 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
16881715 else false)
16891716 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
16901717 else false
16911718 if ((err == err))
16921719 then {
1693- let $t05031950477 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1694- let targetAmountNormalized = $t05031950477._1
1695- let finalAssetBalances = $t05031950477._2
1696- let lpFee = $t05031950477._3
1697- let protocolFee = $t05031950477._4
1698- let sigmaFeePerLpUpdated = $t05031950477._5
1720+ let $t05178451942 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1721+ let targetAmountNormalized = $t05178451942._1
1722+ let finalAssetBalances = $t05178451942._2
1723+ let lpFee = $t05178451942._3
1724+ let protocolFee = $t05178451942._4
1725+ let sigmaFeePerLpUpdated = $t05178451942._5
16991726 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17001727 let targetDecimals = _getDecimals(targetAssetId_)
17011728 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17021729 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: less than min")
17031730 if ((err1 == err1))
17041731 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
17051732 else throw("Strict value is not equal to itself.")
17061733 }
17071734 else throw("Strict value is not equal to itself.")
17081735 }
17091736 else throw("Strict value is not equal to itself.")
17101737 }
17111738 else throw("Strict value is not equal to itself.")
17121739 }
17131740
17141741
17151742
17161743 @Callable(i)
17171744 func getDepositAll (lpAmount_) = {
17181745 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17191746 if ((err == err))
17201747 then {
1721- let $t05159751684 = _depositAll(lpAmount_)
1722- let lpTokensToMint = $t05159751684._1
1723- let requiredAmountsNormalized = $t05159751684._2
1724- let assetBalances = $t05159751684._3
1748+ let $t05306253149 = _depositAll(lpAmount_)
1749+ let lpTokensToMint = $t05306253149._1
1750+ let requiredAmountsNormalized = $t05306253149._2
1751+ let assetBalances = $t05306253149._3
17251752 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17261753 }
17271754 else throw("Strict value is not equal to itself.")
17281755 }
17291756
17301757
17311758
17321759 @Callable(i)
17331760 func getDeposit (assetId_,amount_) = {
17341761 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
17351762 then _validateInt(amount_, 1, MAX_INT, "getDeposit: invalid amount")
17361763 else false
17371764 if ((err == err))
17381765 then {
17391766 let storage = _loadStorage()
17401767 let lpAssetId = storage._1
17411768 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17421769 let assetDecimals = _getDecimals(assetId_)
17431770 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1744- let $t05244352559 = _deposit(assetId_, amountNormalized)
1745- let lpTokensToMint = $t05244352559._1
1746- let assetBalances = $t05244352559._2
1747- let lpFee = $t05244352559._3
1748- let protocolFee = $t05244352559._4
1749- let sigmaFeePerLpUpdated = $t05244352559._5
1771+ let $t05390854024 = _deposit(assetId_, amountNormalized)
1772+ let lpTokensToMint = $t05390854024._1
1773+ let assetBalances = $t05390854024._2
1774+ let lpFee = $t05390854024._3
1775+ let protocolFee = $t05390854024._4
1776+ let sigmaFeePerLpUpdated = $t05390854024._5
17501777 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17511778 $Tuple2(nil, lpTokensToSend)
17521779 }
17531780 else throw("Strict value is not equal to itself.")
17541781 }
17551782
17561783
17571784
17581785 @Callable(i)
17591786 func getWithdrawAll (lpAmount_) = {
17601787 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17611788 if ((err == err))
17621789 then {
1763- let $t05299853074 = _withdrawAll(lpAmount_)
1764- let lpTokensToBurn = $t05299853074._1
1765- let balancesToGet = $t05299853074._2
1766- let assetBalances = $t05299853074._3
1790+ let $t05446354539 = _withdrawAll(lpAmount_)
1791+ let lpTokensToBurn = $t05446354539._1
1792+ let balancesToGet = $t05446354539._2
1793+ let assetBalances = $t05446354539._3
17671794 $Tuple2(nil, balancesToGet)
17681795 }
17691796 else throw("Strict value is not equal to itself.")
17701797 }
17711798
17721799
17731800
17741801 @Callable(i)
17751802 func getWithdraw (assetId_,amount_) = {
17761803 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
17771804 then _validateInt(amount_, 1, MAX_INT, "getWithdraw: invalid amount")
17781805 else false
17791806 if ((err == err))
17801807 then {
17811808 let storage = _loadStorage()
17821809 let lpAssetId = storage._1
17831810 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1784- let $t05372553841 = _withdraw(assetId_, amount_)
1785- let targetAmountNormalized = $t05372553841._1
1786- let assetBalances = $t05372553841._2
1787- let lpFee = $t05372553841._3
1788- let protocolFee = $t05372553841._4
1789- let sigmaFeePerLpUpdated = $t05372553841._5
1811+ let $t05519055306 = _withdraw(assetId_, amount_)
1812+ let targetAmountNormalized = $t05519055306._1
1813+ let assetBalances = $t05519055306._2
1814+ let lpFee = $t05519055306._3
1815+ let protocolFee = $t05519055306._4
1816+ let sigmaFeePerLpUpdated = $t05519055306._5
17901817 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17911818 let targetDecimals = _getDecimals(assetId_)
17921819 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17931820 $Tuple2(nil, finalAmount)
17941821 }
17951822 else throw("Strict value is not equal to itself.")
17961823 }
17971824
17981825
17991826
18001827 @Callable(i)
18011828 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
18021829 let storage = _loadStorage()
18031830 let lpAssetId = storage._1
18041831 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
18051832 let assets = _loadAssets()
18061833 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
18071834 if ((sourceAssetIndex == sourceAssetIndex))
18081835 then {
18091836 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
18101837 if ((targetAssetIndex == targetAssetIndex))
18111838 then {
18121839 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
18131840 let err = if (_validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount"))
18141841 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
18151842 else false
18161843 if ((err == err))
18171844 then {
1818- let $t05525555413 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1819- let targetAmountNormalized = $t05525555413._1
1820- let finalAssetBalances = $t05525555413._2
1821- let lpFee = $t05525555413._3
1822- let protocolFee = $t05525555413._4
1823- let sigmaFeePerLpUpdated = $t05525555413._5
1845+ let $t05671656874 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1846+ let targetAmountNormalized = $t05671656874._1
1847+ let finalAssetBalances = $t05671656874._2
1848+ let lpFee = $t05671656874._3
1849+ let protocolFee = $t05671656874._4
1850+ let sigmaFeePerLpUpdated = $t05671656874._5
18241851 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18251852 let targetDecimals = _getDecimals(targetAssetId_)
18261853 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18271854 $Tuple2(nil, finalAmount)
18281855 }
18291856 else throw("Strict value is not equal to itself.")
18301857 }
18311858 else throw("Strict value is not equal to itself.")
18321859 }
18331860 else throw("Strict value is not equal to itself.")
18341861 }
18351862
18361863
18371864
18381865 @Callable(i)
18391866 func getClaim (user_) = {
18401867 let user = if ((size(user_) > 0))
18411868 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18421869 else i.caller
1843- let $t05605556111 = _checkpoint(user)
1844- let checkpointActions = $t05605556111._1
1845- let userProfits = $t05605556111._2
1870+ let $t05751657572 = _checkpoint(user)
1871+ let checkpointActions = $t05751657572._1
1872+ let userProfits = $t05751657572._2
18461873 $Tuple2(nil, userProfits)
18471874 }
18481875
18491876
18501877
18511878 @Callable(i)
18521879 func getUtilFunc () = {
18531880 let storage = _loadStorage()
18541881 let lpTotalSupply = storage._3
18551882 let weightAmplifier = storage._7
18561883 let slippageRate = storage._8
18571884 let feeMaxRate = storage._9
1858- let $t05644456504 = _loadAssetBalances()
1859- let assetBalances = $t05644456504._1
1860- let assetTotalSupply = $t05644456504._2
1861- let $t05650956562 = _loadAssetWeights()
1862- let assetWeights = $t05650956562._1
1863- let sigmaWeight = $t05650956562._2
1885+ let $t05790557965 = _loadAssetBalances()
1886+ let assetBalances = $t05790557965._1
1887+ let assetTotalSupply = $t05790557965._2
1888+ let $t05797058023 = _loadAssetWeights()
1889+ let assetWeights = $t05797058023._1
1890+ let sigmaWeight = $t05797058023._2
18641891 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18651892 let utilValue = (assetTotalSupply - fee)
18661893 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18671894 }
18681895
18691896
18701897
18711898 @Callable(i)
18721899 func getFeeFunc () = {
18731900 let storage = _loadStorage()
18741901 let weightAmplifier = storage._7
18751902 let slippageRate = storage._8
18761903 let feeMaxRate = storage._9
1877- let $t05699457054 = _loadAssetBalances()
1878- let assetBalances = $t05699457054._1
1879- let assetTotalSupply = $t05699457054._2
1880- let $t05705957112 = _loadAssetWeights()
1881- let assetWeights = $t05705957112._1
1882- let sigmaWeight = $t05705957112._2
1904+ let $t05845558515 = _loadAssetBalances()
1905+ let assetBalances = $t05845558515._1
1906+ let assetTotalSupply = $t05845558515._2
1907+ let $t05852058573 = _loadAssetWeights()
1908+ let assetWeights = $t05852058573._1
1909+ let sigmaWeight = $t05852058573._2
18831910 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18841911 $Tuple2(nil, fee)
18851912 }
18861913
18871914
18881915
18891916 @Callable(i)
18901917 func checkpoint (user_) = {
18911918 let err = if (_whenInitialized())
18921919 then _whenNotPaused()
18931920 else false
18941921 if ((err == err))
18951922 then {
18961923 let user = if ((size(user_) > 0))
18971924 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
18981925 else i.caller
18991926 _checkpoint(user)
19001927 }
19011928 else throw("Strict value is not equal to itself.")
19021929 }
19031930
19041931
19051932
19061933 @Callable(i)
19071934 func stake () = {
19081935 let err = if (_whenInitialized())
19091936 then _whenNotPaused()
19101937 else false
19111938 if ((err == err))
19121939 then {
19131940 let storage = _loadStorage()
19141941 let lpAssetIdStr = _assetToStr(storage._1)
19151942 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
19161943 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
19171944 else false)
19181945 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
19191946 else false
19201947 if ((err1 == err1))
19211948 then {
1922- let $t05812058180 = _checkpoint(i.caller)
1923- let checkpointActions = $t05812058180._1
1924- let userProfits = $t05812058180._2
1949+ let $t05958159641 = _checkpoint(i.caller)
1950+ let checkpointActions = $t05958159641._1
1951+ let userProfits = $t05958159641._2
19251952 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19261953 }
19271954 else throw("Strict value is not equal to itself.")
19281955 }
19291956 else throw("Strict value is not equal to itself.")
19301957 }
19311958
19321959
19331960
19341961 @Callable(i)
19351962 func unstake (amount_) = {
19361963 let err = if (_whenInitialized())
19371964 then _whenNotPaused()
19381965 else false
19391966 if ((err == err))
19401967 then {
19411968 let storage = _loadStorage()
19421969 let lpAssetId = storage._1
19431970 let userLp = _loadUserLp(i.caller)
19441971 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19451972 if ((err1 == err1))
19461973 then {
1947- let $t05869158751 = _checkpoint(i.caller)
1948- let checkpointActions = $t05869158751._1
1949- let userProfits = $t05869158751._2
1974+ let $t06015260212 = _checkpoint(i.caller)
1975+ let checkpointActions = $t06015260212._1
1976+ let userProfits = $t06015260212._2
19501977 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19511978 }
19521979 else throw("Strict value is not equal to itself.")
19531980 }
19541981 else throw("Strict value is not equal to itself.")
19551982 }
19561983
19571984
19581985
19591986 @Callable(i)
19601987 func claim (user_) = {
19611988 let err = if (_whenInitialized())
19621989 then _whenNotPaused()
19631990 else false
19641991 if ((err == err))
19651992 then {
19661993 let user = if ((size(user_) > 0))
19671994 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
19681995 else i.caller
19691996 let storage = _loadStorage()
19701997 let lpAssetId = storage._1
19711998 let lpAssetIdStr = _assetToStr(lpAssetId)
19721999 let assets = [lpAssetIdStr, _loadAssets()]
19732000 let maxIndex = (size(assets) - 1)
19742001 let userLp = _loadUserLp(user)
1975- let $t05947459530 = _checkpoint(user)
1976- let checkpointActions = $t05947459530._1
1977- let userProfits = $t05947459530._2
2002+ let $t06093560991 = _checkpoint(user)
2003+ let checkpointActions = $t06093560991._1
2004+ let userProfits = $t06093560991._2
19782005 func foldFunc (acc,profit) = {
19792006 let index = acc._1
19802007 if (if ((maxIndex >= index))
19812008 then (profit > 0)
19822009 else false)
19832010 then {
19842011 let asset = assets[index]
19852012 $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
19862013 }
19872014 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19882015 }
19892016
1990- let $t05990859999 = {
2017+ let $t06136961460 = {
19912018 let $l = userProfits
19922019 let $s = size($l)
19932020 let $acc0 = $Tuple3(0, nil, nil)
19942021 func $f0_1 ($a,$i) = if (($i >= $s))
19952022 then $a
19962023 else foldFunc($a, $l[$i])
19972024
19982025 func $f0_2 ($a,$i) = if (($i >= $s))
19992026 then $a
20002027 else throw("List size exceeds 11")
20012028
20022029 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11)
20032030 }
2004- let idx = $t05990859999._1
2005- let userProfitsUpdated = $t05990859999._2
2006- let profitActions = $t05990859999._3
2031+ let idx = $t06136961460._1
2032+ let userProfitsUpdated = $t06136961460._2
2033+ let profitActions = $t06136961460._3
20072034 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
20082035 }
20092036 else throw("Strict value is not equal to itself.")
20102037 }
20112038
20122039
20132040
20142041 @Callable(i)
20152042 func pause () = {
20162043 let err = if (if (_onlyPauser(i.caller))
20172044 then _whenInitialized()
20182045 else false)
20192046 then _whenNotPaused()
20202047 else false
20212048 if ((err == err))
20222049 then $Tuple2(_savePause(true), unit)
20232050 else throw("Strict value is not equal to itself.")
20242051 }
20252052
20262053
20272054
20282055 @Callable(i)
20292056 func unpause () = {
2030- let err = if (if (_onlyPauser(i.caller))
2057+ let err = if (if (_onlyThisContract(i.caller))
20312058 then _whenInitialized()
20322059 else false)
20332060 then _whenPaused()
20342061 else false
20352062 if ((err == err))
20362063 then $Tuple2(_savePause(false), unit)
20372064 else throw("Strict value is not equal to itself.")
20382065 }
20392066
20402067
20412068
20422069 @Callable(i)
20432070 func updatePauser (pauser_) = {
20442071 let err = if (if (_onlyThisContract(i.caller))
20452072 then _whenInitialized()
20462073 else false)
20472074 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20482075 else false
20492076 if ((err == err))
20502077 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
2078+ else throw("Strict value is not equal to itself.")
2079+ }
2080+
2081+
2082+
2083+@Callable(i)
2084+func updateWatchdog (watchdog_,offset_) = {
2085+ let err = if (if (if (_onlyThisContract(i.caller))
2086+ then _whenInitialized()
2087+ else false)
2088+ then _validateAddress(watchdog_, "updateWatchdog: invalid watchdog")
2089+ else false)
2090+ then _validateInt(offset_, 0, MAX_INT, "updateWatchdog: invalid offset")
2091+ else false
2092+ if ((err == err))
2093+ then $Tuple2((_saveWatchdog(addressFromStringValue(watchdog_)) ++ _saveWatchdogOffset(offset_)), unit)
20512094 else throw("Strict value is not equal to itself.")
20522095 }
20532096
20542097
20552098
20562099 @Callable(i)
20572100 func setMultisig (multisig_) = {
20582101 let err = if (_onlyThisContract(i.caller))
20592102 then _validateAddress(multisig_, "setMultisig: invalid multisig")
20602103 else false
20612104 if ((err == err))
20622105 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
20632106 else throw("Strict value is not equal to itself.")
20642107 }
20652108
20662109
20672110 @Verifier(tx)
20682111 func verify () = match getString(KEY_MULTISIG) {
20692112 case multisig: String =>
20702113 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
20712114 case _ =>
20722115 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
20732116 }
20742117

github/deemru/w8io/fabc49c 
269.07 ms