2022.10.27 11:59 [3355994] smart account 3P5VC7EqCZ3BsTuz3QrZFpxZ9VEm5N6WHTb > SELF 0.00000000 Waves

{ "type": 13, "id": "4tN3JRNNsESULRhGEaGi6ysyUqTAk81Z1N43H9eVqFGi", "fee": 3700000, "feeAssetId": null, "timestamp": 1666861166741, "version": 1, "sender": "3P5VC7EqCZ3BsTuz3QrZFpxZ9VEm5N6WHTb", "senderPublicKey": "ADu1XuzisH2u8YwfLFVkHDbzwtKpT376inMjiSxYeq83", "proofs": [ "4vWREfrLvBotZ2WThTPuEVgLvvSJdrUkxkHJAWG948CSbpfVPqRgnTk96w78nNcwCYj2zghJd6uSPsqXvD2zESB4" ], "script": "base64:BgKUAQgCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIECgIIARIECgIIARIECgIBARIDCgEBEgUKAwEIARIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgBsAAZzY2FsZTgAgMLXLwAMc2NhbGU4QmlnSW50CQC2AgEAgMLXLwAHc2NhbGUxOAkAtgIBAICAkLu61q3wDQAKemVyb0JpZ0ludAkAtgIBAAAABGJpZzAJALYCAQAAAARiaWcxCQC2AgEAAQAEYmlnMgkAtgIBAAIACnNsaXBwYWdlNEQJALYCAQkAZQIFBnNjYWxlOAkAaQIJAGgCBQZzY2FsZTgAAQUGc2NhbGU4AAt3YXZlc1N0cmluZwIFV0FWRVMABUFtdWx0AgMxMDAABURjb252AgExAANTRVACAl9fAAVFTVBUWQIAAApQb29sQWN0aXZlAAEAClBvb2xQdXREaXMAAgAOUG9vbE1hdGNoZXJEaXMAAwAMUG9vbFNodXRkb3duAAQADmlkeFBvb2xBZGRyZXNzAAEACWlkeFBvb2xTdAACAAlpZHhMUEFzSWQAAwAJaWR4QW1Bc0lkAAQACWlkeFByQXNJZAAFAAtpZHhBbXRBc0RjbQAGAA1pZHhQcmljZUFzRGNtAAcAC2lkeElBbXRBc0lkAAgADWlkeElQcmljZUFzSWQACQAPaWR4RmFjdFN0YWtDbnRyAAEAEmlkeEZhY3RvcnlSZXN0Q250cgAGABBpZHhGYWN0U2xpcHBDbnRyAAcAEWlkeEZhY3RHd3hSZXdDbnRyAAoACmZlZURlZmF1bHQJAGsDAAUFBnNjYWxlOACQTgECdDECB29yaWdWYWwNb3JpZ1NjYWxlTXVsdAkAvAIDCQC2AgEFB29yaWdWYWwFB3NjYWxlMTgJALYCAQUNb3JpZ1NjYWxlTXVsdAECZjECA3ZhbA9yZXN1bHRTY2FsZU11bHQJAKADAQkAvAIDBQN2YWwJALYCAQUPcmVzdWx0U2NhbGVNdWx0BQdzY2FsZTE4AQJ0cwMDYW10CHJlc1NjYWxlCGN1clNjYWxlCQBrAwUDYW10BQhyZXNTY2FsZQUIY3VyU2NhbGUBA2FicwEDdmFsAwkAvwICBQp6ZXJvQmlnSW50BQN2YWwJAL4CAQUDdmFsBQN2YWwBCWFic0JpZ0ludAEDdmFsAwkAvwICBQp6ZXJvQmlnSW50BQN2YWwJAL4CAQUDdmFsBQN2YWwBAmZjAAITJXNfX2ZhY3RvcnlDb250cmFjdAEDbXBrAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBBHBtcGsAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBAnBsAAIRJXMlc19fcHJpY2VfX2xhc3QBAnBoAgFoAXQJALkJAgkAzAgCAhglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAMwIAgkApAMBBQFoCQDMCAIJAKQDAQUBdAUDbmlsBQNTRVABA3BhdQICdWEEdHhJZAkArAICCQCsAgIJAKwCAgILJXMlcyVzX19QX18FAnVhAgJfXwUEdHhJZAEDZ2F1AgJ1YQR0eElkCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX0dfXwUCdWECAl9fBQR0eElkAQJhYQACDyVzX19hbW91bnRBc3NldAECcGEAAg4lc19fcHJpY2VBc3NldAEDYW1wAAIHJXNfX2FtcAEDYWRhAAINJXNfX2FkZG9uQWRkcgAGa2V5RmVlAgclc19fZmVlAANmZWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUGa2V5RmVlBQpmZWVEZWZhdWx0AQRmY2ZnAAIRJXNfX2ZhY3RvcnlDb25maWcBBG10cGsAAhglcyVzX19tYXRjaGVyX19wdWJsaWNLZXkBAnBjAgZpQW10QXMFaVByQXMJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FBmlBbXRBcwICX18FBWlQckFzAghfX2NvbmZpZwEDbWJhAQViQVN0cgkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQViQVN0cgEDYXBzAAIMJXNfX3NodXRkb3duARxrZXlBbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAAIdJXNfX2FsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2gBFmtleUZlZUNvbGxlY3RvckFkZHJlc3MAAhclc19fZmVlQ29sbGVjdG9yQWRkcmVzcwEDdG9lAwNvclYGc2VuZHJWBm1hdGNoVgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhFGYWlsZWQ6IG9yZFZhbGlkPQkApQMBBQNvclYCCyBzbmRyVmFsaWQ9CQClAwEFBnNlbmRyVgIMIG10Y2hyVmFsaWQ9CQClAwEFBm1hdGNoVgEDc3RyAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnZhbFN0cgUHJG1hdGNoMAUGdmFsU3RyCQACAQITZmFpbCBjYXN0IHRvIFN0cmluZwEEc3RyZgIEYWRkcgNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQRhZGRyBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUEYWRkcgkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAgwgbm90IGRlZmluZWQFA25pbAIAAQRpbnRmAgRhZGRyA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBGFkZHIFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQRhZGRyCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgABCHRocm93RXJyAQNtc2cJAAIBCQC5CQIJAMwIAgIPbHBfc3RhYmxlLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgAANmY2EJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQRzdHJmAgUEdGhpcwkBAmZjAAABQQkBBHN0cmYCBQR0aGlzCQEDYW1wAAEDaWdzAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQNmY2EJAQNhcHMABwECbXAACQDZBAEJAQRzdHJmAgUDZmNhCQEEbXRwawAAE2ZlZUNvbGxlY3RvckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQRzdHJmAgUDZmNhCQEWa2V5RmVlQ29sbGVjdG9yQWRkcmVzcwABA2dwYwAEBWFtdEFzCQEEc3RyZgIFBHRoaXMJAQJhYQAEB3ByaWNlQXMJAQRzdHJmAgUEdGhpcwkBAnBhAAQIaVByaWNlQXMJAQRpbnRmAgUDZmNhCQEDbWJhAQUHcHJpY2VBcwQGaUFtdEFzCQEEaW50ZgIFA2ZjYQkBA21iYQEFBWFtdEFzCQC1CQIJAQRzdHJmAgUDZmNhCQECcGMCCQCkAwEFBmlBbXRBcwkApAMBBQhpUHJpY2VBcwUDU0VQAQxwYXJzZUFzc2V0SWQBBWlucHV0AwkAAAIFBWlucHV0BQt3YXZlc1N0cmluZwUEdW5pdAkA2QQBBQVpbnB1dAEPYXNzZXRJZFRvU3RyaW5nAQVpbnB1dAMJAAACBQVpbnB1dAUEdW5pdAULd2F2ZXNTdHJpbmcJANgEAQkBBXZhbHVlAQUFaW5wdXQBD3BhcnNlUG9vbENvbmZpZwEKcG9vbENvbmZpZwkAmQoHCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFCnBvb2xDb25maWcFDmlkeFBvb2xBZGRyZXNzCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKcG9vbENvbmZpZwUJaWR4UG9vbFN0CQDZBAEJAJEDAgUKcG9vbENvbmZpZwUJaWR4TFBBc0lkCQEMcGFyc2VBc3NldElkAQkAkQMCBQpwb29sQ29uZmlnBQlpZHhBbUFzSWQJAQxwYXJzZUFzc2V0SWQBCQCRAwIFCnBvb2xDb25maWcFCWlkeFByQXNJZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFC2lkeEFtdEFzRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKcG9vbENvbmZpZwUNaWR4UHJpY2VBc0RjbQAQcG9vbENvbmZpZ1BhcnNlZAkBD3BhcnNlUG9vbENvbmZpZwEJAQNncGMAAAskdDA2ODI5NzAxNQUQcG9vbENvbmZpZ1BhcnNlZAAOY2ZnUG9vbEFkZHJlc3MIBQskdDA2ODI5NzAxNQJfMQANY2ZnUG9vbFN0YXR1cwgFCyR0MDY4Mjk3MDE1Al8yAAxjZmdMcEFzc2V0SWQIBQskdDA2ODI5NzAxNQJfMwAQY2ZnQW1vdW50QXNzZXRJZAgFCyR0MDY4Mjk3MDE1Al80AA9jZmdQcmljZUFzc2V0SWQIBQskdDA2ODI5NzAxNQJfNQAWY2ZnQW1vdW50QXNzZXREZWNpbWFscwgFCyR0MDY4Mjk3MDE1Al82ABVjZmdQcmljZUFzc2V0RGVjaW1hbHMIBQskdDA2ODI5NzAxNQJfNwEDZ2ZjAAkAtQkCCQEEc3RyZgIFA2ZjYQkBBGZjZmcABQNTRVAADWZhY3RvcnlDb25maWcJAQNnZmMAAA9zdGFraW5nQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFDWZhY3RvcnlDb25maWcFD2lkeEZhY3RTdGFrQ250cgIgSW52YWxpZCBzdGFraW5nIGNvbnRyYWN0IGFkZHJlc3MAD3NsaXBhZ2VDb250cmFjdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUNZmFjdG9yeUNvbmZpZwUQaWR4RmFjdFNsaXBwQ250cgIgSW52YWxpZCBzbGlwYWdlIGNvbnRyYWN0IGFkZHJlc3MAC2d3eENvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQ1mYWN0b3J5Q29uZmlnBRFpZHhGYWN0R3d4UmV3Q250cgIcSW52YWxpZCBnd3ggY29udHJhY3QgYWRkcmVzcwAMcmVzdENvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQ1mYWN0b3J5Q29uZmlnBRJpZHhGYWN0b3J5UmVzdENudHICHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MBEWRhdGFQdXRBY3Rpb25JbmZvCg1pbkFtdEFzc2V0QW10D2luUHJpY2VBc3NldEFtdAhvdXRMcEFtdAVwcmljZQpzbGlwQnlVc2VyDHNsaXBwYWdlUmVhbAh0eEhlaWdodAt0eFRpbWVzdGFtcAxzbGlwYWdlQW1BbXQMc2xpcGFnZVByQW10CQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQ1pbkFtdEFzc2V0QW10CQDMCAIJAKQDAQUPaW5QcmljZUFzc2V0QW10CQDMCAIJAKQDAQUIb3V0THBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFCnNsaXBCeVVzZXIJAMwIAgkApAMBBQxzbGlwcGFnZVJlYWwJAMwIAgkApAMBBQh0eEhlaWdodAkAzAgCCQCkAwEFC3R4VGltZXN0YW1wCQDMCAIJAKQDAQUMc2xpcGFnZUFtQW10CQDMCAIJAKQDAQUMc2xpcGFnZVByQW10BQNuaWwFA1NFUAERZGF0YUdldEFjdGlvbkluZm8GDm91dEFtdEFzc2V0QW10EG91dFByaWNlQXNzZXRBbXQHaW5McEFtdAVwcmljZQh0eEhlaWdodAt0eFRpbWVzdGFtcAkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFDm91dEFtdEFzc2V0QW10CQDMCAIJAKQDAQUQb3V0UHJpY2VBc3NldEFtdAkAzAgCCQCkAwEFB2luTHBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFCHR4SGVpZ2h0CQDMCAIJAKQDAQULdHhUaW1lc3RhbXAFA25pbAUDU0VQAQ1nZXRBY2NCYWxhbmNlAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkA8AcCBQR0aGlzCQDZBAEFB2Fzc2V0SWQBBGNwYmkCCHByQW10WDE4CGFtQW10WDE4CQC8AgMFCHByQW10WDE4BQdzY2FsZTE4BQhhbUFtdFgxOAEDdmFkAwJBMQJBMghzbGlwcGFnZQQEZGlmZgkAvAIDCQC4AgIFAkExBQJBMgUMc2NhbGU4QmlnSW50BQJBMgQEcGFzcwkAvwICCQC4AgIFCHNsaXBwYWdlCQEDYWJzAQUEZGlmZgUKemVyb0JpZ0ludAMJAQEhAQUEcGFzcwkAAgEJAKwCAgIKQmlnIHNscGc6IAkApgMBBQRkaWZmCQCUCgIFBHBhc3MJAJkDAQkAzAgCBQJBMQkAzAgCBQJBMgUDbmlsAQJ2ZAMCRDECRDAEc2xwZwQEZGlmZgkAvAIDBQJEMAUMc2NhbGU4QmlnSW50BQJEMQQEZmFpbAkAvwICBQRzbHBnBQRkaWZmAwMFBGZhaWwGCQC/AgIFAkQwBQJEMQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKYDAQUCRDACASAJAKYDAQUCRDECASAJAKYDAQUEZGlmZgIBIAkApgMBBQRzbHBnBQRmYWlsAQNwY3AECmFtQXNzZXREY20KcHJBc3NldERjbQVhbUFtdAVwckFtdAQLYW10QXNBbXRYMTgJAQJ0MQIFBWFtQW10BQphbUFzc2V0RGNtBApwckFzQW10WDE4CQECdDECBQVwckFtdAUKcHJBc3NldERjbQkBBGNwYmkCBQpwckFzQW10WDE4BQthbXRBc0FtdFgxOAEKY2FsY1ByaWNlcwMFYW1BbXQFcHJBbXQFbHBBbXQEA2NmZwkBA2dwYwAECGFtdEFzRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQtpZHhBbXRBc0RjbQQHcHJBc0RjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUNaWR4UHJpY2VBc0RjbQQIcHJpY2VYMTgJAQNwY3AEBQhhbXRBc0RjbQUHcHJBc0RjbQUFYW1BbXQFBXByQW10BAhhbUFtdFgxOAkBAnQxAgUFYW1BbXQFCGFtdEFzRGNtBAhwckFtdFgxOAkBAnQxAgUFcHJBbXQFB3ByQXNEY20ECGxwQW10WDE4CQECdDECBQVscEFtdAUGc2NhbGU4BA1scFBySW5BbUFzWDE4CQEEY3BiaQIFCGFtQW10WDE4BQhscEFtdFgxOAQNbHBQckluUHJBc1gxOAkBBGNwYmkCBQhwckFtdFgxOAUIbHBBbXRYMTgJAMwIAgUIcHJpY2VYMTgJAMwIAgUNbHBQckluQW1Bc1gxOAkAzAgCBQ1scFBySW5QckFzWDE4BQNuaWwBD2NhbGN1bGF0ZVByaWNlcwMFYW1BbXQFcHJBbXQFbHBBbXQEAXAJAQpjYWxjUHJpY2VzAwUFYW1BbXQFBXByQW10BQVscEFtdAkAzAgCCQECZjECCQCRAwIFAXAAAAUGc2NhbGU4CQDMCAIJAQJmMQIJAJEDAgUBcAABBQZzY2FsZTgJAMwIAgkBAmYxAgkAkQMCBQFwAAIFBnNjYWxlOAUDbmlsAQd0YWtlRmVlAQZhbW91bnQECWZlZUFtb3VudAkAawMFBmFtb3VudAUDZmVlBQZzY2FsZTgJAJQKAgkAZQIFBmFtb3VudAUJZmVlQW1vdW50BQlmZWVBbW91bnQBA2VnbwQGdHhJZDU4CnBtdEFzc2V0SWQIcG10THBBbXQLdXNlckFkZHJlc3MEA2NmZwkBA2dwYwAEBGxwSWQJAJEDAgUDY2ZnBQlpZHhMUEFzSWQEBGFtSWQJAJEDAgUDY2ZnBQlpZHhBbUFzSWQEBHBySWQJAJEDAgUDY2ZnBQlpZHhQckFzSWQEBWFtRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQtpZHhBbXRBc0RjbQQFcHJEY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDWlkeFByaWNlQXNEY20EA3N0cwkAkQMCBQNjZmcFCWlkeFBvb2xTdAQHbHBFbWlzcwgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFBGxwSWQCC1dyb25nIExQIGlkCHF1YW50aXR5AwkBAiE9AgUEbHBJZAUKcG10QXNzZXRJZAkAAgECD1dyb25nIHBtdCBhc3NldAQJYW1CYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFBGFtSWQEDGFtQmFsYW5jZVgxOAkBAnQxAgUJYW1CYWxhbmNlBQVhbURjbQQJcHJCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFBHBySWQEDHByQmFsYW5jZVgxOAkBAnQxAgUJcHJCYWxhbmNlBQVwckRjbQQLY3VyUHJpY2VYMTgJAQRjcGJpAgUMcHJCYWxhbmNlWDE4BQxhbUJhbGFuY2VYMTgECGN1clByaWNlCQECZjECBQtjdXJQcmljZVgxOAUGc2NhbGU4BAtwbXRMcEFtdFgxOAkBAnQxAgUIcG10THBBbXQFBnNjYWxlOAQKbHBFbWlzc1gxOAkBAnQxAgUHbHBFbWlzcwUGc2NhbGU4BAtvdXRBbUFtdFgxOAkAvAIDBQxhbUJhbGFuY2VYMTgFC3BtdExwQW10WDE4BQpscEVtaXNzWDE4BAtvdXRQckFtdFgxOAkAvAIDBQxwckJhbGFuY2VYMTgFC3BtdExwQW10WDE4BQpscEVtaXNzWDE4BAhvdXRBbUFtdAkBAmYxAgULb3V0QW1BbXRYMTgFBWFtRGNtBAhvdXRQckFtdAkBAmYxAgULb3V0UHJBbXRYMTgFBXByRGNtBAVzdGF0ZQMJAAACBQZ0eElkNTgCAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQhvdXRBbUFtdAMJAAACBQRhbUlkAgVXQVZFUwUEdW5pdAkA2QQBBQRhbUlkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQhvdXRQckFtdAMJAAACBQRwcklkAgVXQVZFUwUEdW5pdAkA2QQBBQRwcklkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNnYXUCCQClCAEFC3VzZXJBZGRyZXNzBQZ0eElkNTgJARFkYXRhR2V0QWN0aW9uSW5mbwYFCG91dEFtQW10BQhvdXRQckFtdAUIcG10THBBbXQFCGN1clByaWNlBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQhjdXJQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUIY3VyUHJpY2UFA25pbAkAnAoKBQhvdXRBbUFtdAUIb3V0UHJBbXQFBGFtSWQFBHBySWQFCWFtQmFsYW5jZQUJcHJCYWxhbmNlBQdscEVtaXNzBQtjdXJQcmljZVgxOAUDc3RzBQVzdGF0ZQEDZXBvDQZ0eElkNTgIc2xpcHBhZ2UHaW5BbUFtdAZpbkFtSWQHaW5QckFtdAZpblBySWQLdXNlckFkZHJlc3MGaXNFdmFsBmVtaXRMcAppc09uZUFzc2V0EHZhbGlkYXRlU2xpcHBhZ2UGcG10QW10BXBtdElkBANjZmcJAQNncGMABARscElkCQDZBAEJAJEDAgUDY2ZnBQlpZHhMUEFzSWQEB2FtSWRTdHIJAJEDAgUDY2ZnBQlpZHhBbUFzSWQEB3BySWRTdHIJAJEDAgUDY2ZnBQlpZHhQckFzSWQECWluQW1JZFN0cgkAkQMCBQNjZmcFC2lkeElBbXRBc0lkBAlpblBySWRTdHIJAJEDAgUDY2ZnBQ1pZHhJUHJpY2VBc0lkBAZhbXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFC2lkeEFtdEFzRGNtBAhwcmljZURjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUNaWR4UHJpY2VBc0RjbQQDc3RzCQCRAwIFA2NmZwUJaWR4UG9vbFN0BARscEVtCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFBGxwSWQCCFdyIGxwIGFzCHF1YW50aXR5BAlhbUJhbGFuY2UDBQZpc0V2YWwJAQ1nZXRBY2NCYWxhbmNlAQUHYW1JZFN0cgMDBQppc09uZUFzc2V0CQAAAgUFcG10SWQFB2FtSWRTdHIHCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdhbUlkU3RyBQZwbXRBbXQDBQppc09uZUFzc2V0CQENZ2V0QWNjQmFsYW5jZQEFB2FtSWRTdHIJAGUCCQENZ2V0QWNjQmFsYW5jZQEFB2FtSWRTdHIFB2luQW1BbXQECXByQmFsYW5jZQMFBmlzRXZhbAkBDWdldEFjY0JhbGFuY2UBBQdwcklkU3RyAwMFCmlzT25lQXNzZXQJAAACBQVwbXRJZAUHcHJJZFN0cgcJAGUCCQENZ2V0QWNjQmFsYW5jZQEFB3BySWRTdHIFBnBtdEFtdAMFCmlzT25lQXNzZXQJAQ1nZXRBY2NCYWxhbmNlAQUHcHJJZFN0cgkAZQIJAQ1nZXRBY2NCYWxhbmNlAQUHcHJJZFN0cgUHaW5QckFtdAQPaW5BbUFzc2V0QW10WDE4CQECdDECBQdpbkFtQW10BQZhbXREY20ED2luUHJBc3NldEFtdFgxOAkBAnQxAgUHaW5QckFtdAUIcHJpY2VEY20EDHVzZXJQcmljZVgxOAkBBGNwYmkCBQ9pblByQXNzZXRBbXRYMTgFD2luQW1Bc3NldEFtdFgxOAQMYW1CYWxhbmNlWDE4CQECdDECBQlhbUJhbGFuY2UFBmFtdERjbQQMcHJCYWxhbmNlWDE4CQECdDECBQlwckJhbGFuY2UFCHByaWNlRGNtBAFyAwkAAAIFBGxwRW0AAAQLY3VyUHJpY2VYMTgFCnplcm9CaWdJbnQEC3NsaXBwYWdlWDE4BQp6ZXJvQmlnSW50BAhscEFtdFgxOAkAdgYJALkCAgUPaW5BbUFzc2V0QW10WDE4BQ9pblByQXNzZXRBbXRYMTgAAAkAtgIBAAUAAQAABQRET1dOCQCXCgUJAQJmMQIFCGxwQW10WDE4BQZzY2FsZTgJAQJmMQIFD2luQW1Bc3NldEFtdFgxOAUGYW10RGNtCQECZjECBQ9pblByQXNzZXRBbXRYMTgFCHByaWNlRGNtCQEEY3BiaQIJALcCAgUMcHJCYWxhbmNlWDE4BQ9pblByQXNzZXRBbXRYMTgJALcCAgUMYW1CYWxhbmNlWDE4BQ9pbkFtQXNzZXRBbXRYMTgFC3NsaXBwYWdlWDE4BAtjdXJQcmljZVgxOAkBBGNwYmkCBQxwckJhbGFuY2VYMTgFDGFtQmFsYW5jZVgxOAQPc2xpcHBhZ2VSZWFsWDE4CQC8AgMJAQNhYnMBCQC4AgIFC2N1clByaWNlWDE4BQx1c2VyUHJpY2VYMTgFB3NjYWxlMTgFC2N1clByaWNlWDE4BAtzbGlwcGFnZVgxOAkBAnQxAgUIc2xpcHBhZ2UFBnNjYWxlOAMDAwUQdmFsaWRhdGVTbGlwcGFnZQkBAiE9AgULY3VyUHJpY2VYMTgFCnplcm9CaWdJbnQHCQC/AgIFD3NsaXBwYWdlUmVhbFgxOAULc2xpcHBhZ2VYMTgHCQACAQkArAICCQCsAgIJAKwCAgIPUHJpY2Ugc2xpcHBhZ2UgCQCmAwEFD3NsaXBwYWdlUmVhbFgxOAIDID4gCQCmAwEFC3NsaXBwYWdlWDE4BA1scEVtaXNzaW9uWDE4CQECdDECBQRscEVtBQZzY2FsZTgECnByVmlhQW1YMTgJALwCAwUPaW5BbUFzc2V0QW10WDE4BQtjdXJQcmljZVgxOAUHc2NhbGUxOAQKYW1WaWFQclgxOAkAvAIDBQ9pblByQXNzZXRBbXRYMTgFB3NjYWxlMTgFC2N1clByaWNlWDE4BAxleHBlY3RlZEFtdHMDCQC/AgIFCnByVmlhQW1YMTgFD2luUHJBc3NldEFtdFgxOAkAlAoCBQphbVZpYVByWDE4BQ9pblByQXNzZXRBbXRYMTgJAJQKAgUPaW5BbUFzc2V0QW10WDE4BQpwclZpYUFtWDE4BBFleHBBbXRBc3NldEFtdFgxOAgFDGV4cGVjdGVkQW10cwJfMQQTZXhwUHJpY2VBc3NldEFtdFgxOAgFDGV4cGVjdGVkQW10cwJfMgQIbHBBbXRYMTgJALwCAwUNbHBFbWlzc2lvblgxOAUTZXhwUHJpY2VBc3NldEFtdFgxOAUMcHJCYWxhbmNlWDE4CQCXCgUJAQJmMQIFCGxwQW10WDE4BQZzY2FsZTgJAQJmMQIFEWV4cEFtdEFzc2V0QW10WDE4BQZhbXREY20JAQJmMQIFE2V4cFByaWNlQXNzZXRBbXRYMTgFCHByaWNlRGNtBQtjdXJQcmljZVgxOAULc2xpcHBhZ2VYMTgECWNhbGNMcEFtdAgFAXICXzEEDmNhbGNBbUFzc2V0UG10CAUBcgJfMgQOY2FsY1ByQXNzZXRQbXQIBQFyAl8zBAhjdXJQcmljZQkBAmYxAggFAXICXzQFBnNjYWxlOAQMc2xpcHBhZ2VDYWxjCQECZjECCAUBcgJfNQUGc2NhbGU4AwkAZwIAAAUJY2FsY0xwQW10CQACAQIHTFAgPD0gMAQJZW1pdExwQW10AwkBASEBBQZlbWl0THAAAAUJY2FsY0xwQW10BAZhbURpZmYJAGUCBQdpbkFtQW10BQ5jYWxjQW1Bc3NldFBtdAQGcHJEaWZmCQBlAgUHaW5QckFtdAUOY2FsY1ByQXNzZXRQbXQEDSR0MDE3NDQ2MTc3OTEDAwUKaXNPbmVBc3NldAkAAAIFBXBtdElkBQdhbUlkU3RyBwkAlAoCBQZwbXRBbXQAAAMDBQppc09uZUFzc2V0CQAAAgUFcG10SWQFB3BySWRTdHIHCQCUCgIAAAUGcG10QW10CQCUCgIFDmNhbGNBbUFzc2V0UG10BQ5jYWxjUHJBc3NldFBtdAQKd3JpdGVBbUFtdAgFDSR0MDE3NDQ2MTc3OTECXzEECndyaXRlUHJBbXQIBQ0kdDAxNzQ0NjE3NzkxAl8yBAtjb21tb25TdGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBsAAUIY3VyUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwaAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFCGN1clByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNwYXUCBQt1c2VyQWRkcmVzcwUGdHhJZDU4CQERZGF0YVB1dEFjdGlvbkluZm8KBQp3cml0ZUFtQW10BQp3cml0ZVByQW10BQllbWl0THBBbXQFCGN1clByaWNlBQhzbGlwcGFnZQUMc2xpcHBhZ2VDYWxjBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQZhbURpZmYFBnByRGlmZgUDbmlsCQCfCg0FCWNhbGNMcEFtdAUJZW1pdExwQW10BQhjdXJQcmljZQUJYW1CYWxhbmNlBQlwckJhbGFuY2UFBGxwRW0FBGxwSWQFA3N0cwULY29tbW9uU3RhdGUFBmFtRGlmZgUGcHJEaWZmBQZpbkFtSWQFBmluUHJJZAEDbW9hAQVvcmRlcgQDY2ZnCQEDZ3BjAAQHYW10QXNJZAkAkQMCBQNjZmcFCWlkeEFtQXNJZAQGcHJBc0lkCQCRAwIFA2NmZwUJaWR4UHJBc0lkBANzdHMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFCWlkeFBvb2xTdAQIYW10QXNEY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFC2lkeEFtdEFzRGNtBAdwckFzRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ1pZHhQcmljZUFzRGNtBA9hY2NBbXRBc0JhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUHYW10QXNJZAQOYWNjUHJBc0JhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUGcHJBc0lkBAtjdXJQcmljZVgxOAMJAAACCAUFb3JkZXIJb3JkZXJUeXBlBQNCdXkJAQNwY3AEBQhhbXRBc0RjbQUHcHJBc0RjbQkAZAIFD2FjY0FtdEFzQmFsYW5jZQgFBW9yZGVyBmFtb3VudAUOYWNjUHJBc0JhbGFuY2UJAQNwY3AEBQhhbXRBc0RjbQUHcHJBc0RjbQkAZQIFD2FjY0FtdEFzQmFsYW5jZQgFBW9yZGVyBmFtb3VudAUOYWNjUHJBc0JhbGFuY2UECGN1clByaWNlCQECZjECBQtjdXJQcmljZVgxOAUGc2NhbGU4AwMDCQEDaWdzAAYJAAACBQNzdHMFDlBvb2xNYXRjaGVyRGlzBgkAAAIFA3N0cwUMUG9vbFNodXRkb3duCQACAQINQWRtaW4gYmxvY2tlZAQKb3JBbXRBc3NldAgIBQVvcmRlcglhc3NldFBhaXILYW1vdW50QXNzZXQECm9yQW10QXNTdHIDCQAAAgUKb3JBbXRBc3NldAUEdW5pdAIFV0FWRVMJANgEAQkBBXZhbHVlAQUKb3JBbXRBc3NldAQJb3JQckFzc2V0CAgFBW9yZGVyCWFzc2V0UGFpcgpwcmljZUFzc2V0BAlvclByQXNTdHIDCQAAAgUJb3JQckFzc2V0BQR1bml0AgVXQVZFUwkA2AQBCQEFdmFsdWUBBQlvclByQXNzZXQDAwkBAiE9AgUKb3JBbXRBc1N0cgUHYW10QXNJZAYJAQIhPQIFCW9yUHJBc1N0cgUGcHJBc0lkCQACAQIJV3IgYXNzZXRzBApvcmRlclByaWNlCAUFb3JkZXIFcHJpY2UECHByaWNlRGNtCQBrAwUGc2NhbGU4BQdwckFzRGNtBQhhbXRBc0RjbQQOY2FzdE9yZGVyUHJpY2UJAQJ0cwMFCm9yZGVyUHJpY2UFBnNjYWxlOAUIcHJpY2VEY20EEWlzT3JkZXJQcmljZVZhbGlkAwkAAAIIBQVvcmRlcglvcmRlclR5cGUFA0J1eQkAZwIFCGN1clByaWNlBQ5jYXN0T3JkZXJQcmljZQkAZwIFDmNhc3RPcmRlclByaWNlBQhjdXJQcmljZQYBAmNnAQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIKMSBwbW50IGV4cAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECnBtdEFzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQGcG10QW10CAUDcG10BmFtb3VudAQBcgkBA2VnbwQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBBQpwbXRBc3NldElkBQZwbXRBbXQIBQFpBmNhbGxlcgQIb3V0QW1BbXQIBQFyAl8xBAhvdXRQckFtdAgFAXICXzIEA3N0cwkBDXBhcnNlSW50VmFsdWUBCAUBcgJfOQQFc3RhdGUIBQFyA18xMAMDCQEDaWdzAAYJAAACBQNzdHMFDFBvb2xTaHV0ZG93bgkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFA3N0cwkAlwoFBQhvdXRBbUFtdAUIb3V0UHJBbXQFBnBtdEFtdAUKcG10QXNzZXRJZAUFc3RhdGUBAmNwCgZjYWxsZXIEdHhJZAdhbUFzUG10B3ByQXNQbXQIc2xpcHBhZ2UGZW1pdExwCmlzT25lQXNzZXQQdmFsaWRhdGVTbGlwcGFnZQZwbXRBbXQFcG10SWQEAXIJAQNlcG8NBQR0eElkBQhzbGlwcGFnZQgJAQV2YWx1ZQEFB2FtQXNQbXQGYW1vdW50CAkBBXZhbHVlAQUHYW1Bc1BtdAdhc3NldElkCAkBBXZhbHVlAQUHcHJBc1BtdAZhbW91bnQICQEFdmFsdWUBBQdwckFzUG10B2Fzc2V0SWQFBmNhbGxlcgkAAAIFBHR4SWQCAAUGZW1pdExwBQppc09uZUFzc2V0BRB2YWxpZGF0ZVNsaXBwYWdlBQZwbXRBbXQFBXBtdElkBANzdHMJAQ1wYXJzZUludFZhbHVlAQgFAXICXzgDAwMJAQNpZ3MABgkAAAIFA3N0cwUKUG9vbFB1dERpcwYJAAACBQNzdHMFDFBvb2xTaHV0ZG93bgkAAgEJAKwCAgIIQmxvY2tlZDoJAKQDAQUDc3RzBQFyAQRnZXREAQJ4cAQBbgUEYmlnMgQDeHAwCQCRAwIFAnhwAAAEA3hwMQkAkQMCBQJ4cAABBAphUHJlY2lzaW9uCQCnAwEFBUFtdWx0BAFhCQC5AgIJAKcDAQUBQQUKYVByZWNpc2lvbgQBcwkAtwICBQN4cDAFA3hwMQMJAAACBQFzBQRiaWcwBQRiaWcwBANhbm4JALkCAgUBYQUBbgQLeHAwX3hwMV9uX24JALkCAgkAuQICCQC5AgIFA3hwMAUDeHAxBQFuBQFuBBBhbm5fc19hUHJlY2lzaW9uCQC6AgIJALkCAgUDYW5uBQFzBQphUHJlY2lzaW9uBA5hbm5fYVByZWNpc2lvbgkAuAICBQNhbm4FCmFQcmVjaXNpb24EAm4xCQC3AgIFAW4FBGJpZzEKAQRjYWxjAgNhY2MDY3VyBA0kdDAyMjM0MzIyMzYzBQNhY2MEAWQIBQ0kdDAyMjM0MzIyMzYzAl8xBAVmb3VuZAgFDSR0MDIyMzQzMjIzNjMCXzIDCQECIT0CBQVmb3VuZAUEdW5pdAUDYWNjBAJkcAkAugICCQC5AgIJALkCAgUBZAUBZAUBZAULeHAwX3hwMV9uX24EBWROZXh0CQC6AgIJALkCAgkAtwICBRBhbm5fc19hUHJlY2lzaW9uCQC5AgIFAmRwBQFuBQFkCQC3AgIJALoCAgkAuQICBQ5hbm5fYVByZWNpc2lvbgUBZAUKYVByZWNpc2lvbgkAuQICBQJuMQUCZHAEBWREaWZmCQEJYWJzQmlnSW50AQkAuAICBQVkTmV4dAkBBXZhbHVlAQUBZAMJAMACAgUEYmlnMQUFZERpZmYJAJQKAgUFZE5leHQFA2N1cgkAlAoCBQVkTmV4dAUEdW5pdAQDYXJyCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOBQNuaWwEDSR0MDIyNzg0MjI4MzEKAAIkbAUDYXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQFzBQR1bml0CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRjYWxjAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQBZAgFDSR0MDIyNzg0MjI4MzECXzEEBWZvdW5kCAUNJHQwMjI3ODQyMjgzMQJfMgMJAQIhPQIFBWZvdW5kBQR1bml0BQFkCQACAQkArAICAhlEIGNhbGN1bGF0aW9uIGVycm9yLCBEID0gCQCmAwEFAWQBBWdldFlEAwJ4cAFpAUQEAW4FBGJpZzIEAXgJAJEDAgUCeHADCQAAAgUBaQAAAAEAAAQKYVByZWNpc2lvbgkApwMBBQVBbXVsdAQBYQkAuQICCQCnAwEFAUEFCmFQcmVjaXNpb24EAXMFAXgEA2FubgkAuQICBQFhBQFuBAFjCQC6AgIJALkCAgkAuQICCQC6AgIJALkCAgUBRAUBRAkAuQICBQF4BQFuBQFEBQphUHJlY2lzaW9uCQC5AgIFA2FubgUBbgQBYgkAuAICCQC3AgIFAXMJALoCAgkAuQICBQFEBQphUHJlY2lzaW9uBQNhbm4FAUQKAQRjYWxjAgNhY2MDY3VyBA0kdDAyMzMzMTIzMzUxBQNhY2MEAXkIBQ0kdDAyMzMzMTIzMzUxAl8xBAVmb3VuZAgFDSR0MDIzMzMxMjMzNTECXzIDCQECIT0CBQVmb3VuZAUEdW5pdAUDYWNjBAV5TmV4dAkAugICCQC3AgIJALkCAgUBeQUBeQUBYwkAtwICCQC5AgIFBGJpZzIFAXkFAWIEBXlEaWZmCQEJYWJzQmlnSW50AQkAuAICBQV5TmV4dAkBBXZhbHVlAQUBeQMJAMACAgUEYmlnMQUFeURpZmYJAJQKAgUFeU5leHQFA2N1cgkAlAoCBQV5TmV4dAUEdW5pdAQDYXJyCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOBQNuaWwEDSR0MDIzNjU4MjM3MDUKAAIkbAUDYXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQFEBQR1bml0CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRjYWxjAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQBeQgFDSR0MDIzNjU4MjM3MDUCXzEEBWZvdW5kCAUNJHQwMjM2NTgyMzcwNQJfMgMJAQIhPQIFBWZvdW5kBQR1bml0BQF5CQACAQkArAICAhlZIGNhbGN1bGF0aW9uIGVycm9yLCBZID0gCQCmAwEFAXkBDWNhbGNQdXRPbmVUa24ECXBtdEFtdFJhdwpwbXRBc3NldElkC3VzZXJBZGRyZXNzBHR4SWQECnBvb2xDb25maWcJAQNncGMABARhbUlkCQCRAwIFCnBvb2xDb25maWcFCWlkeEFtQXNJZAQEcHJJZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhQckFzSWQEBGxwSWQJAJEDAgUKcG9vbENvbmZpZwUJaWR4TFBBc0lkBAZhbXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpwb29sQ29uZmlnBQtpZHhBbXRBc0RjbQQIcHJpY2VEY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpwb29sQ29uZmlnBQ1pZHhQcmljZUFzRGNtBA9scEFzc2V0RW1pc3Npb24JALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFBGxwSWQCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEDWNoZWNoRW1pc3Npb24DCQC/AgIFD2xwQXNzZXRFbWlzc2lvbgUEYmlnMAYJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFDWNoZWNoRW1pc3Npb24FDWNoZWNoRW1pc3Npb24ECWFtQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQRhbUlkBAlwckJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUEcHJJZAQNJHQwMjQ0NjQyNDkyNgMJAAACBQR0eElkAgAJAJQKAgUJYW1CYWxhbmNlBQlwckJhbGFuY2UDCQAAAgUKcG10QXNzZXRJZAUEYW1JZAMJAGYCBQlwbXRBbXRSYXcFCWFtQmFsYW5jZQkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJQKAgkAZQIFCWFtQmFsYW5jZQUJcG10QW10UmF3BQlwckJhbGFuY2UDCQAAAgUKcG10QXNzZXRJZAUEcHJJZAMJAGYCBQlwbXRBbXRSYXcFCXByQmFsYW5jZQkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJQKAgUJYW1CYWxhbmNlCQBlAgUJcHJCYWxhbmNlBQlwbXRBbXRSYXcJAAIBAhB3cm9uZyBwbXRBc3NldElkBAxhbUJhbGFuY2VPbGQIBQ0kdDAyNDQ2NDI0OTI2Al8xBAxwckJhbGFuY2VPbGQIBQ0kdDAyNDQ2NDI0OTI2Al8yBA0kdDAyNDkzMjI1MTA4AwkAAAIFCnBtdEFzc2V0SWQFBGFtSWQJAJQKAgUJcG10QW10UmF3AAADCQAAAgUKcG10QXNzZXRJZAUEcHJJZAkAlAoCAAAFCXBtdEFtdFJhdwkAAgECD2ludmFsaWQgcGF5bWVudAQLYW1BbW91bnRSYXcIBQ0kdDAyNDkzMjI1MTA4Al8xBAtwckFtb3VudFJhdwgFDSR0MDI0OTMyMjUxMDgCXzIECGFtQW1vdW50CAkBB3Rha2VGZWUBBQthbUFtb3VudFJhdwJfMQQIcHJBbW91bnQICQEHdGFrZUZlZQEFC3ByQW1vdW50UmF3Al8xBAlmZWVBbW91bnQICQEHdGFrZUZlZQEFCXBtdEFtdFJhdwJfMgQMYW1CYWxhbmNlTmV3CQBkAgUMYW1CYWxhbmNlT2xkBQhhbUFtb3VudAQMcHJCYWxhbmNlTmV3CQBkAgUMcHJCYWxhbmNlT2xkBQhwckFtb3VudAQCRDAJAQRnZXREAQkAzAgCCQC2AgEFDGFtQmFsYW5jZU9sZAkAzAgCCQC2AgEFDHByQmFsYW5jZU9sZAUDbmlsBAJEMQkBBGdldEQBCQDMCAIJALYCAQUMYW1CYWxhbmNlTmV3CQDMCAIJALYCAQUMcHJCYWxhbmNlTmV3BQNuaWwEBmNoZWNrRAMJAL8CAgUCRDEFAkQwBgkBBXRocm93AAMJAAACBQZjaGVja0QFBmNoZWNrRAQIbHBBbW91bnQJALwCAwUPbHBBc3NldEVtaXNzaW9uCQC4AgIFAkQxBQJEMAUCRDAECGN1clByaWNlCQECZjECCQEEY3BiaQIJAQJ0MQIFDHByQmFsYW5jZU5ldwUIcHJpY2VEY20JAQJ0MQIFDGFtQmFsYW5jZU5ldwUGYW10RGNtBQZzY2FsZTgEC2NvbW1vblN0YXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQhjdXJQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUIY3VyUHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBA3BhdQIFC3VzZXJBZGRyZXNzBQR0eElkCQERZGF0YVB1dEFjdGlvbkluZm8KBQthbUFtb3VudFJhdwULcHJBbW91bnRSYXcJAKADAQUIbHBBbW91bnQFCGN1clByaWNlAAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQOcG9vbFByb3BvcnRpb24JAGsDBQxwckJhbGFuY2VPbGQFBnNjYWxlOAUMYW1CYWxhbmNlT2xkBA9hbW91bnRBc3NldFBhcnQJAGsDBQlwbXRBbXRSYXcFBnNjYWxlOAkAZAIFDnBvb2xQcm9wb3J0aW9uBQZzY2FsZTgEDnByaWNlQXNzZXRQYXJ0CQBlAgUJcG10QW10UmF3BQ9hbW91bnRBc3NldFBhcnQECWxwQW10Qm90aAkAvAIDBQ9scEFzc2V0RW1pc3Npb24JALYCAQUOcHJpY2VBc3NldFBhcnQJALYCAQUMcHJCYWxhbmNlT2xkBAVib251cwkAoAMBCQC8AgMJALgCAgUIbHBBbW91bnQFCWxwQW10Qm90aAUMc2NhbGU4QmlnSW50BQlscEFtdEJvdGgJAJYKBAkAoAMBBQhscEFtb3VudAULY29tbW9uU3RhdGUFCWZlZUFtb3VudAUFYm9udXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2dldE9uZVRrblYySW50ZXJuYWwGCm91dEFzc2V0SWQMbWluT3V0QW1vdW50CHBheW1lbnRzBmNhbGxlcgxvcmlnaW5DYWxsZXINdHJhbnNhY3Rpb25JZAQKcG9vbENvbmZpZwkBA2dwYwAEBGxwSWQJAJEDAgUKcG9vbENvbmZpZwUJaWR4TFBBc0lkBARhbUlkCQCRAwIFCnBvb2xDb25maWcFCWlkeEFtQXNJZAQEcHJJZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhQckFzSWQECmFtRGVjaW1hbHMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpwb29sQ29uZmlnBQtpZHhBbXRBc0RjbQQKcHJEZWNpbWFscwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFDWlkeFByaWNlQXNEY20ECnBvb2xTdGF0dXMJAJEDAgUKcG9vbENvbmZpZwUJaWR4UG9vbFN0BAt1c2VyQWRkcmVzcwMJAAACBQZjYWxsZXIFDHJlc3RDb250cmFjdAUMb3JpZ2luQ2FsbGVyBQZjYWxsZXIEA3BtdAkBBXZhbHVlAQkAkQMCBQhwYXltZW50cwAABApwbXRBc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEBnBtdEFtdAgFA3BtdAZhbW91bnQDCQBmAgCAlOvcAwUGcG10QW10CQACAQINTWluIHBtdCAxMCBMUAQGdHhJZDU4CQDYBAEFDXRyYW5zYWN0aW9uSWQDCQECIT0CBQRscElkCQDYBAEFCnBtdEFzc2V0SWQJAAIBAghXcm9uZyBMUAQJYW1CYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFBGFtSWQECXByQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQRwcklkBA0kdDAyNzMwMDI3NDA4CgABQAkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFCm91dEFzc2V0SWQJAMwIAgUGcG10QW10BQNuaWwFA25pbAMJAAECBQFAAgooSW50LCBJbnQpBQFACQACAQkArAICCQADAQUBQAIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQQIdG90YWxHZXQIBQ0kdDAyNzMwMDI3NDA4Al8xBAlmZWVBbW91bnQIBQ0kdDAyNzMwMDI3NDA4Al8yBAt0b3RhbEFtb3VudAMDCQBmAgUMbWluT3V0QW1vdW50AAAJAGYCBQxtaW5PdXRBbW91bnQFCHRvdGFsR2V0BwkAAgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUMbWluT3V0QW1vdW50BQNuaWwCAAUIdG90YWxHZXQEDSR0MDI3NTk1Mjc5MDIDCQAAAgUKb3V0QXNzZXRJZAUEYW1JZAkAlgoEBQt0b3RhbEFtb3VudAAACQBlAgkAZQIFCWFtQmFsYW5jZQULdG90YWxBbW91bnQFCWZlZUFtb3VudAUJcHJCYWxhbmNlAwkAAAIFCm91dEFzc2V0SWQFBHBySWQJAJYKBAAABQt0b3RhbEFtb3VudAUJYW1CYWxhbmNlCQBlAgkAZQIFCXByQmFsYW5jZQULdG90YWxBbW91bnQFCWZlZUFtb3VudAkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAVvdXRBbQgFDSR0MDI3NTk1Mjc5MDICXzEEBW91dFByCAUNJHQwMjc1OTUyNzkwMgJfMgQMYW1CYWxhbmNlTmV3CAUNJHQwMjc1OTUyNzkwMgJfMwQMcHJCYWxhbmNlTmV3CAUNJHQwMjc1OTUyNzkwMgJfNAQIY3VyUHJYMTgJAQRjcGJpAgkBAnQxAgUMcHJCYWxhbmNlTmV3BQpwckRlY2ltYWxzCQECdDECBQxhbUJhbGFuY2VOZXcFCmFtRGVjaW1hbHMEBWN1clByCQECZjECBQhjdXJQclgxOAUGc2NhbGU4BBFvdXRBc3NldElkT3JXYXZlcwMJAAACBQpvdXRBc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQpvdXRBc3NldElkBBBzZW5kRmVlVG9NYXRjaGVyAwkAZgIFCWZlZUFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFE2ZlZUNvbGxlY3RvckFkZHJlc3MFCWZlZUFtb3VudAURb3V0QXNzZXRJZE9yV2F2ZXMFA25pbAUDbmlsBAVzdGF0ZQkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQt0b3RhbEFtb3VudAURb3V0QXNzZXRJZE9yV2F2ZXMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBA2dhdQIJAKUIAQULdXNlckFkZHJlc3MFBnR4SWQ1OAkBEWRhdGFHZXRBY3Rpb25JbmZvBgUFb3V0QW0FBW91dFByBQZwbXRBbXQFBWN1clByBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQVjdXJQcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUFY3VyUHIFA25pbAUQc2VuZEZlZVRvTWF0Y2hlcgMJAAACBQVzdGF0ZQUFc3RhdGUEBGJ1cm4JAPwHBAUDZmNhAgRidXJuCQDMCAIFBnBtdEFtdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpwbXRBc3NldElkBQZwbXRBbXQFA25pbAMJAAACBQRidXJuBQRidXJuCQCUCgIFBXN0YXRlBQt0b3RhbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEBbQAEByRtYXRjaDAJAKIIAQkBA21wawADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJwbQAEByRtYXRjaDAJAKIIAQkBBHBtcGsAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACcGQJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECbW0BAWkEByRtYXRjaDAJAQFtAAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUCcGQDCQABAgUHJG1hdGNoMAIEVW5pdAMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBQJwZAkAAgECC01hdGNoIGVycm9yGgFpAQtjb25zdHJ1Y3RvcgECZmMEAWMJAQJtbQEFAWkDCQAAAgUBYwUBYwkAzAgCCQELU3RyaW5nRW50cnkCCQECZmMABQJmYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnNldE1hbmFnZXIBF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BAFjCQECbW0BBQFpAwkAAAIFAWMFAWMEAmNtCQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFAmNtBQJjbQkAzAgCCQELU3RyaW5nRW50cnkCCQEEcG1wawAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAFwCQECcG0ABANocG0DCQEJaXNEZWZpbmVkAQUBcAYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUDaHBtBQNocG0EA2NwbQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAXAGCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFA2NwbQUDY3BtCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNtcGsACQDYBAEJAQV2YWx1ZQEFAXAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBBHBtcGsABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEDcHV0AgRzbGlwCWF1dG9TdGFrZQQHZmFjdENmZwkBA2dmYwAEC3N0YWtpbmdDbnRyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdmYWN0Q2ZnBQ9pZHhGYWN0U3Rha0NudHICCldyIHN0IGFkZHIECHNsaXBDbnRyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdmYWN0Q2ZnBRBpZHhGYWN0U2xpcHBDbnRyAgpXciBzbCBhZGRyAwkAZgIAAAUEc2xpcAkAAgECDldyb25nIHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAFlCQECY3AKCQClCAEIBQFpBmNhbGxlcgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAkQMCCAUBaQhwYXltZW50cwABBQRzbGlwBgcGAAACAAQJZW1pdExwQW10CAUBZQJfMgQJbHBBc3NldElkCAUBZQJfNwQFc3RhdGUIBQFlAl85BAZhbURpZmYIBQFlA18xMAQGcHJEaWZmCAUBZQNfMTEEBGFtSWQIBQFlA18xMgQEcHJJZAgFAWUDXzEzBAFyCQD8BwQFA2ZjYQIEZW1pdAkAzAgCBQllbWl0THBBbXQFA25pbAUDbmlsAwkAAAIFAXIFAXIEAmVsBAckbWF0Y2gwBQFyAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEBmxlZ2FjeQUHJG1hdGNoMAkA/AcEBQZsZWdhY3kCBGVtaXQJAMwIAgUJZW1pdExwQW10BQNuaWwFA25pbAUEdW5pdAMJAAACBQJlbAUCZWwEAnNhAwkAZgIFBmFtRGlmZgAACQD8BwQFCHNsaXBDbnRyAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEYW1JZAUGYW1EaWZmBQNuaWwFA25pbAMJAAACBQJzYQUCc2EEAnNwAwkAZgIFBnByRGlmZgAACQD8BwQFCHNsaXBDbnRyAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEcHJJZAUGcHJEaWZmBQNuaWwFA25pbAMJAAACBQJzcAUCc3AECGxwVHJuc2ZyAwUJYXV0b1N0YWtlBAJzcwkA/AcEBQtzdGFraW5nQ250cgIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUJbHBBc3NldElkBQllbWl0THBBbXQFA25pbAMJAAACBQJzcwUCc3MFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCWVtaXRMcEFtdAUJbHBBc3NldElkBQNuaWwJAM4IAgUFc3RhdGUFCGxwVHJuc2ZyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3B1dE9uZVRrblYyAgxtaW5PdXRBbW91bnQJYXV0b1N0YWtlBCBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAoAAUAJAPwHBAUDZmNhAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEFAUACHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EDWlzUHV0RGlzYWJsZWQDAwMJAQNpZ3MABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFClBvb2xQdXREaXMGCQAAAgUNY2ZnUG9vbFN0YXR1cwUMUG9vbFNodXRkb3duBgUgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQEBmNoZWNrcwkAzAgCAwkBASEBBQ1pc1B1dERpc2FibGVkBgkBCHRocm93RXJyAQIhcHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MECnBvb2xDb25maWcJAQNncGMABARhbUlkCQCRAwIFCnBvb2xDb25maWcFCWlkeEFtQXNJZAQEcHJJZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhQckFzSWQEBGxwSWQJANkEAQkAkQMCBQpwb29sQ29uZmlnBQlpZHhMUEFzSWQECmFtRGVjaW1hbHMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpwb29sQ29uZmlnBQtpZHhBbXRBc0RjbQQKcHJEZWNpbWFscwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFDWlkeFByaWNlQXNEY20EC3VzZXJBZGRyZXNzAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwgFAWkMb3JpZ2luQ2FsbGVyCAUBaQZjYWxsZXIEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABApwbXRBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQGcG10QW10CAUDcG10BmFtb3VudAMJAGYCAICt4gQFBnBtdEFtdAkAAgECDVdyb25nIHBtdCBhbXQEDSR0MDMzMTUxMzMyNzYJAQ1jYWxjUHV0T25lVGtuBAUGcG10QW10BQpwbXRBc3NldElkCQClCAEFC3VzZXJBZGRyZXNzCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQEB2VzdGltTFAIBQ0kdDAzMzE1MTMzMjc2Al8xBAVzdGF0ZQgFDSR0MDMzMTUxMzMyNzYCXzIECWZlZUFtb3VudAgFDSR0MDMzMTUxMzMyNzYCXzMECWVtaXRMcEFtdAMDCQBmAgUMbWluT3V0QW1vdW50AAAJAGYCBQxtaW5PdXRBbW91bnQFB2VzdGltTFAHCQACAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQxtaW5PdXRBbW91bnQFA25pbAIABQdlc3RpbUxQBAFlCQD8BwQFA2ZjYQIEZW1pdAkAzAgCBQllbWl0THBBbXQFA25pbAUDbmlsAwkAAAIFAWUFAWUEAmVsBAckbWF0Y2gwBQFlAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEBmxlZ2FjeQUHJG1hdGNoMAkA/AcEBQZsZWdhY3kCBGVtaXQJAMwIAgUJZW1pdExwQW10BQNuaWwFA25pbAUEdW5pdAMJAAACBQJlbAUCZWwECGxwVHJuc2ZyAwUJYXV0b1N0YWtlBAJzcwkA/AcEBQ9zdGFraW5nQ29udHJhY3QCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBGxwSWQFCWVtaXRMcEFtdAUDbmlsAwkAAAIFAnNzBQJzcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUJZW1pdExwQW10BQRscElkBQNuaWwEEHNlbmRGZWVUb01hdGNoZXIDCQBmAgUJZmVlQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmVlQ29sbGVjdG9yQWRkcmVzcwUJZmVlQW1vdW50CQDZBAEFCnBtdEFzc2V0SWQFA25pbAUDbmlsCQCUCgIJAM4IAgkAzggCBQVzdGF0ZQUIbHBUcm5zZnIFEHNlbmRGZWVUb01hdGNoZXIFCWVtaXRMcEFtdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpwdXRGb3JGcmVlAQdtYXhTbHBnAwkAZgIAAAUHbWF4U2xwZwkAAgECCldyb25nIHNscGcDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEBmVzdFB1dAkBAmNwCgkApQgBCAUBaQZjYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAWkIcGF5bWVudHMAAQUHbWF4U2xwZwcHBgAAAgAIBQZlc3RQdXQCXzkBaQEDZ2V0AAQBcgkBAmNnAQUBaQQJb3V0QW10QW10CAUBcgJfMQQIb3V0UHJBbXQIBQFyAl8yBAZwbXRBbXQIBQFyAl8zBApwbXRBc3NldElkCAUBcgJfNAQFc3RhdGUIBQFyAl81BAFiCQD8BwQFA2ZjYQIEYnVybgkAzAgCBQZwbXRBbXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUGcG10QW10BQNuaWwDCQAAAgUBYgUBYgUFc3RhdGUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELZ2V0T25lVGtuVjICCm91dEFzc2V0SWQMbWluT3V0QW1vdW50BCBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAoAAUAJAPwHBAUDZmNhAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEFAUACHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EDWlzR2V0RGlzYWJsZWQDAwkBA2lncwAGCQAAAgUNY2ZnUG9vbFN0YXR1cwUMUG9vbFNodXRkb3duBgUgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQEBmNoZWNrcwkAzAgCAwkBASEBBQ1pc0dldERpc2FibGVkBgkBCHRocm93RXJyAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDSR0MDM1ODYyMzYwMTcJARNnZXRPbmVUa25WMkludGVybmFsBgUKb3V0QXNzZXRJZAUMbWluT3V0QW1vdW50CAUBaQhwYXltZW50cwgFAWkGY2FsbGVyCAUBaQxvcmlnaW5DYWxsZXIIBQFpDXRyYW5zYWN0aW9uSWQEBXN0YXRlCAUNJHQwMzU4NjIzNjAxNwJfMQQLdG90YWxBbW91bnQIBQ0kdDAzNTg2MjM2MDE3Al8yCQCUCgIFBXN0YXRlBQt0b3RhbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNnZXRPbmVUa25WMlJFQURPTkxZAgpvdXRBc3NldElkDWxwQXNzZXRBbW91bnQECnBvb2xDb25maWcJAQNncGMABARhbUlkCQCRAwIFCnBvb2xDb25maWcFCWlkeEFtQXNJZAQEcHJJZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhQckFzSWQEBGxwSWQJAJEDAgUKcG9vbENvbmZpZwUJaWR4TFBBc0lkBAJ4cAkAzAgCCQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQUEYW1JZAkAzAgCCQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQUEcHJJZAUDbmlsBApscEVtaXNzaW9uCQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQRscElkAhBpbnZhbGlkIGxwIGFzc2V0CHF1YW50aXR5BAJEMAkBBGdldEQBBQJ4cAQCRDEJALgCAgUCRDAJALwCAwkAtgIBBQ1scEFzc2V0QW1vdW50BQJEMAUKbHBFbWlzc2lvbgQFaW5kZXgDCQAAAgUKb3V0QXNzZXRJZAUEYW1JZAAAAwkAAAIFCm91dEFzc2V0SWQFBHBySWQAAQkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBARuZXdZCQEFZ2V0WUQDBQJ4cAUFaW5kZXgFAkQxBAJkeQkAuAICCQCRAwIFAnhwBQVpbmRleAUEbmV3WQQLdG90YWxHZXRSYXcJAKADAQkAuAICBQJkeQUEYmlnMQQNJHQwMzY3OTYzNjg0NQkBB3Rha2VGZWUBBQt0b3RhbEdldFJhdwQIdG90YWxHZXQIBQ0kdDAzNjc5NjM2ODQ1Al8xBAlmZWVBbW91bnQIBQ0kdDAzNjc5NjM2ODQ1Al8yCQCUCgIFA25pbAkAlAoCBQh0b3RhbEdldAUJZmVlQW1vdW50AWkBHGdldE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCCm91dEFzc2V0SWQNbHBBc3NldEFtb3VudAQKcG9vbENvbmZpZwkBA2dwYwAEBGFtSWQJAJEDAgUKcG9vbENvbmZpZwUJaWR4QW1Bc0lkBARwcklkCQCRAwIFCnBvb2xDb25maWcFCWlkeFByQXNJZAQEbHBJZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhMUEFzSWQECWFtQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQRhbUlkBAlwckJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUEcHJJZAQNJHQwMzcxOTAzNzMwNQoAAUAJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQpvdXRBc3NldElkCQDMCAIFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsAwkAAQIFAUACCihJbnQsIEludCkFAUAJAAIBCQCsAgIJAAMBBQFAAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpBAh0b3RhbEdldAgFDSR0MDM3MTkwMzczMDUCXzEECWZlZUFtb3VudAgFDSR0MDM3MTkwMzczMDUCXzIEAXIJAQNlZ28EAgAFBGxwSWQFDWxwQXNzZXRBbW91bnQFBHRoaXMECG91dEFtQW10CAUBcgJfMQQIb3V0UHJBbXQIBQFyAl8yBA5zdW1PZkdldEFzc2V0cwkAZAIFCG91dEFtQW10BQhvdXRQckFtdAQFYm9udXMJAGsDCQBlAgUIdG90YWxHZXQFDnN1bU9mR2V0QXNzZXRzBQZzY2FsZTgFDnN1bU9mR2V0QXNzZXRzCQCUCgIFA25pbAkAlQoDBQh0b3RhbEdldAUJZmVlQW1vdW50BQVib251cwFpAQlnZXROb0xlc3MCEm5vTGVzc1RoZW5BbXRBc3NldBRub0xlc3NUaGVuUHJpY2VBc3NldAQBcgkBAmNnAQUBaQQIb3V0QW1BbXQIBQFyAl8xBAhvdXRQckFtdAgFAXICXzIEBnBtdEFtdAgFAXICXzMECnBtdEFzc2V0SWQIBQFyAl80BAVzdGF0ZQgFAXICXzUDCQBmAgUSbm9MZXNzVGhlbkFtdEFzc2V0BQhvdXRBbUFtdAkAAgEJAKwCAgkArAICCQCsAgICCUZhaWxlZDogIAkApAMBBQhvdXRBbUFtdAIDIDwgCQCkAwEFEm5vTGVzc1RoZW5BbXRBc3NldAMJAGYCBRRub0xlc3NUaGVuUHJpY2VBc3NldAUIb3V0UHJBbXQJAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQhvdXRQckFtdAIDIDwgCQCkAwEFFG5vTGVzc1RoZW5QcmljZUFzc2V0BBRidXJuTFBBc3NldE9uRmFjdG9yeQkA/AcEBQNmY2ECBGJ1cm4JAMwIAgUGcG10QW10BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFBnBtdEFtdAUDbmlsAwkAAAIFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BRRidXJuTFBBc3NldE9uRmFjdG9yeQUFc3RhdGUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdW5zdGFrZUFuZEdldAEGYW1vdW50BA1jaGVja1BheW1lbnRzAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUNY2hlY2tQYXltZW50cwUNY2hlY2tQYXltZW50cwQDY2ZnCQEDZ3BjAAQKZmFjdG9yeUNmZwkBA2dmYwAECWxwQXNzZXRJZAkA2QQBCQCRAwIFA2NmZwUJaWR4TFBBc0lkBAdzdGFraW5nCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQpmYWN0b3J5Q2ZnBQ9pZHhGYWN0U3Rha0NudHICCldyIHN0IGFkZHIECnVuc3Rha2VJbnYJAPwHBAUHc3Rha2luZwIHdW5zdGFrZQkAzAgCCQDYBAEFCWxwQXNzZXRJZAkAzAgCBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFCnVuc3Rha2VJbnYFCnVuc3Rha2VJbnYEAXIJAQNlZ28ECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQUJbHBBc3NldElkBQZhbW91bnQIBQFpBmNhbGxlcgQDc3RzCQENcGFyc2VJbnRWYWx1ZQEIBQFyAl85BAVzdGF0ZQgFAXIDXzEwBAF2AwMJAQNpZ3MABgkAAAIFA3N0cwUMUG9vbFNodXRkb3duCQACAQkArAICAglCbG9ja2VkOiAJAKQDAQUDc3RzBgMJAAACBQF2BQF2BAVidXJuQQkA/AcEBQNmY2ECBGJ1cm4JAMwIAgUGYW1vdW50BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCWxwQXNzZXRJZAUGYW1vdW50BQNuaWwDCQAAAgUFYnVybkEFBWJ1cm5BBQVzdGF0ZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARV1bnN0YWtlQW5kR2V0T25lVGtuVjIDDXVuc3Rha2VBbW91bnQKb3V0QXNzZXRJZAxtaW5PdXRBbW91bnQEIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkCgABQAkA/AcEBQNmY2ECKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQFAAgdCb29sZWFuBQFACQACAQkArAICCQADAQUBQAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQNaXNHZXREaXNhYmxlZAMDCQEDaWdzAAYJAAACBQ1jZmdQb29sU3RhdHVzBQxQb29sU2h1dGRvd24GBSBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAQGY2hlY2tzCQDMCAIDCQEBIQEFDWlzR2V0RGlzYWJsZWQGCQEIdGhyb3dFcnIBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAGCQEIdGhyb3dFcnIBAhhubyBwYXltZW50cyBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQDY2ZnCQEDZ3BjAAQKZmFjdG9yeUNmZwkBA2dmYwAECWxwQXNzZXRJZAkA2QQBCQCRAwIFA2NmZwUJaWR4TFBBc0lkBAdzdGFraW5nCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQpmYWN0b3J5Q2ZnBQ9pZHhGYWN0U3Rha0NudHICCldyIHN0IGFkZHIECnVuc3Rha2VJbnYJAPwHBAUHc3Rha2luZwIHdW5zdGFrZQkAzAgCCQDYBAEFCWxwQXNzZXRJZAkAzAgCBQ11bnN0YWtlQW1vdW50BQNuaWwFA25pbAMJAAACBQp1bnN0YWtlSW52BQp1bnN0YWtlSW52BA0kdDAzOTkxNzQwMTA1CQETZ2V0T25lVGtuVjJJbnRlcm5hbAYFCm91dEFzc2V0SWQFDG1pbk91dEFtb3VudAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUJbHBBc3NldElkBQ11bnN0YWtlQW1vdW50BQNuaWwIBQFpBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyCAUBaQ10cmFuc2FjdGlvbklkBAVzdGF0ZQgFDSR0MDM5OTE3NDAxMDUCXzEEC3RvdGFsQW1vdW50CAUNJHQwMzk5MTc0MDEwNQJfMgkAlAoCBQVzdGF0ZQULdG90YWxBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEccHV0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQIQcGF5bWVudEFtb3VudFJhdw5wYXltZW50QXNzZXRJZAQKcG9vbENvbmZpZwkBA2dwYwAEBGFtSWQJAJEDAgUKcG9vbENvbmZpZwUJaWR4QW1Bc0lkBARwcklkCQCRAwIFCnBvb2xDb25maWcFCWlkeFByQXNJZAQEbHBJZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhMUEFzSWQEDSR0MDQwMzY0NDA0NjEJAQ1jYWxjUHV0T25lVGtuBAUQcGF5bWVudEFtb3VudFJhdwUOcGF5bWVudEFzc2V0SWQCAAIABAhscEFtb3VudAgFDSR0MDQwMzY0NDA0NjECXzEEBXN0YXRlCAUNJHQwNDAzNjQ0MDQ2MQJfMgQJZmVlQW1vdW50CAUNJHQwNDAzNjQ0MDQ2MQJfMwQFYm9udXMIBQ0kdDA0MDM2NDQwNDYxAl80CQCUCgIFA25pbAkAlQoDBQhscEFtb3VudAUJZmVlQW1vdW50BQVib251cwFpAQhhY3RpdmF0ZQIIYW10QXNTdHIHcHJBc1N0cgMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyCQClCAEFA2ZjYQkAAgECBmRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQAFCGFtdEFzU3RyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJwYQAFB3ByQXNTdHIFA25pbAIHc3VjY2VzcwFpAQRzZXRTAgFrAXYDCQECIT0CCQClCAEIBQFpBmNhbGxlcgkBBHN0cmYCBQR0aGlzCQEDYWRhAAUCcGQJAMwIAgkBC1N0cmluZ0VudHJ5AgUBawUBdgUDbmlsAWkBBHNldEkCAWsBdgMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyCQEEc3RyZgIFBHRoaXMJAQNhZGEABQJwZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUBawUBdgUDbmlsAWkBHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkACQCUCgIFA25pbAkBA2dwYwABaQEcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQEHYXNzZXRJZAkAlAoCBQNuaWwJAQ1nZXRBY2NCYWxhbmNlAQUHYXNzZXRJZAFpARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwVhbUFtdAVwckFtdAVscEFtdAQCcHIJAQpjYWxjUHJpY2VzAwUFYW1BbXQFBXByQW10BQVscEFtdAkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFAnByAAAJAMwIAgkApgMBCQCRAwIFAnByAAEJAMwIAgkApgMBCQCRAwIFAnByAAIFA25pbAFpARZmcm9tWDE4V3JhcHBlclJFQURPTkxZAgN2YWwMcmVzU2NhbGVNdWx0CQCUCgIFA25pbAkBAmYxAgkApwMBBQN2YWwFDHJlc1NjYWxlTXVsdAFpARR0b1gxOFdyYXBwZXJSRUFET05MWQIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQCUCgIFA25pbAkApgMBCQECdDECBQdvcmlnVmFsBQ1vcmlnU2NhbGVNdWx0AWkBHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQIIcHJBbXRYMTgIYW1BbXRYMTgJAJQKAgUDbmlsCQCmAwEJAQRjcGJpAgkApwMBBQhwckFtdFgxOAkApwMBBQhhbUFtdFgxOAFpASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkGdHhJZDU4CHNsaXBwYWdlB2luQW1BbXQGaW5BbUlkB2luUHJBbXQGaW5QcklkB3VzckFkZHIGaXNFdmFsBmVtaXRMcAkAlAoCBQNuaWwJAQNlcG8NBQZ0eElkNTgFCHNsaXBwYWdlBQdpbkFtQW10BQZpbkFtSWQFB2luUHJBbXQFBmluUHJJZAUHdXNyQWRkcgUGaXNFdmFsBQZlbWl0THAGBwAAAgABaQEjZXN0aW1hdGVHZXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkEBnR4SWQ1OAdwbXRBc0lkCHBtdExwQW10B3VzckFkZHIEAXIJAQNlZ28EBQZ0eElkNTgFB3BtdEFzSWQFCHBtdExwQW10CQERQGV4dHJOYXRpdmUoMTA2MikBBQd1c3JBZGRyCQCUCgIFA25pbAkAnAoKCAUBcgJfMQgFAXICXzIIBQFyAl8zCAUBcgJfNAgFAXICXzUIBQFyAl82CAUBcgJfNwkApgMBCAUBcgJfOAgFAXICXzkIBQFyA18xMAFpAQ5nZXRGZWVSRUFET05MWQAJAJQKAgUDbmlsBQNmZWUBAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJAQFtAAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAgVPcmRlcgQFb3JkZXIFByRtYXRjaDAECm1hdGNoZXJQdWIJAQJtcAAECm9yZGVyVmFsaWQJAQNtb2EBBQVvcmRlcgQLc2VuZGVyVmFsaWQJAPQDAwgFBW9yZGVyCWJvZHlCeXRlcwkAkQMCCAUFb3JkZXIGcHJvb2ZzAAAIBQVvcmRlcg9zZW5kZXJQdWJsaWNLZXkEDG1hdGNoZXJWYWxpZAkA9AMDCAUFb3JkZXIJYm9keUJ5dGVzCQCRAwIIBQVvcmRlcgZwcm9vZnMAAQUKbWF0Y2hlclB1YgMDAwUKb3JkZXJWYWxpZAULc2VuZGVyVmFsaWQHBQxtYXRjaGVyVmFsaWQHBgkBA3RvZQMFCm9yZGVyVmFsaWQFC3NlbmRlclZhbGlkBQxtYXRjaGVyVmFsaWQDCQABAgUHJG1hdGNoMAIUU2V0U2NyaXB0VHJhbnNhY3Rpb24EAXMFByRtYXRjaDAEB25ld0hhc2gJAPYDAQkBBXZhbHVlAQgFAXMGc2NyaXB0BAthbGxvd2VkSGFzaAkA2wQBCQEFdmFsdWUBCQCdCAIFA2ZjYQkBHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2gABAtjdXJyZW50SGFzaAkA8QcBBQR0aGlzAwMJAAACBQthbGxvd2VkSGFzaAUHbmV3SGFzaAkBAiE9AgULY3VycmVudEhhc2gFB25ld0hhc2gHBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUPdGFyZ2V0UHVibGljS2V5CQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXlD1bEl", "chainId": 87, "height": 3355994, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7pfqFLbwNivRYGXHZmKrMNSZfWGwHMvH9XjMAcRB66C5 Next: 9qm4DpLXYN7Rnnj4YDQCBYrbx2Meb75M9ikWuhPu4VDJ Diff:
OldNewDifferences
1616 let big2 = toBigInt(2)
1717
1818 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
19+
20+let wavesString = "WAVES"
1921
2022 let Amult = "100"
2123
155157 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
156158
157159
160+func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
161+
162+
158163 let fca = addressFromStringValue(strf(this, fc()))
159164
160165 let A = strf(this, amp())
175180 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
176181 }
177182
183+
184+func parseAssetId (input) = if ((input == wavesString))
185+ then unit
186+ else fromBase58String(input)
187+
188+
189+func assetIdToString (input) = if ((input == unit))
190+ then wavesString
191+ else toBase58String(value(input))
192+
193+
194+func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]))
195+
196+
197+let poolConfigParsed = parsePoolConfig(gpc())
198+
199+let $t068297015 = poolConfigParsed
200+
201+let cfgPoolAddress = $t068297015._1
202+
203+let cfgPoolStatus = $t068297015._2
204+
205+let cfgLpAssetId = $t068297015._3
206+
207+let cfgAmountAssetId = $t068297015._4
208+
209+let cfgPriceAssetId = $t068297015._5
210+
211+let cfgAmountAssetDecimals = $t068297015._6
212+
213+let cfgPriceAssetDecimals = $t068297015._7
178214
179215 func gfc () = split(strf(fca, fcfg()), SEP)
180216
369405 else calcLpAmt
370406 let amDiff = (inAmAmt - calcAmAssetPmt)
371407 let prDiff = (inPrAmt - calcPrAssetPmt)
372- let $t01650916854 = if (if (isOneAsset)
408+ let $t01744617791 = if (if (isOneAsset)
373409 then (pmtId == amIdStr)
374410 else false)
375411 then $Tuple2(pmtAmt, 0)
378414 else false)
379415 then $Tuple2(0, pmtAmt)
380416 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
381- let writeAmAmt = $t01650916854._1
382- let writePrAmt = $t01650916854._2
417+ let writeAmAmt = $t01744617791._1
418+ let writePrAmt = $t01744617791._2
383419 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
384420 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
385421 }
479515 let ann_aPrecision = (ann - aPrecision)
480516 let n1 = (n + big1)
481517 func calc (acc,cur) = {
482- let $t02140621426 = acc
483- let d = $t02140621426._1
484- let found = $t02140621426._2
518+ let $t02234322363 = acc
519+ let d = $t02234322363._1
520+ let found = $t02234322363._2
485521 if ((found != unit))
486522 then acc
487523 else {
495531 }
496532
497533 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
498- let $t02184721894 = {
534+ let $t02278422831 = {
499535 let $l = arr
500536 let $s = size($l)
501537 let $acc0 = $Tuple2(s, unit)
509545
510546 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
511547 }
512- let d = $t02184721894._1
513- let found = $t02184721894._2
548+ let d = $t02278422831._1
549+ let found = $t02278422831._2
514550 if ((found != unit))
515551 then d
516552 else throw(("D calculation error, D = " + toString(d)))
530566 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
531567 let b = ((s + ((D * aPrecision) / ann)) - D)
532568 func calc (acc,cur) = {
533- let $t02239422414 = acc
534- let y = $t02239422414._1
535- let found = $t02239422414._2
569+ let $t02333123351 = acc
570+ let y = $t02333123351._1
571+ let found = $t02333123351._2
536572 if ((found != unit))
537573 then acc
538574 else {
545581 }
546582
547583 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
548- let $t02272122768 = {
584+ let $t02365823705 = {
549585 let $l = arr
550586 let $s = size($l)
551587 let $acc0 = $Tuple2(D, unit)
559595
560596 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
561597 }
562- let y = $t02272122768._1
563- let found = $t02272122768._2
598+ let y = $t02365823705._1
599+ let found = $t02365823705._2
564600 if ((found != unit))
565601 then y
566602 else throw(("Y calculation error, Y = " + toString(y)))
582618 then {
583619 let amBalance = getAccBalance(amId)
584620 let prBalance = getAccBalance(prId)
585- let $t02352723989 = if ((txId == ""))
621+ let $t02446424926 = if ((txId == ""))
586622 then $Tuple2(amBalance, prBalance)
587623 else if ((pmtAssetId == amId))
588624 then if ((pmtAmtRaw > amBalance))
593629 then throw("invalid payment amount")
594630 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
595631 else throw("wrong pmtAssetId")
596- let amBalanceOld = $t02352723989._1
597- let prBalanceOld = $t02352723989._2
598- let $t02399524171 = if ((pmtAssetId == amId))
632+ let amBalanceOld = $t02446424926._1
633+ let prBalanceOld = $t02446424926._2
634+ let $t02493225108 = if ((pmtAssetId == amId))
599635 then $Tuple2(pmtAmtRaw, 0)
600636 else if ((pmtAssetId == prId))
601637 then $Tuple2(0, pmtAmtRaw)
602638 else throw("invalid payment")
603- let amAmountRaw = $t02399524171._1
604- let prAmountRaw = $t02399524171._2
639+ let amAmountRaw = $t02493225108._1
640+ let prAmountRaw = $t02493225108._2
605641 let amAmount = takeFee(amAmountRaw)._1
606642 let prAmount = takeFee(prAmountRaw)._1
607643 let feeAmount = takeFee(pmtAmtRaw)._2
630666 }
631667
632668
633-func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = if ((size(payments) != 1))
634- then throw("1 pmnt expd")
635- else {
636- let poolConfig = gpc()
637- let lpId = poolConfig[idxLPAsId]
638- let amId = poolConfig[idxAmAsId]
639- let prId = poolConfig[idxPrAsId]
640- let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
641- let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
642- let poolStatus = poolConfig[idxPoolSt]
643- let userAddress = if ((caller == restContract))
644- then originCaller
645- else caller
646- let pmt = value(payments[0])
647- let pmtAssetId = value(pmt.assetId)
648- let pmtAmt = pmt.amount
649- if ((1000000000 > pmtAmt))
650- then throw("Min pmt 10 LP")
651- else {
652- let txId58 = toBase58String(transactionId)
653- if ((lpId != toBase58String(pmtAssetId)))
654- then throw("Wrong LP")
655- else {
656- let amBalance = getAccBalance(amId)
657- let prBalance = getAccBalance(prId)
658- let $t02642226530 = {
659- let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
660- if ($isInstanceOf(@, "(Int, Int)"))
661- then @
662- else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
669+func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
670+ let poolConfig = gpc()
671+ let lpId = poolConfig[idxLPAsId]
672+ let amId = poolConfig[idxAmAsId]
673+ let prId = poolConfig[idxPrAsId]
674+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
675+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
676+ let poolStatus = poolConfig[idxPoolSt]
677+ let userAddress = if ((caller == restContract))
678+ then originCaller
679+ else caller
680+ let pmt = value(payments[0])
681+ let pmtAssetId = value(pmt.assetId)
682+ let pmtAmt = pmt.amount
683+ if ((1000000000 > pmtAmt))
684+ then throw("Min pmt 10 LP")
685+ else {
686+ let txId58 = toBase58String(transactionId)
687+ if ((lpId != toBase58String(pmtAssetId)))
688+ then throw("Wrong LP")
689+ else {
690+ let amBalance = getAccBalance(amId)
691+ let prBalance = getAccBalance(prId)
692+ let $t02730027408 = {
693+ let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
694+ if ($isInstanceOf(@, "(Int, Int)"))
695+ then @
696+ else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
697+ }
698+ let totalGet = $t02730027408._1
699+ let feeAmount = $t02730027408._2
700+ let totalAmount = if (if ((minOutAmount > 0))
701+ then (minOutAmount > totalGet)
702+ else false)
703+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
704+ else totalGet
705+ let $t02759527902 = if ((outAssetId == amId))
706+ then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
707+ else if ((outAssetId == prId))
708+ then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
709+ else throw("invalid out asset id")
710+ let outAm = $t02759527902._1
711+ let outPr = $t02759527902._2
712+ let amBalanceNew = $t02759527902._3
713+ let prBalanceNew = $t02759527902._4
714+ let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
715+ let curPr = f1(curPrX18, scale8)
716+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
717+ then unit
718+ else fromBase58String(outAssetId)
719+ let sendFeeToMatcher = if ((feeAmount > 0))
720+ then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
721+ else nil
722+ let state = ([ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)] ++ sendFeeToMatcher)
723+ if ((state == state))
724+ then {
725+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
726+ if ((burn == burn))
727+ then $Tuple2(state, totalAmount)
728+ else throw("Strict value is not equal to itself.")
663729 }
664- let totalGet = $t02642226530._1
665- let feeAmount = $t02642226530._2
666- let totalAmount = if (if ((minOutAmount > 0))
667- then (minOutAmount > totalGet)
668- else false)
669- then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
670- else totalGet
671- let $t02671727024 = if ((outAssetId == amId))
672- then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
673- else if ((outAssetId == prId))
674- then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
675- else throw("invalid out asset id")
676- let outAm = $t02671727024._1
677- let outPr = $t02671727024._2
678- let amBalanceNew = $t02671727024._3
679- let prBalanceNew = $t02671727024._4
680- let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
681- let curPr = f1(curPrX18, scale8)
682- let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
683- then unit
684- else fromBase58String(outAssetId)
685- let sendFeeToMatcher = if ((feeAmount > 0))
686- then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
687- else nil
688- let state = ([ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)] ++ sendFeeToMatcher)
689- if ((state == state))
690- then {
691- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
692- if ((burn == burn))
693- then $Tuple2(state, totalAmount)
694- else throw("Strict value is not equal to itself.")
695- }
696- else throw("Strict value is not equal to itself.")
697- }
698- }
699- }
730+ else throw("Strict value is not equal to itself.")
731+ }
732+ }
733+ }
700734
701735
702736 func m () = match getString(mpk()) {
842876
843877
844878 @Callable(i)
845-func putOneTknV2 (minOutAmount,autoStake) = if ((size(i.payments) != 1))
846- then throw("1 pmnt expd")
847- else {
848- let poolConfig = gpc()
849- let amId = poolConfig[idxAmAsId]
850- let prId = poolConfig[idxPrAsId]
851- let lpId = fromBase58String(poolConfig[idxLPAsId])
852- let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
853- let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
854- let userAddress = if ((i.caller == this))
855- then i.originCaller
856- else i.caller
857- let pmt = value(i.payments[0])
858- let pmtAssetId = toBase58String(value(pmt.assetId))
859- let pmtAmt = pmt.amount
860- if ((10000000 > pmtAmt))
861- then throw("Wrong pmt amt")
862- else {
863- let $t03190132026 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
864- let estimLP = $t03190132026._1
865- let state = $t03190132026._2
866- let feeAmount = $t03190132026._3
867- let emitLpAmt = if (if ((minOutAmount > 0))
868- then (minOutAmount > estimLP)
869- else false)
870- then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
871- else estimLP
872- let e = invoke(fca, "emit", [emitLpAmt], nil)
873- if ((e == e))
874- then {
875- let el = match e {
876- case legacy: Address =>
877- invoke(legacy, "emit", [emitLpAmt], nil)
878- case _ =>
879- unit
880- }
881- if ((el == el))
882- then {
883- let lpTrnsfr = if (autoStake)
884- then {
885- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
886- if ((ss == ss))
887- then nil
888- else throw("Strict value is not equal to itself.")
889- }
890- else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
891- let sendFeeToMatcher = if ((feeAmount > 0))
892- then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
893- else nil
894- $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
895- }
896- else throw("Strict value is not equal to itself.")
897- }
898- else throw("Strict value is not equal to itself.")
899- }
879+func putOneTknV2 (minOutAmount,autoStake) = {
880+ let isPoolOneTokenOperationsDisabled = {
881+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
882+ if ($isInstanceOf(@, "Boolean"))
883+ then @
884+ else throw(($getType(@) + " couldn't be cast to Boolean"))
900885 }
886+ let isPutDisabled = if (if (if (igs())
887+ then true
888+ else (cfgPoolStatus == PoolPutDis))
889+ then true
890+ else (cfgPoolStatus == PoolShutdown))
891+ then true
892+ else isPoolOneTokenOperationsDisabled
893+ let checks = [if (!(isPutDisabled))
894+ then true
895+ else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
896+ then true
897+ else throwErr("exactly 1 payment are expected")]
898+ if ((checks == checks))
899+ then {
900+ let poolConfig = gpc()
901+ let amId = poolConfig[idxAmAsId]
902+ let prId = poolConfig[idxPrAsId]
903+ let lpId = fromBase58String(poolConfig[idxLPAsId])
904+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
905+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
906+ let userAddress = if ((i.caller == this))
907+ then i.originCaller
908+ else i.caller
909+ let pmt = value(i.payments[0])
910+ let pmtAssetId = toBase58String(value(pmt.assetId))
911+ let pmtAmt = pmt.amount
912+ if ((10000000 > pmtAmt))
913+ then throw("Wrong pmt amt")
914+ else {
915+ let $t03315133276 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
916+ let estimLP = $t03315133276._1
917+ let state = $t03315133276._2
918+ let feeAmount = $t03315133276._3
919+ let emitLpAmt = if (if ((minOutAmount > 0))
920+ then (minOutAmount > estimLP)
921+ else false)
922+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
923+ else estimLP
924+ let e = invoke(fca, "emit", [emitLpAmt], nil)
925+ if ((e == e))
926+ then {
927+ let el = match e {
928+ case legacy: Address =>
929+ invoke(legacy, "emit", [emitLpAmt], nil)
930+ case _ =>
931+ unit
932+ }
933+ if ((el == el))
934+ then {
935+ let lpTrnsfr = if (autoStake)
936+ then {
937+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
938+ if ((ss == ss))
939+ then nil
940+ else throw("Strict value is not equal to itself.")
941+ }
942+ else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
943+ let sendFeeToMatcher = if ((feeAmount > 0))
944+ then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
945+ else nil
946+ $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
947+ }
948+ else throw("Strict value is not equal to itself.")
949+ }
950+ else throw("Strict value is not equal to itself.")
951+ }
952+ }
953+ else throw("Strict value is not equal to itself.")
954+ }
901955
902956
903957
931985
932986 @Callable(i)
933987 func getOneTknV2 (outAssetId,minOutAmount) = {
934- let $t03420934364 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
935- let state = $t03420934364._1
936- let totalAmount = $t03420934364._2
937- $Tuple2(state, totalAmount)
988+ let isPoolOneTokenOperationsDisabled = {
989+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
990+ if ($isInstanceOf(@, "Boolean"))
991+ then @
992+ else throw(($getType(@) + " couldn't be cast to Boolean"))
993+ }
994+ let isGetDisabled = if (if (igs())
995+ then true
996+ else (cfgPoolStatus == PoolShutdown))
997+ then true
998+ else isPoolOneTokenOperationsDisabled
999+ let checks = [if (!(isGetDisabled))
1000+ then true
1001+ else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
1002+ then true
1003+ else throwErr("exactly 1 payment are expected")]
1004+ if ((checks == checks))
1005+ then {
1006+ let $t03586236017 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1007+ let state = $t03586236017._1
1008+ let totalAmount = $t03586236017._2
1009+ $Tuple2(state, totalAmount)
1010+ }
1011+ else throw("Strict value is not equal to itself.")
9381012 }
9391013
9401014
9571031 let newY = getYD(xp, index, D1)
9581032 let dy = (xp[index] - newY)
9591033 let totalGetRaw = toInt((dy - big1))
960- let $t03514335192 = takeFee(totalGetRaw)
961- let totalGet = $t03514335192._1
962- let feeAmount = $t03514335192._2
1034+ let $t03679636845 = takeFee(totalGetRaw)
1035+ let totalGet = $t03679636845._1
1036+ let feeAmount = $t03679636845._2
9631037 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
9641038 }
9651039
9731047 let lpId = poolConfig[idxLPAsId]
9741048 let amBalance = getAccBalance(amId)
9751049 let prBalance = getAccBalance(prId)
976- let $t03553735652 = {
1050+ let $t03719037305 = {
9771051 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
9781052 if ($isInstanceOf(@, "(Int, Int)"))
9791053 then @
9801054 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
9811055 }
982- let totalGet = $t03553735652._1
983- let feeAmount = $t03553735652._2
1056+ let totalGet = $t03719037305._1
1057+ let feeAmount = $t03719037305._2
9841058 let r = ego("", lpId, lpAssetAmount, this)
9851059 let outAmAmt = r._1
9861060 let outPrAmt = r._2
10531127
10541128 @Callable(i)
10551129 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
1056- let checkPayments = if ((size(i.payments) != 0))
1057- then throw("No pmnts expd")
1058- else true
1059- if ((checkPayments == checkPayments))
1130+ let isPoolOneTokenOperationsDisabled = {
1131+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
1132+ if ($isInstanceOf(@, "Boolean"))
1133+ then @
1134+ else throw(($getType(@) + " couldn't be cast to Boolean"))
1135+ }
1136+ let isGetDisabled = if (if (igs())
1137+ then true
1138+ else (cfgPoolStatus == PoolShutdown))
1139+ then true
1140+ else isPoolOneTokenOperationsDisabled
1141+ let checks = [if (!(isGetDisabled))
1142+ then true
1143+ else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
1144+ then true
1145+ else throwErr("no payments are expected")]
1146+ if ((checks == checks))
10601147 then {
10611148 let cfg = gpc()
10621149 let factoryCfg = gfc()
10651152 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10661153 if ((unstakeInv == unstakeInv))
10671154 then {
1068- let $t03795938147 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1069- let state = $t03795938147._1
1070- let totalAmount = $t03795938147._2
1155+ let $t03991740105 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1156+ let state = $t03991740105._1
1157+ let totalAmount = $t03991740105._2
10711158 $Tuple2(state, totalAmount)
10721159 }
10731160 else throw("Strict value is not equal to itself.")
10831170 let amId = poolConfig[idxAmAsId]
10841171 let prId = poolConfig[idxPrAsId]
10851172 let lpId = poolConfig[idxLPAsId]
1086- let $t03840638503 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1087- let lpAmount = $t03840638503._1
1088- let state = $t03840638503._2
1089- let feeAmount = $t03840638503._3
1090- let bonus = $t03840638503._4
1173+ let $t04036440461 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1174+ let lpAmount = $t04036440461._1
1175+ let state = $t04036440461._2
1176+ let feeAmount = $t04036440461._3
1177+ let bonus = $t04036440461._4
10911178 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10921179 }
10931180
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let big0 = toBigInt(0)
1313
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
1717
1818 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
19+
20+let wavesString = "WAVES"
1921
2022 let Amult = "100"
2123
2224 let Dconv = "1"
2325
2426 let SEP = "__"
2527
2628 let EMPTY = ""
2729
2830 let PoolActive = 1
2931
3032 let PoolPutDis = 2
3133
3234 let PoolMatcherDis = 3
3335
3436 let PoolShutdown = 4
3537
3638 let idxPoolAddress = 1
3739
3840 let idxPoolSt = 2
3941
4042 let idxLPAsId = 3
4143
4244 let idxAmAsId = 4
4345
4446 let idxPrAsId = 5
4547
4648 let idxAmtAsDcm = 6
4749
4850 let idxPriceAsDcm = 7
4951
5052 let idxIAmtAsId = 8
5153
5254 let idxIPriceAsId = 9
5355
5456 let idxFactStakCntr = 1
5557
5658 let idxFactoryRestCntr = 6
5759
5860 let idxFactSlippCntr = 7
5961
6062 let idxFactGwxRewCntr = 10
6163
6264 let feeDefault = fraction(5, scale8, 10000)
6365
6466 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6567
6668
6769 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6870
6971
7072 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7173
7274
7375 func abs (val) = if ((zeroBigInt > val))
7476 then -(val)
7577 else val
7678
7779
7880 func absBigInt (val) = if ((zeroBigInt > val))
7981 then -(val)
8082 else val
8183
8284
8385 func fc () = "%s__factoryContract"
8486
8587
8688 func mpk () = "%s__managerPublicKey"
8789
8890
8991 func pmpk () = "%s__pendingManagerPublicKey"
9092
9193
9294 func pl () = "%s%s__price__last"
9395
9496
9597 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
9698
9799
98100 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
99101
100102
101103 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
102104
103105
104106 func aa () = "%s__amountAsset"
105107
106108
107109 func pa () = "%s__priceAsset"
108110
109111
110112 func amp () = "%s__amp"
111113
112114
113115 func ada () = "%s__addonAddr"
114116
115117
116118 let keyFee = "%s__fee"
117119
118120 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
119121
120122 func fcfg () = "%s__factoryConfig"
121123
122124
123125 func mtpk () = "%s%s__matcher__publicKey"
124126
125127
126128 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
127129
128130
129131 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
130132
131133
132134 func aps () = "%s__shutdown"
133135
134136
135137 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
136138
137139
138140 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
139141
140142
141143 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
142144
143145
144146 func str (val) = match val {
145147 case valStr: String =>
146148 valStr
147149 case _ =>
148150 throw("fail cast to String")
149151 }
150152
151153
152154 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
153155
154156
155157 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
156158
157159
160+func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
161+
162+
158163 let fca = addressFromStringValue(strf(this, fc()))
159164
160165 let A = strf(this, amp())
161166
162167 func igs () = valueOrElse(getBoolean(fca, aps()), false)
163168
164169
165170 func mp () = fromBase58String(strf(fca, mtpk()))
166171
167172
168173 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
169174
170175 func gpc () = {
171176 let amtAs = strf(this, aa())
172177 let priceAs = strf(this, pa())
173178 let iPriceAs = intf(fca, mba(priceAs))
174179 let iAmtAs = intf(fca, mba(amtAs))
175180 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
176181 }
177182
183+
184+func parseAssetId (input) = if ((input == wavesString))
185+ then unit
186+ else fromBase58String(input)
187+
188+
189+func assetIdToString (input) = if ((input == unit))
190+ then wavesString
191+ else toBase58String(value(input))
192+
193+
194+func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]))
195+
196+
197+let poolConfigParsed = parsePoolConfig(gpc())
198+
199+let $t068297015 = poolConfigParsed
200+
201+let cfgPoolAddress = $t068297015._1
202+
203+let cfgPoolStatus = $t068297015._2
204+
205+let cfgLpAssetId = $t068297015._3
206+
207+let cfgAmountAssetId = $t068297015._4
208+
209+let cfgPriceAssetId = $t068297015._5
210+
211+let cfgAmountAssetDecimals = $t068297015._6
212+
213+let cfgPriceAssetDecimals = $t068297015._7
178214
179215 func gfc () = split(strf(fca, fcfg()), SEP)
180216
181217
182218 let factoryConfig = gfc()
183219
184220 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
185221
186222 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
187223
188224 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
189225
190226 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
191227
192228 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
193229
194230
195231 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
196232
197233
198234 func getAccBalance (assetId) = if ((assetId == "WAVES"))
199235 then wavesBalance(this).available
200236 else assetBalance(this, fromBase58String(assetId))
201237
202238
203239 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
204240
205241
206242 func vad (A1,A2,slippage) = {
207243 let diff = fraction((A1 - A2), scale8BigInt, A2)
208244 let pass = ((slippage - abs(diff)) > zeroBigInt)
209245 if (!(pass))
210246 then throw(("Big slpg: " + toString(diff)))
211247 else $Tuple2(pass, min([A1, A2]))
212248 }
213249
214250
215251 func vd (D1,D0,slpg) = {
216252 let diff = fraction(D0, scale8BigInt, D1)
217253 let fail = (slpg > diff)
218254 if (if (fail)
219255 then true
220256 else (D0 > D1))
221257 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
222258 else fail
223259 }
224260
225261
226262 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
227263 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
228264 let prAsAmtX18 = t1(prAmt, prAssetDcm)
229265 cpbi(prAsAmtX18, amtAsAmtX18)
230266 }
231267
232268
233269 func calcPrices (amAmt,prAmt,lpAmt) = {
234270 let cfg = gpc()
235271 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
236272 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
237273 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
238274 let amAmtX18 = t1(amAmt, amtAsDcm)
239275 let prAmtX18 = t1(prAmt, prAsDcm)
240276 let lpAmtX18 = t1(lpAmt, scale8)
241277 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
242278 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
243279 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
244280 }
245281
246282
247283 func calculatePrices (amAmt,prAmt,lpAmt) = {
248284 let p = calcPrices(amAmt, prAmt, lpAmt)
249285 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
250286 }
251287
252288
253289 func takeFee (amount) = {
254290 let feeAmount = fraction(amount, fee, scale8)
255291 $Tuple2((amount - feeAmount), feeAmount)
256292 }
257293
258294
259295 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
260296 let cfg = gpc()
261297 let lpId = cfg[idxLPAsId]
262298 let amId = cfg[idxAmAsId]
263299 let prId = cfg[idxPrAsId]
264300 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
265301 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
266302 let sts = cfg[idxPoolSt]
267303 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
268304 if ((lpId != pmtAssetId))
269305 then throw("Wrong pmt asset")
270306 else {
271307 let amBalance = getAccBalance(amId)
272308 let amBalanceX18 = t1(amBalance, amDcm)
273309 let prBalance = getAccBalance(prId)
274310 let prBalanceX18 = t1(prBalance, prDcm)
275311 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
276312 let curPrice = f1(curPriceX18, scale8)
277313 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
278314 let lpEmissX18 = t1(lpEmiss, scale8)
279315 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
280316 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
281317 let outAmAmt = f1(outAmAmtX18, amDcm)
282318 let outPrAmt = f1(outPrAmtX18, prDcm)
283319 let state = if ((txId58 == ""))
284320 then nil
285321 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
286322 then unit
287323 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
288324 then unit
289325 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
290326 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
291327 }
292328 }
293329
294330
295331 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
296332 let cfg = gpc()
297333 let lpId = fromBase58String(cfg[idxLPAsId])
298334 let amIdStr = cfg[idxAmAsId]
299335 let prIdStr = cfg[idxPrAsId]
300336 let inAmIdStr = cfg[idxIAmtAsId]
301337 let inPrIdStr = cfg[idxIPriceAsId]
302338 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
303339 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
304340 let sts = cfg[idxPoolSt]
305341 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
306342 let amBalance = if (isEval)
307343 then getAccBalance(amIdStr)
308344 else if (if (isOneAsset)
309345 then (pmtId == amIdStr)
310346 else false)
311347 then (getAccBalance(amIdStr) - pmtAmt)
312348 else if (isOneAsset)
313349 then getAccBalance(amIdStr)
314350 else (getAccBalance(amIdStr) - inAmAmt)
315351 let prBalance = if (isEval)
316352 then getAccBalance(prIdStr)
317353 else if (if (isOneAsset)
318354 then (pmtId == prIdStr)
319355 else false)
320356 then (getAccBalance(prIdStr) - pmtAmt)
321357 else if (isOneAsset)
322358 then getAccBalance(prIdStr)
323359 else (getAccBalance(prIdStr) - inPrAmt)
324360 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
325361 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
326362 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
327363 let amBalanceX18 = t1(amBalance, amtDcm)
328364 let prBalanceX18 = t1(prBalance, priceDcm)
329365 let r = if ((lpEm == 0))
330366 then {
331367 let curPriceX18 = zeroBigInt
332368 let slippageX18 = zeroBigInt
333369 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
334370 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
335371 }
336372 else {
337373 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
338374 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
339375 let slippageX18 = t1(slippage, scale8)
340376 if (if (if (validateSlippage)
341377 then (curPriceX18 != zeroBigInt)
342378 else false)
343379 then (slippageRealX18 > slippageX18)
344380 else false)
345381 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
346382 else {
347383 let lpEmissionX18 = t1(lpEm, scale8)
348384 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
349385 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
350386 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
351387 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
352388 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
353389 let expAmtAssetAmtX18 = expectedAmts._1
354390 let expPriceAssetAmtX18 = expectedAmts._2
355391 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
356392 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
357393 }
358394 }
359395 let calcLpAmt = r._1
360396 let calcAmAssetPmt = r._2
361397 let calcPrAssetPmt = r._3
362398 let curPrice = f1(r._4, scale8)
363399 let slippageCalc = f1(r._5, scale8)
364400 if ((0 >= calcLpAmt))
365401 then throw("LP <= 0")
366402 else {
367403 let emitLpAmt = if (!(emitLp))
368404 then 0
369405 else calcLpAmt
370406 let amDiff = (inAmAmt - calcAmAssetPmt)
371407 let prDiff = (inPrAmt - calcPrAssetPmt)
372- let $t01650916854 = if (if (isOneAsset)
408+ let $t01744617791 = if (if (isOneAsset)
373409 then (pmtId == amIdStr)
374410 else false)
375411 then $Tuple2(pmtAmt, 0)
376412 else if (if (isOneAsset)
377413 then (pmtId == prIdStr)
378414 else false)
379415 then $Tuple2(0, pmtAmt)
380416 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
381- let writeAmAmt = $t01650916854._1
382- let writePrAmt = $t01650916854._2
417+ let writeAmAmt = $t01744617791._1
418+ let writePrAmt = $t01744617791._2
383419 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
384420 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
385421 }
386422 }
387423
388424
389425 func moa (order) = {
390426 let cfg = gpc()
391427 let amtAsId = cfg[idxAmAsId]
392428 let prAsId = cfg[idxPrAsId]
393429 let sts = parseIntValue(cfg[idxPoolSt])
394430 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
395431 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
396432 let accAmtAsBalance = getAccBalance(amtAsId)
397433 let accPrAsBalance = getAccBalance(prAsId)
398434 let curPriceX18 = if ((order.orderType == Buy))
399435 then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
400436 else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
401437 let curPrice = f1(curPriceX18, scale8)
402438 if (if (if (igs())
403439 then true
404440 else (sts == PoolMatcherDis))
405441 then true
406442 else (sts == PoolShutdown))
407443 then throw("Admin blocked")
408444 else {
409445 let orAmtAsset = order.assetPair.amountAsset
410446 let orAmtAsStr = if ((orAmtAsset == unit))
411447 then "WAVES"
412448 else toBase58String(value(orAmtAsset))
413449 let orPrAsset = order.assetPair.priceAsset
414450 let orPrAsStr = if ((orPrAsset == unit))
415451 then "WAVES"
416452 else toBase58String(value(orPrAsset))
417453 if (if ((orAmtAsStr != amtAsId))
418454 then true
419455 else (orPrAsStr != prAsId))
420456 then throw("Wr assets")
421457 else {
422458 let orderPrice = order.price
423459 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
424460 let castOrderPrice = ts(orderPrice, scale8, priceDcm)
425461 let isOrderPriceValid = if ((order.orderType == Buy))
426462 then (curPrice >= castOrderPrice)
427463 else (castOrderPrice >= curPrice)
428464 true
429465 }
430466 }
431467 }
432468
433469
434470 func cg (i) = if ((size(i.payments) != 1))
435471 then throw("1 pmnt exp")
436472 else {
437473 let pmt = value(i.payments[0])
438474 let pmtAssetId = value(pmt.assetId)
439475 let pmtAmt = pmt.amount
440476 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
441477 let outAmAmt = r._1
442478 let outPrAmt = r._2
443479 let sts = parseIntValue(r._9)
444480 let state = r._10
445481 if (if (igs())
446482 then true
447483 else (sts == PoolShutdown))
448484 then throw(("Admin blocked: " + toString(sts)))
449485 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
450486 }
451487
452488
453489 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
454490 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
455491 let sts = parseIntValue(r._8)
456492 if (if (if (igs())
457493 then true
458494 else (sts == PoolPutDis))
459495 then true
460496 else (sts == PoolShutdown))
461497 then throw(("Blocked:" + toString(sts)))
462498 else r
463499 }
464500
465501
466502 func getD (xp) = {
467503 let n = big2
468504 let xp0 = xp[0]
469505 let xp1 = xp[1]
470506 let aPrecision = parseBigIntValue(Amult)
471507 let a = (parseBigIntValue(A) * aPrecision)
472508 let s = (xp0 + xp1)
473509 if ((s == big0))
474510 then big0
475511 else {
476512 let ann = (a * n)
477513 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
478514 let ann_s_aPrecision = ((ann * s) / aPrecision)
479515 let ann_aPrecision = (ann - aPrecision)
480516 let n1 = (n + big1)
481517 func calc (acc,cur) = {
482- let $t02140621426 = acc
483- let d = $t02140621426._1
484- let found = $t02140621426._2
518+ let $t02234322363 = acc
519+ let d = $t02234322363._1
520+ let found = $t02234322363._2
485521 if ((found != unit))
486522 then acc
487523 else {
488524 let dp = (((d * d) * d) / xp0_xp1_n_n)
489525 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
490526 let dDiff = absBigInt((dNext - value(d)))
491527 if ((big1 >= dDiff))
492528 then $Tuple2(dNext, cur)
493529 else $Tuple2(dNext, unit)
494530 }
495531 }
496532
497533 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
498- let $t02184721894 = {
534+ let $t02278422831 = {
499535 let $l = arr
500536 let $s = size($l)
501537 let $acc0 = $Tuple2(s, unit)
502538 func $f0_1 ($a,$i) = if (($i >= $s))
503539 then $a
504540 else calc($a, $l[$i])
505541
506542 func $f0_2 ($a,$i) = if (($i >= $s))
507543 then $a
508544 else throw("List size exceeds 15")
509545
510546 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
511547 }
512- let d = $t02184721894._1
513- let found = $t02184721894._2
548+ let d = $t02278422831._1
549+ let found = $t02278422831._2
514550 if ((found != unit))
515551 then d
516552 else throw(("D calculation error, D = " + toString(d)))
517553 }
518554 }
519555
520556
521557 func getYD (xp,i,D) = {
522558 let n = big2
523559 let x = xp[if ((i == 0))
524560 then 1
525561 else 0]
526562 let aPrecision = parseBigIntValue(Amult)
527563 let a = (parseBigIntValue(A) * aPrecision)
528564 let s = x
529565 let ann = (a * n)
530566 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
531567 let b = ((s + ((D * aPrecision) / ann)) - D)
532568 func calc (acc,cur) = {
533- let $t02239422414 = acc
534- let y = $t02239422414._1
535- let found = $t02239422414._2
569+ let $t02333123351 = acc
570+ let y = $t02333123351._1
571+ let found = $t02333123351._2
536572 if ((found != unit))
537573 then acc
538574 else {
539575 let yNext = (((y * y) + c) / ((big2 * y) + b))
540576 let yDiff = absBigInt((yNext - value(y)))
541577 if ((big1 >= yDiff))
542578 then $Tuple2(yNext, cur)
543579 else $Tuple2(yNext, unit)
544580 }
545581 }
546582
547583 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
548- let $t02272122768 = {
584+ let $t02365823705 = {
549585 let $l = arr
550586 let $s = size($l)
551587 let $acc0 = $Tuple2(D, unit)
552588 func $f0_1 ($a,$i) = if (($i >= $s))
553589 then $a
554590 else calc($a, $l[$i])
555591
556592 func $f0_2 ($a,$i) = if (($i >= $s))
557593 then $a
558594 else throw("List size exceeds 15")
559595
560596 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
561597 }
562- let y = $t02272122768._1
563- let found = $t02272122768._2
598+ let y = $t02365823705._1
599+ let found = $t02365823705._2
564600 if ((found != unit))
565601 then y
566602 else throw(("Y calculation error, Y = " + toString(y)))
567603 }
568604
569605
570606 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId) = {
571607 let poolConfig = gpc()
572608 let amId = poolConfig[idxAmAsId]
573609 let prId = poolConfig[idxPrAsId]
574610 let lpId = poolConfig[idxLPAsId]
575611 let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
576612 let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
577613 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
578614 let chechEmission = if ((lpAssetEmission > big0))
579615 then true
580616 else throw("initial deposit requires all coins")
581617 if ((chechEmission == chechEmission))
582618 then {
583619 let amBalance = getAccBalance(amId)
584620 let prBalance = getAccBalance(prId)
585- let $t02352723989 = if ((txId == ""))
621+ let $t02446424926 = if ((txId == ""))
586622 then $Tuple2(amBalance, prBalance)
587623 else if ((pmtAssetId == amId))
588624 then if ((pmtAmtRaw > amBalance))
589625 then throw("invalid payment amount")
590626 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
591627 else if ((pmtAssetId == prId))
592628 then if ((pmtAmtRaw > prBalance))
593629 then throw("invalid payment amount")
594630 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
595631 else throw("wrong pmtAssetId")
596- let amBalanceOld = $t02352723989._1
597- let prBalanceOld = $t02352723989._2
598- let $t02399524171 = if ((pmtAssetId == amId))
632+ let amBalanceOld = $t02446424926._1
633+ let prBalanceOld = $t02446424926._2
634+ let $t02493225108 = if ((pmtAssetId == amId))
599635 then $Tuple2(pmtAmtRaw, 0)
600636 else if ((pmtAssetId == prId))
601637 then $Tuple2(0, pmtAmtRaw)
602638 else throw("invalid payment")
603- let amAmountRaw = $t02399524171._1
604- let prAmountRaw = $t02399524171._2
639+ let amAmountRaw = $t02493225108._1
640+ let prAmountRaw = $t02493225108._2
605641 let amAmount = takeFee(amAmountRaw)._1
606642 let prAmount = takeFee(prAmountRaw)._1
607643 let feeAmount = takeFee(pmtAmtRaw)._2
608644 let amBalanceNew = (amBalanceOld + amAmount)
609645 let prBalanceNew = (prBalanceOld + prAmount)
610646 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
611647 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
612648 let checkD = if ((D1 > D0))
613649 then true
614650 else throw()
615651 if ((checkD == checkD))
616652 then {
617653 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
618654 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
619655 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId), dataPutActionInfo(amAmountRaw, prAmountRaw, toInt(lpAmount), curPrice, 0, 0, height, lastBlock.timestamp, 0, 0))]
620656 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
621657 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
622658 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
623659 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
624660 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
625661 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
626662 }
627663 else throw("Strict value is not equal to itself.")
628664 }
629665 else throw("Strict value is not equal to itself.")
630666 }
631667
632668
633-func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = if ((size(payments) != 1))
634- then throw("1 pmnt expd")
635- else {
636- let poolConfig = gpc()
637- let lpId = poolConfig[idxLPAsId]
638- let amId = poolConfig[idxAmAsId]
639- let prId = poolConfig[idxPrAsId]
640- let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
641- let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
642- let poolStatus = poolConfig[idxPoolSt]
643- let userAddress = if ((caller == restContract))
644- then originCaller
645- else caller
646- let pmt = value(payments[0])
647- let pmtAssetId = value(pmt.assetId)
648- let pmtAmt = pmt.amount
649- if ((1000000000 > pmtAmt))
650- then throw("Min pmt 10 LP")
651- else {
652- let txId58 = toBase58String(transactionId)
653- if ((lpId != toBase58String(pmtAssetId)))
654- then throw("Wrong LP")
655- else {
656- let amBalance = getAccBalance(amId)
657- let prBalance = getAccBalance(prId)
658- let $t02642226530 = {
659- let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
660- if ($isInstanceOf(@, "(Int, Int)"))
661- then @
662- else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
669+func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
670+ let poolConfig = gpc()
671+ let lpId = poolConfig[idxLPAsId]
672+ let amId = poolConfig[idxAmAsId]
673+ let prId = poolConfig[idxPrAsId]
674+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
675+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
676+ let poolStatus = poolConfig[idxPoolSt]
677+ let userAddress = if ((caller == restContract))
678+ then originCaller
679+ else caller
680+ let pmt = value(payments[0])
681+ let pmtAssetId = value(pmt.assetId)
682+ let pmtAmt = pmt.amount
683+ if ((1000000000 > pmtAmt))
684+ then throw("Min pmt 10 LP")
685+ else {
686+ let txId58 = toBase58String(transactionId)
687+ if ((lpId != toBase58String(pmtAssetId)))
688+ then throw("Wrong LP")
689+ else {
690+ let amBalance = getAccBalance(amId)
691+ let prBalance = getAccBalance(prId)
692+ let $t02730027408 = {
693+ let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
694+ if ($isInstanceOf(@, "(Int, Int)"))
695+ then @
696+ else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
697+ }
698+ let totalGet = $t02730027408._1
699+ let feeAmount = $t02730027408._2
700+ let totalAmount = if (if ((minOutAmount > 0))
701+ then (minOutAmount > totalGet)
702+ else false)
703+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
704+ else totalGet
705+ let $t02759527902 = if ((outAssetId == amId))
706+ then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
707+ else if ((outAssetId == prId))
708+ then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
709+ else throw("invalid out asset id")
710+ let outAm = $t02759527902._1
711+ let outPr = $t02759527902._2
712+ let amBalanceNew = $t02759527902._3
713+ let prBalanceNew = $t02759527902._4
714+ let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
715+ let curPr = f1(curPrX18, scale8)
716+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
717+ then unit
718+ else fromBase58String(outAssetId)
719+ let sendFeeToMatcher = if ((feeAmount > 0))
720+ then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
721+ else nil
722+ let state = ([ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)] ++ sendFeeToMatcher)
723+ if ((state == state))
724+ then {
725+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
726+ if ((burn == burn))
727+ then $Tuple2(state, totalAmount)
728+ else throw("Strict value is not equal to itself.")
663729 }
664- let totalGet = $t02642226530._1
665- let feeAmount = $t02642226530._2
666- let totalAmount = if (if ((minOutAmount > 0))
667- then (minOutAmount > totalGet)
668- else false)
669- then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
670- else totalGet
671- let $t02671727024 = if ((outAssetId == amId))
672- then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
673- else if ((outAssetId == prId))
674- then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
675- else throw("invalid out asset id")
676- let outAm = $t02671727024._1
677- let outPr = $t02671727024._2
678- let amBalanceNew = $t02671727024._3
679- let prBalanceNew = $t02671727024._4
680- let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
681- let curPr = f1(curPrX18, scale8)
682- let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
683- then unit
684- else fromBase58String(outAssetId)
685- let sendFeeToMatcher = if ((feeAmount > 0))
686- then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
687- else nil
688- let state = ([ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)] ++ sendFeeToMatcher)
689- if ((state == state))
690- then {
691- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
692- if ((burn == burn))
693- then $Tuple2(state, totalAmount)
694- else throw("Strict value is not equal to itself.")
695- }
696- else throw("Strict value is not equal to itself.")
697- }
698- }
699- }
730+ else throw("Strict value is not equal to itself.")
731+ }
732+ }
733+ }
700734
701735
702736 func m () = match getString(mpk()) {
703737 case s: String =>
704738 fromBase58String(s)
705739 case _: Unit =>
706740 unit
707741 case _ =>
708742 throw("Match error")
709743 }
710744
711745
712746 func pm () = match getString(pmpk()) {
713747 case s: String =>
714748 fromBase58String(s)
715749 case _: Unit =>
716750 unit
717751 case _ =>
718752 throw("Match error")
719753 }
720754
721755
722756 let pd = throw("Permission denied")
723757
724758 func mm (i) = match m() {
725759 case pk: ByteVector =>
726760 if ((i.callerPublicKey == pk))
727761 then true
728762 else pd
729763 case _: Unit =>
730764 if ((i.caller == this))
731765 then true
732766 else pd
733767 case _ =>
734768 throw("Match error")
735769 }
736770
737771
738772 @Callable(i)
739773 func constructor (fc) = {
740774 let c = mm(i)
741775 if ((c == c))
742776 then [StringEntry(fc(), fc)]
743777 else throw("Strict value is not equal to itself.")
744778 }
745779
746780
747781
748782 @Callable(i)
749783 func setManager (pendingManagerPublicKey) = {
750784 let c = mm(i)
751785 if ((c == c))
752786 then {
753787 let cm = fromBase58String(pendingManagerPublicKey)
754788 if ((cm == cm))
755789 then [StringEntry(pmpk(), pendingManagerPublicKey)]
756790 else throw("Strict value is not equal to itself.")
757791 }
758792 else throw("Strict value is not equal to itself.")
759793 }
760794
761795
762796
763797 @Callable(i)
764798 func confirmManager () = {
765799 let p = pm()
766800 let hpm = if (isDefined(p))
767801 then true
768802 else throw("No pending manager")
769803 if ((hpm == hpm))
770804 then {
771805 let cpm = if ((i.callerPublicKey == value(p)))
772806 then true
773807 else throw("You are not pending manager")
774808 if ((cpm == cpm))
775809 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
776810 else throw("Strict value is not equal to itself.")
777811 }
778812 else throw("Strict value is not equal to itself.")
779813 }
780814
781815
782816
783817 @Callable(i)
784818 func put (slip,autoStake) = {
785819 let factCfg = gfc()
786820 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
787821 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
788822 if ((0 > slip))
789823 then throw("Wrong slippage")
790824 else if ((size(i.payments) != 2))
791825 then throw("2 pmnts expd")
792826 else {
793827 let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, true, 0, "")
794828 let emitLpAmt = e._2
795829 let lpAssetId = e._7
796830 let state = e._9
797831 let amDiff = e._10
798832 let prDiff = e._11
799833 let amId = e._12
800834 let prId = e._13
801835 let r = invoke(fca, "emit", [emitLpAmt], nil)
802836 if ((r == r))
803837 then {
804838 let el = match r {
805839 case legacy: Address =>
806840 invoke(legacy, "emit", [emitLpAmt], nil)
807841 case _ =>
808842 unit
809843 }
810844 if ((el == el))
811845 then {
812846 let sa = if ((amDiff > 0))
813847 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
814848 else nil
815849 if ((sa == sa))
816850 then {
817851 let sp = if ((prDiff > 0))
818852 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
819853 else nil
820854 if ((sp == sp))
821855 then {
822856 let lpTrnsfr = if (autoStake)
823857 then {
824858 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
825859 if ((ss == ss))
826860 then nil
827861 else throw("Strict value is not equal to itself.")
828862 }
829863 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
830864 (state ++ lpTrnsfr)
831865 }
832866 else throw("Strict value is not equal to itself.")
833867 }
834868 else throw("Strict value is not equal to itself.")
835869 }
836870 else throw("Strict value is not equal to itself.")
837871 }
838872 else throw("Strict value is not equal to itself.")
839873 }
840874 }
841875
842876
843877
844878 @Callable(i)
845-func putOneTknV2 (minOutAmount,autoStake) = if ((size(i.payments) != 1))
846- then throw("1 pmnt expd")
847- else {
848- let poolConfig = gpc()
849- let amId = poolConfig[idxAmAsId]
850- let prId = poolConfig[idxPrAsId]
851- let lpId = fromBase58String(poolConfig[idxLPAsId])
852- let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
853- let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
854- let userAddress = if ((i.caller == this))
855- then i.originCaller
856- else i.caller
857- let pmt = value(i.payments[0])
858- let pmtAssetId = toBase58String(value(pmt.assetId))
859- let pmtAmt = pmt.amount
860- if ((10000000 > pmtAmt))
861- then throw("Wrong pmt amt")
862- else {
863- let $t03190132026 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
864- let estimLP = $t03190132026._1
865- let state = $t03190132026._2
866- let feeAmount = $t03190132026._3
867- let emitLpAmt = if (if ((minOutAmount > 0))
868- then (minOutAmount > estimLP)
869- else false)
870- then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
871- else estimLP
872- let e = invoke(fca, "emit", [emitLpAmt], nil)
873- if ((e == e))
874- then {
875- let el = match e {
876- case legacy: Address =>
877- invoke(legacy, "emit", [emitLpAmt], nil)
878- case _ =>
879- unit
880- }
881- if ((el == el))
882- then {
883- let lpTrnsfr = if (autoStake)
884- then {
885- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
886- if ((ss == ss))
887- then nil
888- else throw("Strict value is not equal to itself.")
889- }
890- else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
891- let sendFeeToMatcher = if ((feeAmount > 0))
892- then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
893- else nil
894- $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
895- }
896- else throw("Strict value is not equal to itself.")
897- }
898- else throw("Strict value is not equal to itself.")
899- }
879+func putOneTknV2 (minOutAmount,autoStake) = {
880+ let isPoolOneTokenOperationsDisabled = {
881+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
882+ if ($isInstanceOf(@, "Boolean"))
883+ then @
884+ else throw(($getType(@) + " couldn't be cast to Boolean"))
900885 }
886+ let isPutDisabled = if (if (if (igs())
887+ then true
888+ else (cfgPoolStatus == PoolPutDis))
889+ then true
890+ else (cfgPoolStatus == PoolShutdown))
891+ then true
892+ else isPoolOneTokenOperationsDisabled
893+ let checks = [if (!(isPutDisabled))
894+ then true
895+ else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
896+ then true
897+ else throwErr("exactly 1 payment are expected")]
898+ if ((checks == checks))
899+ then {
900+ let poolConfig = gpc()
901+ let amId = poolConfig[idxAmAsId]
902+ let prId = poolConfig[idxPrAsId]
903+ let lpId = fromBase58String(poolConfig[idxLPAsId])
904+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
905+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
906+ let userAddress = if ((i.caller == this))
907+ then i.originCaller
908+ else i.caller
909+ let pmt = value(i.payments[0])
910+ let pmtAssetId = toBase58String(value(pmt.assetId))
911+ let pmtAmt = pmt.amount
912+ if ((10000000 > pmtAmt))
913+ then throw("Wrong pmt amt")
914+ else {
915+ let $t03315133276 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
916+ let estimLP = $t03315133276._1
917+ let state = $t03315133276._2
918+ let feeAmount = $t03315133276._3
919+ let emitLpAmt = if (if ((minOutAmount > 0))
920+ then (minOutAmount > estimLP)
921+ else false)
922+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
923+ else estimLP
924+ let e = invoke(fca, "emit", [emitLpAmt], nil)
925+ if ((e == e))
926+ then {
927+ let el = match e {
928+ case legacy: Address =>
929+ invoke(legacy, "emit", [emitLpAmt], nil)
930+ case _ =>
931+ unit
932+ }
933+ if ((el == el))
934+ then {
935+ let lpTrnsfr = if (autoStake)
936+ then {
937+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
938+ if ((ss == ss))
939+ then nil
940+ else throw("Strict value is not equal to itself.")
941+ }
942+ else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
943+ let sendFeeToMatcher = if ((feeAmount > 0))
944+ then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
945+ else nil
946+ $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
947+ }
948+ else throw("Strict value is not equal to itself.")
949+ }
950+ else throw("Strict value is not equal to itself.")
951+ }
952+ }
953+ else throw("Strict value is not equal to itself.")
954+ }
901955
902956
903957
904958 @Callable(i)
905959 func putForFree (maxSlpg) = if ((0 > maxSlpg))
906960 then throw("Wrong slpg")
907961 else if ((size(i.payments) != 2))
908962 then throw("2 pmnts expd")
909963 else {
910964 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, true, 0, "")
911965 estPut._9
912966 }
913967
914968
915969
916970 @Callable(i)
917971 func get () = {
918972 let r = cg(i)
919973 let outAmtAmt = r._1
920974 let outPrAmt = r._2
921975 let pmtAmt = r._3
922976 let pmtAssetId = r._4
923977 let state = r._5
924978 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
925979 if ((b == b))
926980 then state
927981 else throw("Strict value is not equal to itself.")
928982 }
929983
930984
931985
932986 @Callable(i)
933987 func getOneTknV2 (outAssetId,minOutAmount) = {
934- let $t03420934364 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
935- let state = $t03420934364._1
936- let totalAmount = $t03420934364._2
937- $Tuple2(state, totalAmount)
988+ let isPoolOneTokenOperationsDisabled = {
989+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
990+ if ($isInstanceOf(@, "Boolean"))
991+ then @
992+ else throw(($getType(@) + " couldn't be cast to Boolean"))
993+ }
994+ let isGetDisabled = if (if (igs())
995+ then true
996+ else (cfgPoolStatus == PoolShutdown))
997+ then true
998+ else isPoolOneTokenOperationsDisabled
999+ let checks = [if (!(isGetDisabled))
1000+ then true
1001+ else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
1002+ then true
1003+ else throwErr("exactly 1 payment are expected")]
1004+ if ((checks == checks))
1005+ then {
1006+ let $t03586236017 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1007+ let state = $t03586236017._1
1008+ let totalAmount = $t03586236017._2
1009+ $Tuple2(state, totalAmount)
1010+ }
1011+ else throw("Strict value is not equal to itself.")
9381012 }
9391013
9401014
9411015
9421016 @Callable(i)
9431017 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
9441018 let poolConfig = gpc()
9451019 let amId = poolConfig[idxAmAsId]
9461020 let prId = poolConfig[idxPrAsId]
9471021 let lpId = poolConfig[idxLPAsId]
9481022 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
9491023 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
9501024 let D0 = getD(xp)
9511025 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
9521026 let index = if ((outAssetId == amId))
9531027 then 0
9541028 else if ((outAssetId == prId))
9551029 then 1
9561030 else throw("invalid out asset id")
9571031 let newY = getYD(xp, index, D1)
9581032 let dy = (xp[index] - newY)
9591033 let totalGetRaw = toInt((dy - big1))
960- let $t03514335192 = takeFee(totalGetRaw)
961- let totalGet = $t03514335192._1
962- let feeAmount = $t03514335192._2
1034+ let $t03679636845 = takeFee(totalGetRaw)
1035+ let totalGet = $t03679636845._1
1036+ let feeAmount = $t03679636845._2
9631037 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
9641038 }
9651039
9661040
9671041
9681042 @Callable(i)
9691043 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
9701044 let poolConfig = gpc()
9711045 let amId = poolConfig[idxAmAsId]
9721046 let prId = poolConfig[idxPrAsId]
9731047 let lpId = poolConfig[idxLPAsId]
9741048 let amBalance = getAccBalance(amId)
9751049 let prBalance = getAccBalance(prId)
976- let $t03553735652 = {
1050+ let $t03719037305 = {
9771051 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
9781052 if ($isInstanceOf(@, "(Int, Int)"))
9791053 then @
9801054 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
9811055 }
982- let totalGet = $t03553735652._1
983- let feeAmount = $t03553735652._2
1056+ let totalGet = $t03719037305._1
1057+ let feeAmount = $t03719037305._2
9841058 let r = ego("", lpId, lpAssetAmount, this)
9851059 let outAmAmt = r._1
9861060 let outPrAmt = r._2
9871061 let sumOfGetAssets = (outAmAmt + outPrAmt)
9881062 let bonus = fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
9891063 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
9901064 }
9911065
9921066
9931067
9941068 @Callable(i)
9951069 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
9961070 let r = cg(i)
9971071 let outAmAmt = r._1
9981072 let outPrAmt = r._2
9991073 let pmtAmt = r._3
10001074 let pmtAssetId = r._4
10011075 let state = r._5
10021076 if ((noLessThenAmtAsset > outAmAmt))
10031077 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
10041078 else if ((noLessThenPriceAsset > outPrAmt))
10051079 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
10061080 else {
10071081 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10081082 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
10091083 then state
10101084 else throw("Strict value is not equal to itself.")
10111085 }
10121086 }
10131087
10141088
10151089
10161090 @Callable(i)
10171091 func unstakeAndGet (amount) = {
10181092 let checkPayments = if ((size(i.payments) != 0))
10191093 then throw("No pmnts expd")
10201094 else true
10211095 if ((checkPayments == checkPayments))
10221096 then {
10231097 let cfg = gpc()
10241098 let factoryCfg = gfc()
10251099 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10261100 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10271101 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
10281102 if ((unstakeInv == unstakeInv))
10291103 then {
10301104 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
10311105 let sts = parseIntValue(r._9)
10321106 let state = r._10
10331107 let v = if (if (igs())
10341108 then true
10351109 else (sts == PoolShutdown))
10361110 then throw(("Blocked: " + toString(sts)))
10371111 else true
10381112 if ((v == v))
10391113 then {
10401114 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
10411115 if ((burnA == burnA))
10421116 then state
10431117 else throw("Strict value is not equal to itself.")
10441118 }
10451119 else throw("Strict value is not equal to itself.")
10461120 }
10471121 else throw("Strict value is not equal to itself.")
10481122 }
10491123 else throw("Strict value is not equal to itself.")
10501124 }
10511125
10521126
10531127
10541128 @Callable(i)
10551129 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
1056- let checkPayments = if ((size(i.payments) != 0))
1057- then throw("No pmnts expd")
1058- else true
1059- if ((checkPayments == checkPayments))
1130+ let isPoolOneTokenOperationsDisabled = {
1131+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
1132+ if ($isInstanceOf(@, "Boolean"))
1133+ then @
1134+ else throw(($getType(@) + " couldn't be cast to Boolean"))
1135+ }
1136+ let isGetDisabled = if (if (igs())
1137+ then true
1138+ else (cfgPoolStatus == PoolShutdown))
1139+ then true
1140+ else isPoolOneTokenOperationsDisabled
1141+ let checks = [if (!(isGetDisabled))
1142+ then true
1143+ else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
1144+ then true
1145+ else throwErr("no payments are expected")]
1146+ if ((checks == checks))
10601147 then {
10611148 let cfg = gpc()
10621149 let factoryCfg = gfc()
10631150 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10641151 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10651152 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10661153 if ((unstakeInv == unstakeInv))
10671154 then {
1068- let $t03795938147 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1069- let state = $t03795938147._1
1070- let totalAmount = $t03795938147._2
1155+ let $t03991740105 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1156+ let state = $t03991740105._1
1157+ let totalAmount = $t03991740105._2
10711158 $Tuple2(state, totalAmount)
10721159 }
10731160 else throw("Strict value is not equal to itself.")
10741161 }
10751162 else throw("Strict value is not equal to itself.")
10761163 }
10771164
10781165
10791166
10801167 @Callable(i)
10811168 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
10821169 let poolConfig = gpc()
10831170 let amId = poolConfig[idxAmAsId]
10841171 let prId = poolConfig[idxPrAsId]
10851172 let lpId = poolConfig[idxLPAsId]
1086- let $t03840638503 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1087- let lpAmount = $t03840638503._1
1088- let state = $t03840638503._2
1089- let feeAmount = $t03840638503._3
1090- let bonus = $t03840638503._4
1173+ let $t04036440461 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1174+ let lpAmount = $t04036440461._1
1175+ let state = $t04036440461._2
1176+ let feeAmount = $t04036440461._3
1177+ let bonus = $t04036440461._4
10911178 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10921179 }
10931180
10941181
10951182
10961183 @Callable(i)
10971184 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
10981185 then throw("denied")
10991186 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
11001187
11011188
11021189
11031190 @Callable(i)
11041191 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
11051192 then pd
11061193 else [StringEntry(k, v)]
11071194
11081195
11091196
11101197 @Callable(i)
11111198 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
11121199 then pd
11131200 else [IntegerEntry(k, v)]
11141201
11151202
11161203
11171204 @Callable(i)
11181205 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
11191206
11201207
11211208
11221209 @Callable(i)
11231210 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
11241211
11251212
11261213
11271214 @Callable(i)
11281215 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
11291216 let pr = calcPrices(amAmt, prAmt, lpAmt)
11301217 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
11311218 }
11321219
11331220
11341221
11351222 @Callable(i)
11361223 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
11371224
11381225
11391226
11401227 @Callable(i)
11411228 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
11421229
11431230
11441231
11451232 @Callable(i)
11461233 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
11471234
11481235
11491236
11501237 @Callable(i)
11511238 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, true, false, 0, ""))
11521239
11531240
11541241
11551242 @Callable(i)
11561243 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
11571244 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
11581245 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
11591246 }
11601247
11611248
11621249
11631250 @Callable(i)
11641251 func getFeeREADONLY () = $Tuple2(nil, fee)
11651252
11661253
11671254 @Verifier(tx)
11681255 func verify () = {
11691256 let targetPublicKey = match m() {
11701257 case pk: ByteVector =>
11711258 pk
11721259 case _: Unit =>
11731260 tx.senderPublicKey
11741261 case _ =>
11751262 throw("Match error")
11761263 }
11771264 match tx {
11781265 case order: Order =>
11791266 let matcherPub = mp()
11801267 let orderValid = moa(order)
11811268 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
11821269 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
11831270 if (if (if (orderValid)
11841271 then senderValid
11851272 else false)
11861273 then matcherValid
11871274 else false)
11881275 then true
11891276 else toe(orderValid, senderValid, matcherValid)
11901277 case s: SetScriptTransaction =>
11911278 let newHash = blake2b256(value(s.script))
11921279 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
11931280 let currentHash = scriptHash(this)
11941281 if (if ((allowedHash == newHash))
11951282 then (currentHash != newHash)
11961283 else false)
11971284 then true
11981285 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
11991286 case _ =>
12001287 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
12011288 }
12021289 }
12031290

github/deemru/w8io/786bc32 
170.52 ms