tx · 9GoN5WYqfBRMpjkSgGDzFnvhcBgAXkEveG1zKU9f2Z4d

3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA:  -0.02800000 Waves

2022.10.17 13:52 [2276275] smart account 3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA > SELF 0.00000000 Waves

{ "type": 13, "id": "9GoN5WYqfBRMpjkSgGDzFnvhcBgAXkEveG1zKU9f2Z4d", "fee": 2800000, "feeAssetId": null, "timestamp": 1666003909210, "version": 1, "sender": "3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA", "senderPublicKey": "35yd3qw1gxKDxKwGAykHN9fANbXNWwseaUwbWDj24o3x", "proofs": [ "3H8zR78o6Jq4JzHzQgSaZYfpA66qZNJuwfKXphyaBkMjWaA1BKaNvSFuqcUPRKHLWn8Mb2nNK9NZEQJvXPabtqmX" ], "script": "base64:BgL7HggCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIECgIIARIECgIIARIECgIBARIDCgEBEgUKAwEIARIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgAiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igp6ZXJvQmlnSW50IgRiaWcwIgRiaWcxIgRiaWcyIgpzbGlwcGFnZTREIgVBbXVsdCIFRGNvbnYiA1NFUCIFRU1QVFkiClBvb2xBY3RpdmUiClBvb2xQdXREaXMiDlBvb2xNYXRjaGVyRGlzIgxQb29sU2h1dGRvd24iDmlkeFBvb2xBZGRyZXNzIglpZHhQb29sU3QiCWlkeExQQXNJZCIJaWR4QW1Bc0lkIglpZHhQckFzSWQiC2lkeEFtdEFzRGNtIg1pZHhQcmljZUFzRGNtIgtpZHhJQW10QXNJZCINaWR4SVByaWNlQXNJZCIPaWR4RmFjdFN0YWtDbnRyIhJpZHhGYWN0b3J5UmVzdENudHIiEGlkeEZhY3RTbGlwcENudHIiEWlkeEZhY3RHd3hSZXdDbnRyIgpmZWVEZWZhdWx0IgJ0MSIHb3JpZ1ZhbCINb3JpZ1NjYWxlTXVsdCICZjEiA3ZhbCIPcmVzdWx0U2NhbGVNdWx0IgJ0cyIDYW10IghyZXNTY2FsZSIIY3VyU2NhbGUiA2FicyIJYWJzQmlnSW50IgJmYyIDbXBrIgRwbXBrIgJwbCICcGgiAWgiAXQiA3BhdSICdWEiBHR4SWQiA2dhdSICYWEiAnBhIgNhbXAiA2FkYSIGa2V5RmVlIgNmZWUiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiA3RvZSIDb3JWIgZzZW5kclYiBm1hdGNoViIDc3RyIgckbWF0Y2gwIgZ2YWxTdHIiBHN0cmYiBGFkZHIiA2tleSIEaW50ZiIDZmNhIgFBIgNpZ3MiAm1wIhNmZWVDb2xsZWN0b3JBZGRyZXNzIgNncGMiBWFtdEFzIgdwcmljZUFzIghpUHJpY2VBcyIDZ2ZjIg1mYWN0b3J5Q29uZmlnIg9zdGFraW5nQ29udHJhY3QiD3NsaXBhZ2VDb250cmFjdCILZ3d4Q29udHJhY3QiDHJlc3RDb250cmFjdCIRZGF0YVB1dEFjdGlvbkluZm8iDWluQW10QXNzZXRBbXQiD2luUHJpY2VBc3NldEFtdCIIb3V0THBBbXQiBXByaWNlIgpzbGlwQnlVc2VyIgxzbGlwcGFnZVJlYWwiCHR4SGVpZ2h0Igt0eFRpbWVzdGFtcCIMc2xpcGFnZUFtQW10IgxzbGlwYWdlUHJBbXQiEWRhdGFHZXRBY3Rpb25JbmZvIg5vdXRBbXRBc3NldEFtdCIQb3V0UHJpY2VBc3NldEFtdCIHaW5McEFtdCINZ2V0QWNjQmFsYW5jZSIHYXNzZXRJZCIEY3BiaSIIcHJBbXRYMTgiCGFtQW10WDE4IgN2YWQiAkExIgJBMiIIc2xpcHBhZ2UiBGRpZmYiBHBhc3MiAnZkIgJEMSICRDAiBHNscGciBGZhaWwiA3BjcCIKYW1Bc3NldERjbSIKcHJBc3NldERjbSIFYW1BbXQiBXByQW10IgthbXRBc0FtdFgxOCIKcHJBc0FtdFgxOCIKY2FsY1ByaWNlcyIFbHBBbXQiA2NmZyIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIgd0YWtlRmVlIgZhbW91bnQiCWZlZUFtb3VudCIDZWdvIgZ0eElkNTgiCnBtdEFzc2V0SWQiCHBtdExwQW10Igt1c2VyQWRkcmVzcyIEbHBJZCIEYW1JZCIEcHJJZCIFYW1EY20iBXByRGNtIgNzdHMiB2xwRW1pc3MiCWFtQmFsYW5jZSIMYW1CYWxhbmNlWDE4IglwckJhbGFuY2UiDHByQmFsYW5jZVgxOCILY3VyUHJpY2VYMTgiCGN1clByaWNlIgtwbXRMcEFtdFgxOCIKbHBFbWlzc1gxOCILb3V0QW1BbXRYMTgiC291dFByQW10WDE4IghvdXRBbUFtdCIIb3V0UHJBbXQiBXN0YXRlIgNlcG8iB2luQW1BbXQiBmluQW1JZCIHaW5QckFtdCIGaW5QcklkIgZpc0V2YWwiBmVtaXRMcCIKaXNPbmVBc3NldCIQdmFsaWRhdGVTbGlwcGFnZSIGcG10QW10IgVwbXRJZCIHYW1JZFN0ciIHcHJJZFN0ciIJaW5BbUlkU3RyIglpblBySWRTdHIiBmFtdERjbSIIcHJpY2VEY20iBGxwRW0iD2luQW1Bc3NldEFtdFgxOCIPaW5QckFzc2V0QW10WDE4Igx1c2VyUHJpY2VYMTgiAXIiC3NsaXBwYWdlWDE4Ig9zbGlwcGFnZVJlYWxYMTgiDWxwRW1pc3Npb25YMTgiCnByVmlhQW1YMTgiCmFtVmlhUHJYMTgiDGV4cGVjdGVkQW10cyIRZXhwQW10QXNzZXRBbXRYMTgiE2V4cFByaWNlQXNzZXRBbXRYMTgiCWNhbGNMcEFtdCIOY2FsY0FtQXNzZXRQbXQiDmNhbGNQckFzc2V0UG10IgxzbGlwcGFnZUNhbGMiCWVtaXRMcEFtdCIGYW1EaWZmIgZwckRpZmYiDSR0MDE2NTA5MTY4NTQiCndyaXRlQW1BbXQiCndyaXRlUHJBbXQiC2NvbW1vblN0YXRlIgNtb2EiBW9yZGVyIgdhbXRBc0lkIgZwckFzSWQiD2FjY0FtdEFzQmFsYW5jZSIOYWNjUHJBc0JhbGFuY2UiCm9yQW10QXNzZXQiCm9yQW10QXNTdHIiCW9yUHJBc3NldCIJb3JQckFzU3RyIgpvcmRlclByaWNlIg5jYXN0T3JkZXJQcmljZSIRaXNPcmRlclByaWNlVmFsaWQiAmNnIgFpIgNwbXQiAmNwIgZjYWxsZXIiB2FtQXNQbXQiB3ByQXNQbXQiBGdldEQiAnhwIgFuIgN4cDAiA3hwMSIKYVByZWNpc2lvbiIBYSIBcyIDYW5uIgt4cDBfeHAxX25fbiIQYW5uX3NfYVByZWNpc2lvbiIOYW5uX2FQcmVjaXNpb24iAm4xIgRjYWxjIgNhY2MiA2N1ciINJHQwMjE0MDYyMTQyNiIBZCIFZm91bmQiAmRwIgVkTmV4dCIFZERpZmYiA2FyciINJHQwMjE4NDcyMTg5NCICJGwiAiRzIgUkYWNjMCIFJGYwXzEiAiRhIgIkaSIFJGYwXzIiBWdldFlEIgFEIgF4IgFjIgFiIg0kdDAyMjM5NDIyNDE0IgF5IgV5TmV4dCIFeURpZmYiDSR0MDIyNzIxMjI3NjgiDWNhbGNQdXRPbmVUa24iCXBtdEFtdFJhdyIKcG9vbENvbmZpZyIPbHBBc3NldEVtaXNzaW9uIg1jaGVjaEVtaXNzaW9uIg0kdDAyMzUyNzIzOTg5IgxhbUJhbGFuY2VPbGQiDHByQmFsYW5jZU9sZCINJHQwMjM5OTUyNDE3MSILYW1BbW91bnRSYXciC3ByQW1vdW50UmF3IghhbUFtb3VudCIIcHJBbW91bnQiDGFtQmFsYW5jZU5ldyIMcHJCYWxhbmNlTmV3IgZjaGVja0QiCGxwQW1vdW50Ig5wb29sUHJvcG9ydGlvbiIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIJbHBBbXRCb3RoIgVib251cyITZ2V0T25lVGtuVjJJbnRlcm5hbCIKb3V0QXNzZXRJZCIMbWluT3V0QW1vdW50IghwYXltZW50cyIMb3JpZ2luQ2FsbGVyIg10cmFuc2FjdGlvbklkIgphbURlY2ltYWxzIgpwckRlY2ltYWxzIgpwb29sU3RhdHVzIg0kdDAyNjQyMjI2NTMwIgFAIgh0b3RhbEdldCILdG90YWxBbW91bnQiDSR0MDI2NzE3MjcwMjQiBW91dEFtIgVvdXRQciIIY3VyUHJYMTgiBWN1clByIhFvdXRBc3NldElkT3JXYXZlcyIQc2VuZEZlZVRvTWF0Y2hlciIEYnVybiIBbSICcG0iAnBkIgJtbSICcGsiF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5IgJjbSIDaHBtIgNjcG0iBHNsaXAiCWF1dG9TdGFrZSIHZmFjdENmZyILc3Rha2luZ0NudHIiCHNsaXBDbnRyIgFlIglscEFzc2V0SWQiAmVsIgZsZWdhY3kiAnNhIgJzcCIIbHBUcm5zZnIiAnNzIg0kdDAzMTkwMTMyMDI2Igdlc3RpbUxQIgdtYXhTbHBnIgZlc3RQdXQiCW91dEFtdEFtdCINJHQwMzQyMDkzNDM2NCINbHBBc3NldEFtb3VudCIKbHBFbWlzc2lvbiIFaW5kZXgiBG5ld1kiAmR5Igt0b3RhbEdldFJhdyINJHQwMzUxNDMzNTE5MiINJHQwMzU1MzczNTY1MiIOc3VtT2ZHZXRBc3NldHMiEm5vTGVzc1RoZW5BbXRBc3NldCIUbm9MZXNzVGhlblByaWNlQXNzZXQiFGJ1cm5MUEFzc2V0T25GYWN0b3J5Ig1jaGVja1BheW1lbnRzIgpmYWN0b3J5Q2ZnIgdzdGFraW5nIgp1bnN0YWtlSW52IgF2IgVidXJuQSINdW5zdGFrZUFtb3VudCINJHQwMzc5NTkzODE0NyIQcGF5bWVudEFtb3VudFJhdyIOcGF5bWVudEFzc2V0SWQiDSR0MDM4NDA2Mzg1MDMiCGFtdEFzU3RyIgdwckFzU3RyIgFrIgJwciIMcmVzU2NhbGVNdWx0Igd1c3JBZGRyIgdwbXRBc0lkIgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXkiCm1hdGNoZXJQdWIiCm9yZGVyVmFsaWQiC3NlbmRlclZhbGlkIgxtYXRjaGVyVmFsaWQiB25ld0hhc2giC2FsbG93ZWRIYXNoIgtjdXJyZW50SGFzaF4AAWEAgMLXLwABYgkAtgIBAIDC1y8AAWMJALYCAQCAgJC7utat8A0AAWQJALYCAQAAAAFlCQC2AgEAAAABZgkAtgIBAAEAAWcJALYCAQACAAFoCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABaQIDMTAwAAFqAgExAAFrAgJfXwABbAIAAAFtAAEAAW4AAgABbwADAAFwAAQAAXEAAQABcgACAAFzAAMAAXQABAABdQAFAAF2AAYAAXcABwABeAAIAAF5AAkAAXoAAQABQQAGAAFCAAcAAUMACgABRAkAawMABQUBYQCQTgEBRQIBRgFHCQC8AgMJALYCAQUBRgUBYwkAtgIBBQFHAQFIAgFJAUoJAKADAQkAvAIDBQFJCQC2AgEFAUoFAWMBAUsDAUwBTQFOCQBrAwUBTAUBTQUBTgEBTwEBSQMJAL8CAgUBZAUBSQkAvgIBBQFJBQFJAQFQAQFJAwkAvwICBQFkBQFJCQC+AgEFAUkFAUkBAVEAAhMlc19fZmFjdG9yeUNvbnRyYWN0AQFSAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAVMAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBAVQAAhElcyVzX19wcmljZV9fbGFzdAEBVQIBVgFXCQC5CQIJAMwIAgIYJXMlcyVkJWRfX3ByaWNlX19oaXN0b3J5CQDMCAIJAKQDAQUBVgkAzAgCCQCkAwEFAVcFA25pbAUBawEBWAIBWQFaCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUBWQICX18FAVoBAmFhAgFZAVoJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQFZAgJfXwUBWgECYWIAAg8lc19fYW1vdW50QXNzZXQBAmFjAAIOJXNfX3ByaWNlQXNzZXQBAmFkAAIHJXNfX2FtcAECYWUAAg0lc19fYWRkb25BZGRyAAJhZgIHJXNfX2ZlZQACYWcJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWYFAUQBAmFoAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFpAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhagICYWsCYWwJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFrAgJfXwUCYWwCCF9fY29uZmlnAQJhbQECYW4JAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYW4BAmFvAAIMJXNfX3NodXRkb3duAQJhcAACHSVzX19hbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAQJhcQACFyVzX19mZWVDb2xsZWN0b3JBZGRyZXNzAQJhcgMCYXMCYXQCYXUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIRRmFpbGVkOiBvcmRWYWxpZD0JAKUDAQUCYXMCCyBzbmRyVmFsaWQ9CQClAwEFAmF0AgwgbXRjaHJWYWxpZD0JAKUDAQUCYXUBAmF2AQFJBAJhdwUBSQMJAAECBQJhdwIGU3RyaW5nBAJheAUCYXcFAmF4CQACAQITZmFpbCBjYXN0IHRvIFN0cmluZwECYXkCAmF6AmFBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYXoFAmFBCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF6CQDMCAICAS4JAMwIAgUCYUEJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUICAmF6AmFBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYXoFAmFBCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF6CQDMCAICAS4JAMwIAgUCYUEJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAACYUMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJheQIFBHRoaXMJAQFRAAACYUQJAQJheQIFBHRoaXMJAQJhZAABAmFFAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhQwkBAmFvAAcBAmFGAAkA2QQBCQECYXkCBQJhQwkBAmFpAAACYUcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJheQIFAmFDCQECYXEAAQJhSAAEAmFJCQECYXkCBQR0aGlzCQECYWIABAJhSgkBAmF5AgUEdGhpcwkBAmFjAAQCYUsJAQJhQgIFAmFDCQECYW0BBQJhSgQCYWsJAQJhQgIFAmFDCQECYW0BBQJhSQkAtQkCCQECYXkCBQJhQwkBAmFqAgkApAMBBQJhawkApAMBBQJhSwUBawECYUwACQC1CQIJAQJheQIFAmFDCQECYWgABQFrAAJhTQkBAmFMAAACYU4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFNBQF6AiBJbnZhbGlkIHN0YWtpbmcgY29udHJhY3QgYWRkcmVzcwACYU8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFNBQFCAiBJbnZhbGlkIHNsaXBhZ2UgY29udHJhY3QgYWRkcmVzcwACYVAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmFNBQFDAhxJbnZhbGlkIGd3eCBjb250cmFjdCBhZGRyZXNzAAJhUQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYU0FAUECHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MBAmFSCgJhUwJhVAJhVQJhVgJhVwJhWAJhWQJhWgJiYQJiYgkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYVMJAMwIAgkApAMBBQJhVAkAzAgCCQCkAwEFAmFVCQDMCAIJAKQDAQUCYVYJAMwIAgkApAMBBQJhVwkAzAgCCQCkAwEFAmFYCQDMCAIJAKQDAQUCYVkJAMwIAgkApAMBBQJhWgkAzAgCCQCkAwEFAmJhCQDMCAIJAKQDAQUCYmIFA25pbAUBawECYmMGAmJkAmJlAmJmAmFWAmFZAmFaCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYmQJAMwIAgkApAMBBQJiZQkAzAgCCQCkAwEFAmJmCQDMCAIJAKQDAQUCYVYJAMwIAgkApAMBBQJhWQkAzAgCCQCkAwEFAmFaBQNuaWwFAWsBAmJnAQJiaAMJAAACBQJiaAIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCYmgBAmJpAgJiagJiawkAvAIDBQJiagUBYwUCYmsBAmJsAwJibQJibgJibwQCYnAJALwCAwkAuAICBQJibQUCYm4FAWIFAmJuBAJicQkAvwICCQC4AgIFAmJvCQEBTwEFAmJwBQFkAwkBASEBBQJicQkAAgEJAKwCAgIKQmlnIHNscGc6IAkApgMBBQJicAkAlAoCBQJicQkAmQMBCQDMCAIFAmJtCQDMCAIFAmJuBQNuaWwBAmJyAwJicwJidAJidQQCYnAJALwCAwUCYnQFAWIFAmJzBAJidgkAvwICBQJidQUCYnADAwUCYnYGCQC/AgIFAmJ0BQJicwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKYDAQUCYnQCASAJAKYDAQUCYnMCASAJAKYDAQUCYnACASAJAKYDAQUCYnUFAmJ2AQJidwQCYngCYnkCYnoCYkEEAmJCCQEBRQIFAmJ6BQJieAQCYkMJAQFFAgUCYkEFAmJ5CQECYmkCBQJiQwUCYkIBAmJEAwJiegJiQQJiRQQCYkYJAQJhSAAEAmJHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXYEAmJICQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXcEAmJJCQECYncEBQJiRwUCYkgFAmJ6BQJiQQQCYmsJAQFFAgUCYnoFAmJHBAJiagkBAUUCBQJiQQUCYkgEAmJKCQEBRQIFAmJFBQFhBAJiSwkBAmJpAgUCYmsFAmJKBAJiTAkBAmJpAgUCYmoFAmJKCQDMCAIFAmJJCQDMCAIFAmJLCQDMCAIFAmJMBQNuaWwBAmJNAwJiegJiQQJiRQQCYk4JAQJiRAMFAmJ6BQJiQQUCYkUJAMwIAgkBAUgCCQCRAwIFAmJOAAAFAWEJAMwIAgkBAUgCCQCRAwIFAmJOAAEFAWEJAMwIAgkBAUgCCQCRAwIFAmJOAAIFAWEFA25pbAECYk8BAmJQBAJiUQkAawMFAmJQBQJhZwUBYQkAlAoCCQBlAgUCYlAFAmJRBQJiUQECYlIEAmJTAmJUAmJVAmJWBAJiRgkBAmFIAAQCYlcJAJEDAgUCYkYFAXMEAmJYCQCRAwIFAmJGBQF0BAJiWQkAkQMCBQJiRgUBdQQCYloJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdgQCY2EJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdwQCY2IJAJEDAgUCYkYFAXIEAmNjCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCYlcCC1dyb25nIExQIGlkCHF1YW50aXR5AwkBAiE9AgUCYlcFAmJUCQACAQIPV3JvbmcgcG10IGFzc2V0BAJjZAkBAmJnAQUCYlgEAmNlCQEBRQIFAmNkBQJiWgQCY2YJAQJiZwEFAmJZBAJjZwkBAUUCBQJjZgUCY2EEAmNoCQECYmkCBQJjZwUCY2UEAmNpCQEBSAIFAmNoBQFhBAJjagkBAUUCBQJiVQUBYQQCY2sJAQFFAgUCY2MFAWEEAmNsCQC8AgMFAmNlBQJjagUCY2sEAmNtCQC8AgMFAmNnBQJjagUCY2sEAmNuCQEBSAIFAmNsBQJiWgQCY28JAQFIAgUCY20FAmNhBAJjcAMJAAACBQJiUwIABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYlYFAmNuAwkAAAIFAmJYAgVXQVZFUwUEdW5pdAkA2QQBBQJiWAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiVgUCY28DCQAAAgUCYlkCBVdBVkVTBQR1bml0CQDZBAEFAmJZCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIJAKUIAQUCYlYFAmJTCQECYmMGBQJjbgUCY28FAmJVBQJjaQUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVQABQJjaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjaQUDbmlsCQCcCgoFAmNuBQJjbwUCYlgFAmJZBQJjZAUCY2YFAmNjBQJjaAUCY2IFAmNwAQJjcQ0CYlMCYm8CY3ICY3MCY3QCY3UCYlYCY3YCY3cCY3gCY3kCY3oCY0EEAmJGCQECYUgABAJiVwkA2QQBCQCRAwIFAmJGBQFzBAJjQgkAkQMCBQJiRgUBdAQCY0MJAJEDAgUCYkYFAXUEAmNECQCRAwIFAmJGBQF4BAJjRQkAkQMCBQJiRgUBeQQCY0YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdgQCY0cJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiRgUBdwQCY2IJAJEDAgUCYkYFAXIEAmNICAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmJXAghXciBscCBhcwhxdWFudGl0eQQCY2QDBQJjdgkBAmJnAQUCY0IDAwUCY3gJAAACBQJjQQUCY0IHCQBlAgkBAmJnAQUCY0IFAmN6AwUCY3gJAQJiZwEFAmNCCQBlAgkBAmJnAQUCY0IFAmNyBAJjZgMFAmN2CQECYmcBBQJjQwMDBQJjeAkAAAIFAmNBBQJjQwcJAGUCCQECYmcBBQJjQwUCY3oDBQJjeAkBAmJnAQUCY0MJAGUCCQECYmcBBQJjQwUCY3QEAmNJCQEBRQIFAmNyBQJjRgQCY0oJAQFFAgUCY3QFAmNHBAJjSwkBAmJpAgUCY0oFAmNJBAJjZQkBAUUCBQJjZAUCY0YEAmNnCQEBRQIFAmNmBQJjRwQCY0wDCQAAAgUCY0gAAAQCY2gFAWQEAmNNBQFkBAJiSgkAdgYJALkCAgUCY0kFAmNKAAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEBSAIFAmJKBQFhCQEBSAIFAmNJBQJjRgkBAUgCBQJjSgUCY0cJAQJiaQIJALcCAgUCY2cFAmNKCQC3AgIFAmNlBQJjSQUCY00EAmNoCQECYmkCBQJjZwUCY2UEAmNOCQC8AgMJAQFPAQkAuAICBQJjaAUCY0sFAWMFAmNoBAJjTQkBAUUCBQJibwUBYQMDAwUCY3kJAQIhPQIFAmNoBQFkBwkAvwICBQJjTgUCY00HCQACAQkArAICCQCsAgIJAKwCAgIPUHJpY2Ugc2xpcHBhZ2UgCQCmAwEFAmNOAgMgPiAJAKYDAQUCY00EAmNPCQEBRQIFAmNIBQFhBAJjUAkAvAIDBQJjSQUCY2gFAWMEAmNRCQC8AgMFAmNKBQFjBQJjaAQCY1IDCQC/AgIFAmNQBQJjSgkAlAoCBQJjUQUCY0oJAJQKAgUCY0kFAmNQBAJjUwgFAmNSAl8xBAJjVAgFAmNSAl8yBAJiSgkAvAIDBQJjTwUCY1QFAmNnCQCXCgUJAQFIAgUCYkoFAWEJAQFIAgUCY1MFAmNGCQEBSAIFAmNUBQJjRwUCY2gFAmNNBAJjVQgFAmNMAl8xBAJjVggFAmNMAl8yBAJjVwgFAmNMAl8zBAJjaQkBAUgCCAUCY0wCXzQFAWEEAmNYCQEBSAIIBQJjTAJfNQUBYQMJAGcCAAAFAmNVCQACAQIHTFAgPD0gMAQCY1kDCQEBIQEFAmN3AAAFAmNVBAJjWgkAZQIFAmNyBQJjVgQCZGEJAGUCBQJjdAUCY1cEAmRiAwMFAmN4CQAAAgUCY0EFAmNCBwkAlAoCBQJjegAAAwMFAmN4CQAAAgUCY0EFAmNDBwkAlAoCAAAFAmN6CQCUCgIFAmNWBQJjVwQCZGMIBQJkYgJfMQQCZGQIBQJkYgJfMgQCZGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFUAAUCY2kJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFVAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY2kJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVgCBQJiVgUCYlMJAQJhUgoFAmRjBQJkZAUCY1kFAmNpBQJibwUCY1gFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNaBQJkYQUDbmlsCQCfCg0FAmNVBQJjWQUCY2kFAmNkBQJjZgUCY0gFAmJXBQJjYgUCZGUFAmNaBQJkYQUCY3MFAmN1AQJkZgECZGcEAmJGCQECYUgABAJkaAkAkQMCBQJiRgUBdAQCZGkJAJEDAgUCYkYFAXUEAmNiCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXIEAmJHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXYEAmJICQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYkYFAXcEAmRqCQECYmcBBQJkaAQCZGsJAQJiZwEFAmRpBAJjaAMJAAACCAUCZGcJb3JkZXJUeXBlBQNCdXkJAQJidwQFAmJHBQJiSAkAZAIFAmRqCAUCZGcGYW1vdW50BQJkawkBAmJ3BAUCYkcFAmJICQBlAgUCZGoIBQJkZwZhbW91bnQFAmRrBAJjaQkBAUgCBQJjaAUBYQMDAwkBAmFFAAYJAAACBQJjYgUBbwYJAAACBQJjYgUBcAkAAgECDUFkbWluIGJsb2NrZWQEAmRsCAgFAmRnCWFzc2V0UGFpcgthbW91bnRBc3NldAQCZG0DCQAAAgUCZGwFBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRsBAJkbggIBQJkZwlhc3NldFBhaXIKcHJpY2VBc3NldAQCZG8DCQAAAgUCZG4FBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRuAwMJAQIhPQIFAmRtBQJkaAYJAQIhPQIFAmRvBQJkaQkAAgECCVdyIGFzc2V0cwQCZHAIBQJkZwVwcmljZQQCY0cJAGsDBQFhBQJiSAUCYkcEAmRxCQEBSwMFAmRwBQFhBQJjRwQCZHIDCQAAAggFAmRnCW9yZGVyVHlwZQUDQnV5CQBnAgUCY2kFAmRxCQBnAgUCZHEFAmNpBgECZHMBAmR0AwkBAiE9AgkAkAMBCAUCZHQIcGF5bWVudHMAAQkAAgECCjEgcG1udCBleHAEAmR1CQEFdmFsdWUBCQCRAwIIBQJkdAhwYXltZW50cwAABAJiVAkBBXZhbHVlAQgFAmR1B2Fzc2V0SWQEAmN6CAUCZHUGYW1vdW50BAJjTAkBAmJSBAkA2AQBCAUCZHQNdHJhbnNhY3Rpb25JZAkA2AQBBQJiVAUCY3oIBQJkdAZjYWxsZXIEAmNuCAUCY0wCXzEEAmNvCAUCY0wCXzIEAmNiCQENcGFyc2VJbnRWYWx1ZQEIBQJjTAJfOQQCY3AIBQJjTANfMTADAwkBAmFFAAYJAAACBQJjYgUBcAkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmNiCQCXCgUFAmNuBQJjbwUCY3oFAmJUBQJjcAECZHYKAmR3AVoCZHgCZHkCYm8CY3cCY3gCY3kCY3oCY0EEAmNMCQECY3ENBQFaBQJibwgJAQV2YWx1ZQEFAmR4BmFtb3VudAgJAQV2YWx1ZQEFAmR4B2Fzc2V0SWQICQEFdmFsdWUBBQJkeQZhbW91bnQICQEFdmFsdWUBBQJkeQdhc3NldElkBQJkdwkAAAIFAVoCAAUCY3cFAmN4BQJjeQUCY3oFAmNBBAJjYgkBDXBhcnNlSW50VmFsdWUBCAUCY0wCXzgDAwMJAQJhRQAGCQAAAgUCY2IFAW4GCQAAAgUCY2IFAXAJAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFAmNiBQJjTAECZHoBAmRBBAJkQgUBZwQCZEMJAJEDAgUCZEEAAAQCZEQJAJEDAgUCZEEAAQQCZEUJAKcDAQUBaQQCZEYJALkCAgkApwMBBQJhRAUCZEUEAmRHCQC3AgIFAmRDBQJkRAMJAAACBQJkRwUBZQUBZQQCZEgJALkCAgUCZEYFAmRCBAJkSQkAuQICCQC5AgIJALkCAgUCZEMFAmREBQJkQgUCZEIEAmRKCQC6AgIJALkCAgUCZEgFAmRHBQJkRQQCZEsJALgCAgUCZEgFAmRFBAJkTAkAtwICBQJkQgUBZgoBAmRNAgJkTgJkTwQCZFAFAmROBAJkUQgFAmRQAl8xBAJkUggFAmRQAl8yAwkBAiE9AgUCZFIFBHVuaXQFAmROBAJkUwkAugICCQC5AgIJALkCAgUCZFEFAmRRBQJkUQUCZEkEAmRUCQC6AgIJALkCAgkAtwICBQJkSgkAuQICBQJkUwUCZEIFAmRRCQC3AgIJALoCAgkAuQICBQJkSwUCZFEFAmRFCQC5AgIFAmRMBQJkUwQCZFUJAQFQAQkAuAICBQJkVAkBBXZhbHVlAQUCZFEDCQDAAgIFAWYFAmRVCQCUCgIFAmRUBQJkTwkAlAoCBQJkVAUEdW5pdAQCZFYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZFcKAAJkWAUCZFYKAAJkWQkAkAMBBQJkWAoAAmRaCQCUCgIFAmRHBQR1bml0CgECZWECAmViAmVjAwkAZwIFAmVjBQJkWQUCZWIJAQJkTQIFAmViCQCRAwIFAmRYBQJlYwoBAmVkAgJlYgJlYwMJAGcCBQJlYwUCZFkFAmViCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJlZAIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIJAQJlYQIFAmRaAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmRRCAUCZFcCXzEEAmRSCAUCZFcCXzIDCQECIT0CBQJkUgUEdW5pdAUCZFEJAAIBCQCsAgICGUQgY2FsY3VsYXRpb24gZXJyb3IsIEQgPSAJAKYDAQUCZFEBAmVlAwJkQQJkdAJlZgQCZEIFAWcEAmVnCQCRAwIFAmRBAwkAAAIFAmR0AAAAAQAABAJkRQkApwMBBQFpBAJkRgkAuQICCQCnAwEFAmFEBQJkRQQCZEcFAmVnBAJkSAkAuQICBQJkRgUCZEIEAmVoCQC6AgIJALkCAgkAuQICCQC6AgIJALkCAgUCZWYFAmVmCQC5AgIFAmVnBQJkQgUCZWYFAmRFCQC5AgIFAmRIBQJkQgQCZWkJALgCAgkAtwICBQJkRwkAugICCQC5AgIFAmVmBQJkRQUCZEgFAmVmCgECZE0CAmROAmRPBAJlagUCZE4EAmVrCAUCZWoCXzEEAmRSCAUCZWoCXzIDCQECIT0CBQJkUgUEdW5pdAUCZE4EAmVsCQC6AgIJALcCAgkAuQICBQJlawUCZWsFAmVoCQC3AgIJALkCAgUBZwUCZWsFAmVpBAJlbQkBAVABCQC4AgIFAmVsCQEFdmFsdWUBBQJlawMJAMACAgUBZgUCZW0JAJQKAgUCZWwFAmRPCQCUCgIFAmVsBQR1bml0BAJkVgkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlbgoAAmRYBQJkVgoAAmRZCQCQAwEFAmRYCgACZFoJAJQKAgUCZWYFBHVuaXQKAQJlYQICZWICZWMDCQBnAgUCZWMFAmRZBQJlYgkBAmRNAgUCZWIJAJEDAgUCZFgFAmVjCgECZWQCAmViAmVjAwkAZwIFAmVjBQJkWQUCZWIJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmVkAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgkBAmVhAgUCZFoAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZWsIBQJlbgJfMQQCZFIIBQJlbgJfMgMJAQIhPQIFAmRSBQR1bml0BQJlawkAAgEJAKwCAgIZWSBjYWxjdWxhdGlvbiBlcnJvciwgWSA9IAkApgMBBQJlawECZW8EAmVwAmJUAmJWAVoEAmVxCQECYUgABAJiWAkAkQMCBQJlcQUBdAQCYlkJAJEDAgUCZXEFAXUEAmJXCQCRAwIFAmVxBQFzBAJjRgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVxBQF2BAJjRwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmVxBQF3BAJlcgkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCYlcCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmVzAwkAvwICBQJlcgUBZQYJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFAmVzBQJlcwQCY2QJAQJiZwEFAmJYBAJjZgkBAmJnAQUCYlkEAmV0AwkAAAIFAVoCAAkAlAoCBQJjZAUCY2YDCQAAAgUCYlQFAmJYAwkAZgIFAmVwBQJjZAkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJQKAgkAZQIFAmNkBQJlcAUCY2YDCQAAAgUCYlQFAmJZAwkAZgIFAmVwBQJjZgkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJQKAgUCY2QJAGUCBQJjZgUCZXAJAAIBAhB3cm9uZyBwbXRBc3NldElkBAJldQgFAmV0Al8xBAJldggFAmV0Al8yBAJldwMJAAACBQJiVAUCYlgJAJQKAgUCZXAAAAMJAAACBQJiVAUCYlkJAJQKAgAABQJlcAkAAgECD2ludmFsaWQgcGF5bWVudAQCZXgIBQJldwJfMQQCZXkIBQJldwJfMgQCZXoICQECYk8BBQJleAJfMQQCZUEICQECYk8BBQJleQJfMQQCYlEICQECYk8BBQJlcAJfMgQCZUIJAGQCBQJldQUCZXoEAmVDCQBkAgUCZXYFAmVBBAJidAkBAmR6AQkAzAgCCQC2AgEFAmV1CQDMCAIJALYCAQUCZXYFA25pbAQCYnMJAQJkegEJAMwIAgkAtgIBBQJlQgkAzAgCCQC2AgEFAmVDBQNuaWwEAmVEAwkAvwICBQJicwUCYnQGCQEFdGhyb3cAAwkAAAIFAmVEBQJlRAQCZUUJALwCAwUCZXIJALgCAgUCYnMFAmJ0BQJidAQCY2kJAQFIAgkBAmJpAgkBAUUCBQJlQwUCY0cJAQFFAgUCZUIFAmNGBQFhBAJkZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVQABQJjaQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjaQkAzAgCCQELU3RyaW5nRW50cnkCCQEBWAIFAmJWBQFaCQECYVIKBQJleAUCZXkJAKADAQUCZUUFAmNpAAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQCZUYJAGsDBQJldgUBYQUCZXUEAmVHCQBrAwUCZXAFAWEJAGQCBQJlRgUBYQQCZUgJAGUCBQJlcAUCZUcEAmVJCQC8AgMFAmVyCQC2AgEFAmVICQC2AgEFAmV2BAJlSgkAoAMBCQC8AgMJALgCAgUCZUUFAmVJBQFiBQJlSQkAlgoECQCgAwEFAmVFBQJkZQUCYlEFAmVKCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJlSwYCZUwCZU0CZU4CZHcCZU8CZVADCQECIT0CCQCQAwEFAmVOAAEJAAIBAgsxIHBtbnQgZXhwZAQCZXEJAQJhSAAEAmJXCQCRAwIFAmVxBQFzBAJiWAkAkQMCBQJlcQUBdAQCYlkJAJEDAgUCZXEFAXUEAmVRCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZXEFAXYEAmVSCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZXEFAXcEAmVTCQCRAwIFAmVxBQFyBAJiVgMJAAACBQJkdwUCYVEFAmVPBQJkdwQCZHUJAQV2YWx1ZQEJAJEDAgUCZU4AAAQCYlQJAQV2YWx1ZQEIBQJkdQdhc3NldElkBAJjeggFAmR1BmFtb3VudAMJAGYCAICU69wDBQJjegkAAgECDU1pbiBwbXQgMTAgTFAEAmJTCQDYBAEFAmVQAwkBAiE9AgUCYlcJANgEAQUCYlQJAAIBAghXcm9uZyBMUAQCY2QJAQJiZwEFAmJYBAJjZgkBAmJnAQUCYlkEAmVUCgACZVUJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQJlTAkAzAgCBQJjegUDbmlsBQNuaWwDCQABAgUCZVUCCihJbnQsIEludCkFAmVVCQACAQkArAICCQADAQUCZVUCHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkEAmVWCAUCZVQCXzEEAmJRCAUCZVQCXzIEAmVXAwMJAGYCBQJlTQAACQBmAgUCZU0FAmVWBwkAAgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZU0FA25pbAIABQJlVgQCZVgDCQAAAgUCZUwFAmJYCQCWCgQFAmVXAAAJAGUCCQBlAgUCY2QFAmVXBQJiUQUCY2YDCQAAAgUCZUwFAmJZCQCWCgQAAAUCZVcFAmNkCQBlAgkAZQIFAmNmBQJlVwUCYlEJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQCZVkIBQJlWAJfMQQCZVoIBQJlWAJfMgQCZUIIBQJlWAJfMwQCZUMIBQJlWAJfNAQCZmEJAQJiaQIJAQFFAgUCZUMFAmVSCQEBRQIFAmVCBQJlUQQCZmIJAQFIAgUCZmEFAWEEAmZjAwkAAAIFAmVMAgVXQVZFUwUEdW5pdAkA2QQBBQJlTAQCZmQDCQBmAgUCYlEAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhRwUCYlEFAmZjBQNuaWwFA25pbAQCY3AJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiVgUCZVcFAmZjCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIJAKUIAQUCYlYFAmJTCQECYmMGBQJlWQUCZVoFAmN6BQJmYgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVQABQJmYgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJmYgUDbmlsBQJmZAMJAAACBQJjcAUCY3AEAmZlCQD8BwQFAmFDAgRidXJuCQDMCAIFAmN6BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJUBQJjegUDbmlsAwkAAAIFAmZlBQJmZQkAlAoCBQJjcAUCZVcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmZmAAQCYXcJAKIIAQkBAVIAAwkAAQIFAmF3AgZTdHJpbmcEAmRHBQJhdwkA2QQBBQJkRwMJAAECBQJhdwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJmZwAEAmF3CQCiCAEJAQFTAAMJAAECBQJhdwIGU3RyaW5nBAJkRwUCYXcJANkEAQUCZEcDCQABAgUCYXcCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACZmgJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECZmkBAmR0BAJhdwkBAmZmAAMJAAECBQJhdwIKQnl0ZVZlY3RvcgQCZmoFAmF3AwkAAAIIBQJkdA9jYWxsZXJQdWJsaWNLZXkFAmZqBgUCZmgDCQABAgUCYXcCBFVuaXQDCQAAAggFAmR0BmNhbGxlcgUEdGhpcwYFAmZoCQACAQILTWF0Y2ggZXJyb3IaAmR0AQtjb25zdHJ1Y3RvcgEBUQQCZWgJAQJmaQEFAmR0AwkAAAIFAmVoBQJlaAkAzAgCCQELU3RyaW5nRW50cnkCCQEBUQAFAVEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkdAEKc2V0TWFuYWdlcgECZmsEAmVoCQECZmkBBQJkdAMJAAACBQJlaAUCZWgEAmZsCQDZBAEFAmZrAwkAAAIFAmZsBQJmbAkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwAFAmZrBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZHQBDmNvbmZpcm1NYW5hZ2VyAAQCYk4JAQJmZwAEAmZtAwkBCWlzRGVmaW5lZAEFAmJOBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJmbQUCZm0EAmZuAwkAAAIIBQJkdA9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmJOBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJmbgUCZm4JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVIACQDYBAEJAQV2YWx1ZQEFAmJOCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFTAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmR0AQNwdXQCAmZvAmZwBAJmcQkBAmFMAAQCZnIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmZxBQF6AgpXciBzdCBhZGRyBAJmcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZnEFAUICCldyIHNsIGFkZHIDCQBmAgAABQJmbwkAAgECDldyb25nIHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUCZHQIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQCZnQJAQJkdgoJAKUIAQgFAmR0BmNhbGxlcgkA2AQBCAUCZHQNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJkdAhwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJkdAhwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZHQIcGF5bWVudHMAAQUCZm8GBwYAAAIABAJjWQgFAmZ0Al8yBAJmdQgFAmZ0Al83BAJjcAgFAmZ0Al85BAJjWggFAmZ0A18xMAQCZGEIBQJmdANfMTEEAmJYCAUCZnQDXzEyBAJiWQgFAmZ0A18xMwQCY0wJAPwHBAUCYUMCBGVtaXQJAMwIAgUCY1kFA25pbAUDbmlsAwkAAAIFAmNMBQJjTAQCZnYEAmF3BQJjTAMJAAECBQJhdwIHQWRkcmVzcwQCZncFAmF3CQD8BwQFAmZ3AgRlbWl0CQDMCAIFAmNZBQNuaWwFA25pbAUEdW5pdAMJAAACBQJmdgUCZnYEAmZ4AwkAZgIFAmNaAAAJAPwHBAUCZnMCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiWAUCY1oFA25pbAUDbmlsAwkAAAIFAmZ4BQJmeAQCZnkDCQBmAgUCZGEAAAkA/AcEBQJmcwIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJZBQJkYQUDbmlsBQNuaWwDCQAAAgUCZnkFAmZ5BAJmegMFAmZwBAJmQQkA/AcEBQJmcgIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZnUFAmNZBQNuaWwDCQAAAgUCZkEFAmZBBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmR0BmNhbGxlcgUCY1kFAmZ1BQNuaWwJAM4IAgUCY3AFAmZ6CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmR0AQtwdXRPbmVUa25WMgICZU0CZnADCQECIT0CCQCQAwEIBQJkdAhwYXltZW50cwABCQACAQILMSBwbW50IGV4cGQEAmVxCQECYUgABAJiWAkAkQMCBQJlcQUBdAQCYlkJAJEDAgUCZXEFAXUEAmJXCQDZBAEJAJEDAgUCZXEFAXMEAmVRCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZXEFAXYEAmVSCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZXEFAXcEAmJWAwkAAAIIBQJkdAZjYWxsZXIFBHRoaXMIBQJkdAxvcmlnaW5DYWxsZXIIBQJkdAZjYWxsZXIEAmR1CQEFdmFsdWUBCQCRAwIIBQJkdAhwYXltZW50cwAABAJiVAkA2AQBCQEFdmFsdWUBCAUCZHUHYXNzZXRJZAQCY3oIBQJkdQZhbW91bnQDCQBmAgCAreIEBQJjegkAAgECDVdyb25nIHBtdCBhbXQEAmZCCQECZW8EBQJjegUCYlQJAKUIAQUCYlYJANgEAQgFAmR0DXRyYW5zYWN0aW9uSWQEAmZDCAUCZkICXzEEAmNwCAUCZkICXzIEAmJRCAUCZkICXzMEAmNZAwMJAGYCBQJlTQAACQBmAgUCZU0FAmZDBwkAAgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZU0FA25pbAIABQJmQwQCZnQJAPwHBAUCYUMCBGVtaXQJAMwIAgUCY1kFA25pbAUDbmlsAwkAAAIFAmZ0BQJmdAQCZnYEAmF3BQJmdAMJAAECBQJhdwIHQWRkcmVzcwQCZncFAmF3CQD8BwQFAmZ3AgRlbWl0CQDMCAIFAmNZBQNuaWwFA25pbAUEdW5pdAMJAAACBQJmdgUCZnYEAmZ6AwUCZnAEAmZBCQD8BwQFAmFOAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiVwUCY1kFA25pbAMJAAACBQJmQQUCZkEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZHQGY2FsbGVyBQJjWQUCYlcFA25pbAQCZmQDCQBmAgUCYlEAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhRwUCYlEJANkEAQUCYlQFA25pbAUDbmlsCQCUCgIJAM4IAgkAzggCBQJjcAUCZnoFAmZkBQJjWQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkdAEKcHV0Rm9yRnJlZQECZkQDCQBmAgAABQJmRAkAAgECCldyb25nIHNscGcDCQECIT0CCQCQAwEIBQJkdAhwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAJmRQkBAmR2CgkApQgBCAUCZHQGY2FsbGVyCQDYBAEIBQJkdA10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAmR0CHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAmR0CHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQJkdAhwYXltZW50cwABBQJmRAcHBgAAAgAIBQJmRQJfOQJkdAEDZ2V0AAQCY0wJAQJkcwEFAmR0BAJmRggFAmNMAl8xBAJjbwgFAmNMAl8yBAJjeggFAmNMAl8zBAJiVAgFAmNMAl80BAJjcAgFAmNMAl81BAJlaQkA/AcEBQJhQwIEYnVybgkAzAgCBQJjegUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiVAUCY3oFA25pbAMJAAACBQJlaQUCZWkFAmNwCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmR0AQtnZXRPbmVUa25WMgICZUwCZU0EAmZHCQECZUsGBQJlTAUCZU0IBQJkdAhwYXltZW50cwgFAmR0BmNhbGxlcggFAmR0DG9yaWdpbkNhbGxlcggFAmR0DXRyYW5zYWN0aW9uSWQEAmNwCAUCZkcCXzEEAmVXCAUCZkcCXzIJAJQKAgUCY3AFAmVXAmR0ARNnZXRPbmVUa25WMlJFQURPTkxZAgJlTAJmSAQCZXEJAQJhSAAEAmJYCQCRAwIFAmVxBQF0BAJiWQkAkQMCBQJlcQUBdQQCYlcJAJEDAgUCZXEFAXMEAmRBCQDMCAIJALYCAQkBAmJnAQUCYlgJAMwIAgkAtgIBCQECYmcBBQJiWQUDbmlsBAJmSQkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCYlcCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmJ0CQECZHoBBQJkQQQCYnMJALgCAgUCYnQJALwCAwkAtgIBBQJmSAUCYnQFAmZJBAJmSgMJAAACBQJlTAUCYlgAAAMJAAACBQJlTAUCYlkAAQkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAJmSwkBAmVlAwUCZEEFAmZKBQJicwQCZkwJALgCAgkAkQMCBQJkQQUCZkoFAmZLBAJmTQkAoAMBCQC4AgIFAmZMBQFmBAJmTgkBAmJPAQUCZk0EAmVWCAUCZk4CXzEEAmJRCAUCZk4CXzIJAJQKAgUDbmlsCQCUCgIFAmVWBQJiUQJkdAEcZ2V0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICZUwCZkgEAmVxCQECYUgABAJiWAkAkQMCBQJlcQUBdAQCYlkJAJEDAgUCZXEFAXUEAmJXCQCRAwIFAmVxBQFzBAJjZAkBAmJnAQUCYlgEAmNmCQECYmcBBQJiWQQCZk8KAAJlVQkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmVMCQDMCAIFAmZIBQNuaWwFA25pbAMJAAECBQJlVQIKKEludCwgSW50KQUCZVUJAAIBCQCsAgIJAAMBBQJlVQIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQQCZVYIBQJmTwJfMQQCYlEIBQJmTwJfMgQCY0wJAQJiUgQCAAUCYlcFAmZIBQR0aGlzBAJjbggFAmNMAl8xBAJjbwgFAmNMAl8yBAJmUAkAZAIFAmNuBQJjbwQCZUoJAGsDCQBlAgUCZVYFAmZQBQFhBQJmUAkAlAoCBQNuaWwJAJUKAwUCZVYFAmJRBQJlSgJkdAEJZ2V0Tm9MZXNzAgJmUQJmUgQCY0wJAQJkcwEFAmR0BAJjbggFAmNMAl8xBAJjbwgFAmNMAl8yBAJjeggFAmNMAl8zBAJiVAgFAmNMAl80BAJjcAgFAmNMAl81AwkAZgIFAmZRBQJjbgkAAgEJAKwCAgkArAICCQCsAgICCUZhaWxlZDogIAkApAMBBQJjbgIDIDwgCQCkAwEFAmZRAwkAZgIFAmZSBQJjbwkAAgEJAKwCAgkArAICCQCsAgICCEZhaWxlZDogCQCkAwEFAmNvAgMgPCAJAKQDAQUCZlIEAmZTCQD8BwQFAmFDAgRidXJuCQDMCAIFAmN6BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJUBQJjegUDbmlsAwkAAAIFAmZTBQJmUwUCY3AJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZHQBDXVuc3Rha2VBbmRHZXQBAmJQBAJmVAMJAQIhPQIJAJADAQgFAmR0CHBheW1lbnRzAAAJAAIBAg1ObyBwbW50cyBleHBkBgMJAAACBQJmVAUCZlQEAmJGCQECYUgABAJmVQkBAmFMAAQCZnUJANkEAQkAkQMCBQJiRgUBcwQCZlYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmZVBQF6AgpXciBzdCBhZGRyBAJmVwkA/AcEBQJmVgIHdW5zdGFrZQkAzAgCCQDYBAEFAmZ1CQDMCAIFAmJQBQNuaWwFA25pbAMJAAACBQJmVwUCZlcEAmNMCQECYlIECQDYBAEIBQJkdA10cmFuc2FjdGlvbklkCQDYBAEFAmZ1BQJiUAgFAmR0BmNhbGxlcgQCY2IJAQ1wYXJzZUludFZhbHVlAQgFAmNMAl85BAJjcAgFAmNMA18xMAQCZlgDAwkBAmFFAAYJAAACBQJjYgUBcAkAAgEJAKwCAgIJQmxvY2tlZDogCQCkAwEFAmNiBgMJAAACBQJmWAUCZlgEAmZZCQD8BwQFAmFDAgRidXJuCQDMCAIFAmJQBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmZ1BQJiUAUDbmlsAwkAAAIFAmZZBQJmWQUCY3AJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZHQBFXVuc3Rha2VBbmRHZXRPbmVUa25WMgMCZloCZUwCZU0EAmZUAwkBAiE9AgkAkAMBCAUCZHQIcGF5bWVudHMAAAkAAgECDU5vIHBtbnRzIGV4cGQGAwkAAAIFAmZUBQJmVAQCYkYJAQJhSAAEAmZVCQECYUwABAJmdQkA2QQBCQCRAwIFAmJGBQFzBAJmVgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZlUFAXoCCldyIHN0IGFkZHIEAmZXCQD8BwQFAmZWAgd1bnN0YWtlCQDMCAIJANgEAQUCZnUJAMwIAgUCZloFA25pbAUDbmlsAwkAAAIFAmZXBQJmVwQCZ2EJAQJlSwYFAmVMBQJlTQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZnUFAmZaBQNuaWwIBQJkdAZjYWxsZXIIBQJkdAxvcmlnaW5DYWxsZXIIBQJkdA10cmFuc2FjdGlvbklkBAJjcAgFAmdhAl8xBAJlVwgFAmdhAl8yCQCUCgIFAmNwBQJlVwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkdAEccHV0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICZ2ICZ2MEAmVxCQECYUgABAJiWAkAkQMCBQJlcQUBdAQCYlkJAJEDAgUCZXEFAXUEAmJXCQCRAwIFAmVxBQFzBAJnZAkBAmVvBAUCZ2IFAmdjAgACAAQCZUUIBQJnZAJfMQQCY3AIBQJnZAJfMgQCYlEIBQJnZAJfMwQCZUoIBQJnZAJfNAkAlAoCBQNuaWwJAJUKAwUCZUUFAmJRBQJlSgJkdAEIYWN0aXZhdGUCAmdlAmdmAwkBAiE9AgkApQgBCAUCZHQGY2FsbGVyCQClCAEFAmFDCQACAQIGZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFiAAUCZ2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFjAAUCZ2YFA25pbAIHc3VjY2VzcwJkdAEEc2V0UwICZ2cCZlgDCQECIT0CCQClCAEIBQJkdAZjYWxsZXIJAQJheQIFBHRoaXMJAQJhZQAFAmZoCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmdnBQJmWAUDbmlsAmR0AQRzZXRJAgJnZwJmWAMJAQIhPQIJAKUIAQgFAmR0BmNhbGxlcgkBAmF5AgUEdGhpcwkBAmFlAAUCZmgJAMwIAgkBDEludGVnZXJFbnRyeQIFAmdnBQJmWAUDbmlsAmR0ARxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZAAkAlAoCBQNuaWwJAQJhSAACZHQBHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkBAmJoCQCUCgIFA25pbAkBAmJnAQUCYmgCZHQBGWNhbGNQcmljZXNXcmFwcGVyUkVBRE9OTFkDAmJ6AmJBAmJFBAJnaAkBAmJEAwUCYnoFAmJBBQJiRQkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFAmdoAAAJAMwIAgkApgMBCQCRAwIFAmdoAAEJAMwIAgkApgMBCQCRAwIFAmdoAAIFA25pbAJkdAEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIBSQJnaQkAlAoCBQNuaWwJAQFIAgkApwMBBQFJBQJnaQJkdAEUdG9YMThXcmFwcGVyUkVBRE9OTFkCAUYBRwkAlAoCBQNuaWwJAKYDAQkBAUUCBQFGBQFHAmR0AR5jYWxjUHJpY2VCaWdJbnRXcmFwcGVyUkVBRE9OTFkCAmJqAmJrCQCUCgIFA25pbAkApgMBCQECYmkCCQCnAwEFAmJqCQCnAwEFAmJrAmR0ASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkCYlMCYm8CY3ICY3MCY3QCY3UCZ2oCY3YCY3cJAJQKAgUDbmlsCQECY3ENBQJiUwUCYm8FAmNyBQJjcwUCY3QFAmN1BQJnagUCY3YFAmN3BgcAAAIAAmR0ASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQCYlMCZ2sCYlUCZ2oEAmNMCQECYlIEBQJiUwUCZ2sFAmJVCQERQGV4dHJOYXRpdmUoMTA2MikBBQJnagkAlAoCBQNuaWwJAJwKCggFAmNMAl8xCAUCY0wCXzIIBQJjTAJfMwgFAmNMAl80CAUCY0wCXzUIBQJjTAJfNggFAmNMAl83CQCmAwEIBQJjTAJfOAgFAmNMAl85CAUCY0wDXzEwAmR0AQ5nZXRGZWVSRUFET05MWQAJAJQKAgUDbmlsBQJhZwECZ2wBAmdtAAQCZ24EAmF3CQECZmYAAwkAAQIFAmF3AgpCeXRlVmVjdG9yBAJmagUCYXcFAmZqAwkAAQIFAmF3AgRVbml0CAUCZ2wPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IEAmF3BQJnbAMJAAECBQJhdwIFT3JkZXIEAmRnBQJhdwQCZ28JAQJhRgAEAmdwCQECZGYBBQJkZwQCZ3EJAPQDAwgFAmRnCWJvZHlCeXRlcwkAkQMCCAUCZGcGcHJvb2ZzAAAIBQJkZw9zZW5kZXJQdWJsaWNLZXkEAmdyCQD0AwMIBQJkZwlib2R5Qnl0ZXMJAJEDAggFAmRnBnByb29mcwABBQJnbwMDAwUCZ3AFAmdxBwUCZ3IHBgkBAmFyAwUCZ3AFAmdxBQJncgMJAAECBQJhdwIUU2V0U2NyaXB0VHJhbnNhY3Rpb24EAmRHBQJhdwQCZ3MJAPYDAQkBBXZhbHVlAQgFAmRHBnNjcmlwdAQCZ3QJANsEAQkBBXZhbHVlAQkAnQgCBQJhQwkBAmFwAAQCZ3UJAPEHAQUEdGhpcwMDCQAAAgUCZ3QFAmdzCQECIT0CBQJndQUCZ3MHBgkA9AMDCAUCZ2wJYm9keUJ5dGVzCQCRAwIIBQJnbAZwcm9vZnMAAAUCZ24JAPQDAwgFAmdsCWJvZHlCeXRlcwkAkQMCCAUCZ2wGcHJvb2ZzAAAFAmduMBQiIw==", "chainId": 84, "height": 2276275, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BQ5jMy4iGBGzSPFhsjaz2EKPP9r9ZFgLQF1nv4iiVi72 Next: 2M3T8bQFvEsvTtQMRNmisFV4Ko1YQ1KTsEbspzPtZ4oC Diff:
OldNewDifferences
5252 let idxIPriceAsId = 9
5353
5454 let idxFactStakCntr = 1
55+
56+let idxFactoryRestCntr = 6
5557
5658 let idxFactSlippCntr = 7
5759
184186 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
185187
186188 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
189+
190+let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
187191
188192 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)
189193
365369 else calcLpAmt
366370 let amDiff = (inAmAmt - calcAmAssetPmt)
367371 let prDiff = (inPrAmt - calcPrAssetPmt)
368- let $t01635116696 = if (if (isOneAsset)
372+ let $t01650916854 = if (if (isOneAsset)
369373 then (pmtId == amIdStr)
370374 else false)
371375 then $Tuple2(pmtAmt, 0)
374378 else false)
375379 then $Tuple2(0, pmtAmt)
376380 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
377- let writeAmAmt = $t01635116696._1
378- let writePrAmt = $t01635116696._2
381+ let writeAmAmt = $t01650916854._1
382+ let writePrAmt = $t01650916854._2
379383 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))]
380384 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
381385 }
475479 let ann_aPrecision = (ann - aPrecision)
476480 let n1 = (n + big1)
477481 func calc (acc,cur) = {
478- let $t02124821268 = acc
479- let d = $t02124821268._1
480- let found = $t02124821268._2
482+ let $t02140621426 = acc
483+ let d = $t02140621426._1
484+ let found = $t02140621426._2
481485 if ((found != unit))
482486 then acc
483487 else {
491495 }
492496
493497 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
494- let $t02168921736 = {
498+ let $t02184721894 = {
495499 let $l = arr
496500 let $s = size($l)
497501 let $acc0 = $Tuple2(s, unit)
505509
506510 $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)
507511 }
508- let d = $t02168921736._1
509- let found = $t02168921736._2
512+ let d = $t02184721894._1
513+ let found = $t02184721894._2
510514 if ((found != unit))
511515 then d
512516 else throw(("D calculation error, D = " + toString(d)))
526530 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
527531 let b = ((s + ((D * aPrecision) / ann)) - D)
528532 func calc (acc,cur) = {
529- let $t02223622256 = acc
530- let y = $t02223622256._1
531- let found = $t02223622256._2
533+ let $t02239422414 = acc
534+ let y = $t02239422414._1
535+ let found = $t02239422414._2
532536 if ((found != unit))
533537 then acc
534538 else {
541545 }
542546
543547 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
544- let $t02256322610 = {
548+ let $t02272122768 = {
545549 let $l = arr
546550 let $s = size($l)
547551 let $acc0 = $Tuple2(D, unit)
555559
556560 $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)
557561 }
558- let y = $t02256322610._1
559- let found = $t02256322610._2
562+ let y = $t02272122768._1
563+ let found = $t02272122768._2
560564 if ((found != unit))
561565 then y
562566 else throw(("Y calculation error, Y = " + toString(y)))
578582 then {
579583 let amBalance = getAccBalance(amId)
580584 let prBalance = getAccBalance(prId)
581- let $t02336923831 = if ((txId == ""))
585+ let $t02352723989 = if ((txId == ""))
582586 then $Tuple2(amBalance, prBalance)
583587 else if ((pmtAssetId == amId))
584588 then if ((pmtAmtRaw > amBalance))
589593 then throw("invalid payment amount")
590594 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
591595 else throw("wrong pmtAssetId")
592- let amBalanceOld = $t02336923831._1
593- let prBalanceOld = $t02336923831._2
594- let $t02383724013 = if ((pmtAssetId == amId))
596+ let amBalanceOld = $t02352723989._1
597+ let prBalanceOld = $t02352723989._2
598+ let $t02399524171 = if ((pmtAssetId == amId))
595599 then $Tuple2(pmtAmtRaw, 0)
596600 else if ((pmtAssetId == prId))
597601 then $Tuple2(0, pmtAmtRaw)
598602 else throw("invalid payment")
599- let amAmountRaw = $t02383724013._1
600- let prAmountRaw = $t02383724013._2
603+ let amAmountRaw = $t02399524171._1
604+ let prAmountRaw = $t02399524171._2
601605 let amAmount = takeFee(amAmountRaw)._1
602606 let prAmount = takeFee(prAmountRaw)._1
603607 let feeAmount = takeFee(pmtAmtRaw)._2
636640 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
637641 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
638642 let poolStatus = poolConfig[idxPoolSt]
639- let userAddress = if ((caller == this))
643+ let userAddress = if ((caller == restContract))
640644 then originCaller
641645 else caller
642646 let pmt = value(payments[0])
651655 else {
652656 let amBalance = getAccBalance(amId)
653657 let prBalance = getAccBalance(prId)
654- let $t02625626364 = {
658+ let $t02642226530 = {
655659 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
656660 if ($isInstanceOf(@, "(Int, Int)"))
657661 then @
658662 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
659663 }
660- let totalGet = $t02625626364._1
661- let feeAmount = $t02625626364._2
664+ let totalGet = $t02642226530._1
665+ let feeAmount = $t02642226530._2
662666 let totalAmount = if (if ((minOutAmount > 0))
663667 then (minOutAmount > totalGet)
664668 else false)
665669 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
666670 else totalGet
667- let $t02655126858 = if ((outAssetId == amId))
671+ let $t02671727024 = if ((outAssetId == amId))
668672 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
669673 else if ((outAssetId == prId))
670674 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
671675 else throw("invalid out asset id")
672- let outAm = $t02655126858._1
673- let outPr = $t02655126858._2
674- let amBalanceNew = $t02655126858._3
675- let prBalanceNew = $t02655126858._4
676+ let outAm = $t02671727024._1
677+ let outPr = $t02671727024._2
678+ let amBalanceNew = $t02671727024._3
679+ let prBalanceNew = $t02671727024._4
676680 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
677681 let curPr = f1(curPrX18, scale8)
678682 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
856860 if ((10000000 > pmtAmt))
857861 then throw("Wrong pmt amt")
858862 else {
859- let $t03173531860 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
860- let estimLP = $t03173531860._1
861- let state = $t03173531860._2
862- let feeAmount = $t03173531860._3
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
863867 let emitLpAmt = if (if ((minOutAmount > 0))
864868 then (minOutAmount > estimLP)
865869 else false)
927931
928932 @Callable(i)
929933 func getOneTknV2 (outAssetId,minOutAmount) = {
930- let $t03404334198 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
931- let state = $t03404334198._1
932- let totalAmount = $t03404334198._2
934+ let $t03420934364 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
935+ let state = $t03420934364._1
936+ let totalAmount = $t03420934364._2
933937 $Tuple2(state, totalAmount)
934938 }
935939
953957 let newY = getYD(xp, index, D1)
954958 let dy = (xp[index] - newY)
955959 let totalGetRaw = toInt((dy - big1))
956- let $t03497735026 = takeFee(totalGetRaw)
957- let totalGet = $t03497735026._1
958- let feeAmount = $t03497735026._2
960+ let $t03514335192 = takeFee(totalGetRaw)
961+ let totalGet = $t03514335192._1
962+ let feeAmount = $t03514335192._2
959963 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
960964 }
961965
969973 let lpId = poolConfig[idxLPAsId]
970974 let amBalance = getAccBalance(amId)
971975 let prBalance = getAccBalance(prId)
972- let $t03537135486 = {
976+ let $t03553735652 = {
973977 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
974978 if ($isInstanceOf(@, "(Int, Int)"))
975979 then @
976980 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
977981 }
978- let totalGet = $t03537135486._1
979- let feeAmount = $t03537135486._2
982+ let totalGet = $t03553735652._1
983+ let feeAmount = $t03553735652._2
980984 let r = ego("", lpId, lpAssetAmount, this)
981985 let outAmAmt = r._1
982986 let outPrAmt = r._2
10611065 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10621066 if ((unstakeInv == unstakeInv))
10631067 then {
1064- let $t03779337981 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1065- let state = $t03779337981._1
1066- let totalAmount = $t03779337981._2
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
10671071 $Tuple2(state, totalAmount)
10681072 }
10691073 else throw("Strict value is not equal to itself.")
10791083 let amId = poolConfig[idxAmAsId]
10801084 let prId = poolConfig[idxPrAsId]
10811085 let lpId = poolConfig[idxLPAsId]
1082- let $t03824038337 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1083- let lpAmount = $t03824038337._1
1084- let state = $t03824038337._2
1085- let feeAmount = $t03824038337._3
1086- let bonus = $t03824038337._4
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
10871091 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10881092 }
10891093
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)))
1919
2020 let Amult = "100"
2121
2222 let Dconv = "1"
2323
2424 let SEP = "__"
2525
2626 let EMPTY = ""
2727
2828 let PoolActive = 1
2929
3030 let PoolPutDis = 2
3131
3232 let PoolMatcherDis = 3
3333
3434 let PoolShutdown = 4
3535
3636 let idxPoolAddress = 1
3737
3838 let idxPoolSt = 2
3939
4040 let idxLPAsId = 3
4141
4242 let idxAmAsId = 4
4343
4444 let idxPrAsId = 5
4545
4646 let idxAmtAsDcm = 6
4747
4848 let idxPriceAsDcm = 7
4949
5050 let idxIAmtAsId = 8
5151
5252 let idxIPriceAsId = 9
5353
5454 let idxFactStakCntr = 1
55+
56+let idxFactoryRestCntr = 6
5557
5658 let idxFactSlippCntr = 7
5759
5860 let idxFactGwxRewCntr = 10
5961
6062 let feeDefault = fraction(5, scale8, 10000)
6163
6264 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6365
6466
6567 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6668
6769
6870 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6971
7072
7173 func abs (val) = if ((zeroBigInt > val))
7274 then -(val)
7375 else val
7476
7577
7678 func absBigInt (val) = if ((zeroBigInt > val))
7779 then -(val)
7880 else val
7981
8082
8183 func fc () = "%s__factoryContract"
8284
8385
8486 func mpk () = "%s__managerPublicKey"
8587
8688
8789 func pmpk () = "%s__pendingManagerPublicKey"
8890
8991
9092 func pl () = "%s%s__price__last"
9193
9294
9395 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
9496
9597
9698 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
9799
98100
99101 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
100102
101103
102104 func aa () = "%s__amountAsset"
103105
104106
105107 func pa () = "%s__priceAsset"
106108
107109
108110 func amp () = "%s__amp"
109111
110112
111113 func ada () = "%s__addonAddr"
112114
113115
114116 let keyFee = "%s__fee"
115117
116118 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
117119
118120 func fcfg () = "%s__factoryConfig"
119121
120122
121123 func mtpk () = "%s%s__matcher__publicKey"
122124
123125
124126 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
125127
126128
127129 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
128130
129131
130132 func aps () = "%s__shutdown"
131133
132134
133135 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
134136
135137
136138 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
137139
138140
139141 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
140142
141143
142144 func str (val) = match val {
143145 case valStr: String =>
144146 valStr
145147 case _ =>
146148 throw("fail cast to String")
147149 }
148150
149151
150152 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
151153
152154
153155 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
154156
155157
156158 let fca = addressFromStringValue(strf(this, fc()))
157159
158160 let A = strf(this, amp())
159161
160162 func igs () = valueOrElse(getBoolean(fca, aps()), false)
161163
162164
163165 func mp () = fromBase58String(strf(fca, mtpk()))
164166
165167
166168 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
167169
168170 func gpc () = {
169171 let amtAs = strf(this, aa())
170172 let priceAs = strf(this, pa())
171173 let iPriceAs = intf(fca, mba(priceAs))
172174 let iAmtAs = intf(fca, mba(amtAs))
173175 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
174176 }
175177
176178
177179 func gfc () = split(strf(fca, fcfg()), SEP)
178180
179181
180182 let factoryConfig = gfc()
181183
182184 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
183185
184186 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
185187
186188 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
189+
190+let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
187191
188192 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)
189193
190194
191195 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)
192196
193197
194198 func getAccBalance (assetId) = if ((assetId == "WAVES"))
195199 then wavesBalance(this).available
196200 else assetBalance(this, fromBase58String(assetId))
197201
198202
199203 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
200204
201205
202206 func vad (A1,A2,slippage) = {
203207 let diff = fraction((A1 - A2), scale8BigInt, A2)
204208 let pass = ((slippage - abs(diff)) > zeroBigInt)
205209 if (!(pass))
206210 then throw(("Big slpg: " + toString(diff)))
207211 else $Tuple2(pass, min([A1, A2]))
208212 }
209213
210214
211215 func vd (D1,D0,slpg) = {
212216 let diff = fraction(D0, scale8BigInt, D1)
213217 let fail = (slpg > diff)
214218 if (if (fail)
215219 then true
216220 else (D0 > D1))
217221 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
218222 else fail
219223 }
220224
221225
222226 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
223227 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
224228 let prAsAmtX18 = t1(prAmt, prAssetDcm)
225229 cpbi(prAsAmtX18, amtAsAmtX18)
226230 }
227231
228232
229233 func calcPrices (amAmt,prAmt,lpAmt) = {
230234 let cfg = gpc()
231235 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
232236 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
233237 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
234238 let amAmtX18 = t1(amAmt, amtAsDcm)
235239 let prAmtX18 = t1(prAmt, prAsDcm)
236240 let lpAmtX18 = t1(lpAmt, scale8)
237241 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
238242 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
239243 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
240244 }
241245
242246
243247 func calculatePrices (amAmt,prAmt,lpAmt) = {
244248 let p = calcPrices(amAmt, prAmt, lpAmt)
245249 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
246250 }
247251
248252
249253 func takeFee (amount) = {
250254 let feeAmount = fraction(amount, fee, scale8)
251255 $Tuple2((amount - feeAmount), feeAmount)
252256 }
253257
254258
255259 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
256260 let cfg = gpc()
257261 let lpId = cfg[idxLPAsId]
258262 let amId = cfg[idxAmAsId]
259263 let prId = cfg[idxPrAsId]
260264 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
261265 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
262266 let sts = cfg[idxPoolSt]
263267 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
264268 if ((lpId != pmtAssetId))
265269 then throw("Wrong pmt asset")
266270 else {
267271 let amBalance = getAccBalance(amId)
268272 let amBalanceX18 = t1(amBalance, amDcm)
269273 let prBalance = getAccBalance(prId)
270274 let prBalanceX18 = t1(prBalance, prDcm)
271275 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
272276 let curPrice = f1(curPriceX18, scale8)
273277 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
274278 let lpEmissX18 = t1(lpEmiss, scale8)
275279 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
276280 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
277281 let outAmAmt = f1(outAmAmtX18, amDcm)
278282 let outPrAmt = f1(outPrAmtX18, prDcm)
279283 let state = if ((txId58 == ""))
280284 then nil
281285 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
282286 then unit
283287 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
284288 then unit
285289 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)]
286290 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
287291 }
288292 }
289293
290294
291295 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
292296 let cfg = gpc()
293297 let lpId = fromBase58String(cfg[idxLPAsId])
294298 let amIdStr = cfg[idxAmAsId]
295299 let prIdStr = cfg[idxPrAsId]
296300 let inAmIdStr = cfg[idxIAmtAsId]
297301 let inPrIdStr = cfg[idxIPriceAsId]
298302 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
299303 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
300304 let sts = cfg[idxPoolSt]
301305 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
302306 let amBalance = if (isEval)
303307 then getAccBalance(amIdStr)
304308 else if (if (isOneAsset)
305309 then (pmtId == amIdStr)
306310 else false)
307311 then (getAccBalance(amIdStr) - pmtAmt)
308312 else if (isOneAsset)
309313 then getAccBalance(amIdStr)
310314 else (getAccBalance(amIdStr) - inAmAmt)
311315 let prBalance = if (isEval)
312316 then getAccBalance(prIdStr)
313317 else if (if (isOneAsset)
314318 then (pmtId == prIdStr)
315319 else false)
316320 then (getAccBalance(prIdStr) - pmtAmt)
317321 else if (isOneAsset)
318322 then getAccBalance(prIdStr)
319323 else (getAccBalance(prIdStr) - inPrAmt)
320324 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
321325 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
322326 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
323327 let amBalanceX18 = t1(amBalance, amtDcm)
324328 let prBalanceX18 = t1(prBalance, priceDcm)
325329 let r = if ((lpEm == 0))
326330 then {
327331 let curPriceX18 = zeroBigInt
328332 let slippageX18 = zeroBigInt
329333 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
330334 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
331335 }
332336 else {
333337 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
334338 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
335339 let slippageX18 = t1(slippage, scale8)
336340 if (if (if (validateSlippage)
337341 then (curPriceX18 != zeroBigInt)
338342 else false)
339343 then (slippageRealX18 > slippageX18)
340344 else false)
341345 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
342346 else {
343347 let lpEmissionX18 = t1(lpEm, scale8)
344348 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
345349 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
346350 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
347351 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
348352 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
349353 let expAmtAssetAmtX18 = expectedAmts._1
350354 let expPriceAssetAmtX18 = expectedAmts._2
351355 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
352356 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
353357 }
354358 }
355359 let calcLpAmt = r._1
356360 let calcAmAssetPmt = r._2
357361 let calcPrAssetPmt = r._3
358362 let curPrice = f1(r._4, scale8)
359363 let slippageCalc = f1(r._5, scale8)
360364 if ((0 >= calcLpAmt))
361365 then throw("LP <= 0")
362366 else {
363367 let emitLpAmt = if (!(emitLp))
364368 then 0
365369 else calcLpAmt
366370 let amDiff = (inAmAmt - calcAmAssetPmt)
367371 let prDiff = (inPrAmt - calcPrAssetPmt)
368- let $t01635116696 = if (if (isOneAsset)
372+ let $t01650916854 = if (if (isOneAsset)
369373 then (pmtId == amIdStr)
370374 else false)
371375 then $Tuple2(pmtAmt, 0)
372376 else if (if (isOneAsset)
373377 then (pmtId == prIdStr)
374378 else false)
375379 then $Tuple2(0, pmtAmt)
376380 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
377- let writeAmAmt = $t01635116696._1
378- let writePrAmt = $t01635116696._2
381+ let writeAmAmt = $t01650916854._1
382+ let writePrAmt = $t01650916854._2
379383 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))]
380384 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
381385 }
382386 }
383387
384388
385389 func moa (order) = {
386390 let cfg = gpc()
387391 let amtAsId = cfg[idxAmAsId]
388392 let prAsId = cfg[idxPrAsId]
389393 let sts = parseIntValue(cfg[idxPoolSt])
390394 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
391395 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
392396 let accAmtAsBalance = getAccBalance(amtAsId)
393397 let accPrAsBalance = getAccBalance(prAsId)
394398 let curPriceX18 = if ((order.orderType == Buy))
395399 then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
396400 else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
397401 let curPrice = f1(curPriceX18, scale8)
398402 if (if (if (igs())
399403 then true
400404 else (sts == PoolMatcherDis))
401405 then true
402406 else (sts == PoolShutdown))
403407 then throw("Admin blocked")
404408 else {
405409 let orAmtAsset = order.assetPair.amountAsset
406410 let orAmtAsStr = if ((orAmtAsset == unit))
407411 then "WAVES"
408412 else toBase58String(value(orAmtAsset))
409413 let orPrAsset = order.assetPair.priceAsset
410414 let orPrAsStr = if ((orPrAsset == unit))
411415 then "WAVES"
412416 else toBase58String(value(orPrAsset))
413417 if (if ((orAmtAsStr != amtAsId))
414418 then true
415419 else (orPrAsStr != prAsId))
416420 then throw("Wr assets")
417421 else {
418422 let orderPrice = order.price
419423 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
420424 let castOrderPrice = ts(orderPrice, scale8, priceDcm)
421425 let isOrderPriceValid = if ((order.orderType == Buy))
422426 then (curPrice >= castOrderPrice)
423427 else (castOrderPrice >= curPrice)
424428 true
425429 }
426430 }
427431 }
428432
429433
430434 func cg (i) = if ((size(i.payments) != 1))
431435 then throw("1 pmnt exp")
432436 else {
433437 let pmt = value(i.payments[0])
434438 let pmtAssetId = value(pmt.assetId)
435439 let pmtAmt = pmt.amount
436440 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
437441 let outAmAmt = r._1
438442 let outPrAmt = r._2
439443 let sts = parseIntValue(r._9)
440444 let state = r._10
441445 if (if (igs())
442446 then true
443447 else (sts == PoolShutdown))
444448 then throw(("Admin blocked: " + toString(sts)))
445449 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
446450 }
447451
448452
449453 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
450454 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
451455 let sts = parseIntValue(r._8)
452456 if (if (if (igs())
453457 then true
454458 else (sts == PoolPutDis))
455459 then true
456460 else (sts == PoolShutdown))
457461 then throw(("Blocked:" + toString(sts)))
458462 else r
459463 }
460464
461465
462466 func getD (xp) = {
463467 let n = big2
464468 let xp0 = xp[0]
465469 let xp1 = xp[1]
466470 let aPrecision = parseBigIntValue(Amult)
467471 let a = (parseBigIntValue(A) * aPrecision)
468472 let s = (xp0 + xp1)
469473 if ((s == big0))
470474 then big0
471475 else {
472476 let ann = (a * n)
473477 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
474478 let ann_s_aPrecision = ((ann * s) / aPrecision)
475479 let ann_aPrecision = (ann - aPrecision)
476480 let n1 = (n + big1)
477481 func calc (acc,cur) = {
478- let $t02124821268 = acc
479- let d = $t02124821268._1
480- let found = $t02124821268._2
482+ let $t02140621426 = acc
483+ let d = $t02140621426._1
484+ let found = $t02140621426._2
481485 if ((found != unit))
482486 then acc
483487 else {
484488 let dp = (((d * d) * d) / xp0_xp1_n_n)
485489 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
486490 let dDiff = absBigInt((dNext - value(d)))
487491 if ((big1 >= dDiff))
488492 then $Tuple2(dNext, cur)
489493 else $Tuple2(dNext, unit)
490494 }
491495 }
492496
493497 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
494- let $t02168921736 = {
498+ let $t02184721894 = {
495499 let $l = arr
496500 let $s = size($l)
497501 let $acc0 = $Tuple2(s, unit)
498502 func $f0_1 ($a,$i) = if (($i >= $s))
499503 then $a
500504 else calc($a, $l[$i])
501505
502506 func $f0_2 ($a,$i) = if (($i >= $s))
503507 then $a
504508 else throw("List size exceeds 15")
505509
506510 $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)
507511 }
508- let d = $t02168921736._1
509- let found = $t02168921736._2
512+ let d = $t02184721894._1
513+ let found = $t02184721894._2
510514 if ((found != unit))
511515 then d
512516 else throw(("D calculation error, D = " + toString(d)))
513517 }
514518 }
515519
516520
517521 func getYD (xp,i,D) = {
518522 let n = big2
519523 let x = xp[if ((i == 0))
520524 then 1
521525 else 0]
522526 let aPrecision = parseBigIntValue(Amult)
523527 let a = (parseBigIntValue(A) * aPrecision)
524528 let s = x
525529 let ann = (a * n)
526530 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
527531 let b = ((s + ((D * aPrecision) / ann)) - D)
528532 func calc (acc,cur) = {
529- let $t02223622256 = acc
530- let y = $t02223622256._1
531- let found = $t02223622256._2
533+ let $t02239422414 = acc
534+ let y = $t02239422414._1
535+ let found = $t02239422414._2
532536 if ((found != unit))
533537 then acc
534538 else {
535539 let yNext = (((y * y) + c) / ((big2 * y) + b))
536540 let yDiff = absBigInt((yNext - value(y)))
537541 if ((big1 >= yDiff))
538542 then $Tuple2(yNext, cur)
539543 else $Tuple2(yNext, unit)
540544 }
541545 }
542546
543547 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
544- let $t02256322610 = {
548+ let $t02272122768 = {
545549 let $l = arr
546550 let $s = size($l)
547551 let $acc0 = $Tuple2(D, unit)
548552 func $f0_1 ($a,$i) = if (($i >= $s))
549553 then $a
550554 else calc($a, $l[$i])
551555
552556 func $f0_2 ($a,$i) = if (($i >= $s))
553557 then $a
554558 else throw("List size exceeds 15")
555559
556560 $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)
557561 }
558- let y = $t02256322610._1
559- let found = $t02256322610._2
562+ let y = $t02272122768._1
563+ let found = $t02272122768._2
560564 if ((found != unit))
561565 then y
562566 else throw(("Y calculation error, Y = " + toString(y)))
563567 }
564568
565569
566570 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId) = {
567571 let poolConfig = gpc()
568572 let amId = poolConfig[idxAmAsId]
569573 let prId = poolConfig[idxPrAsId]
570574 let lpId = poolConfig[idxLPAsId]
571575 let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
572576 let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
573577 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
574578 let chechEmission = if ((lpAssetEmission > big0))
575579 then true
576580 else throw("initial deposit requires all coins")
577581 if ((chechEmission == chechEmission))
578582 then {
579583 let amBalance = getAccBalance(amId)
580584 let prBalance = getAccBalance(prId)
581- let $t02336923831 = if ((txId == ""))
585+ let $t02352723989 = if ((txId == ""))
582586 then $Tuple2(amBalance, prBalance)
583587 else if ((pmtAssetId == amId))
584588 then if ((pmtAmtRaw > amBalance))
585589 then throw("invalid payment amount")
586590 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
587591 else if ((pmtAssetId == prId))
588592 then if ((pmtAmtRaw > prBalance))
589593 then throw("invalid payment amount")
590594 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
591595 else throw("wrong pmtAssetId")
592- let amBalanceOld = $t02336923831._1
593- let prBalanceOld = $t02336923831._2
594- let $t02383724013 = if ((pmtAssetId == amId))
596+ let amBalanceOld = $t02352723989._1
597+ let prBalanceOld = $t02352723989._2
598+ let $t02399524171 = if ((pmtAssetId == amId))
595599 then $Tuple2(pmtAmtRaw, 0)
596600 else if ((pmtAssetId == prId))
597601 then $Tuple2(0, pmtAmtRaw)
598602 else throw("invalid payment")
599- let amAmountRaw = $t02383724013._1
600- let prAmountRaw = $t02383724013._2
603+ let amAmountRaw = $t02399524171._1
604+ let prAmountRaw = $t02399524171._2
601605 let amAmount = takeFee(amAmountRaw)._1
602606 let prAmount = takeFee(prAmountRaw)._1
603607 let feeAmount = takeFee(pmtAmtRaw)._2
604608 let amBalanceNew = (amBalanceOld + amAmount)
605609 let prBalanceNew = (prBalanceOld + prAmount)
606610 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
607611 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
608612 let checkD = if ((D1 > D0))
609613 then true
610614 else throw()
611615 if ((checkD == checkD))
612616 then {
613617 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
614618 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
615619 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))]
616620 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
617621 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
618622 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
619623 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
620624 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
621625 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
622626 }
623627 else throw("Strict value is not equal to itself.")
624628 }
625629 else throw("Strict value is not equal to itself.")
626630 }
627631
628632
629633 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = if ((size(payments) != 1))
630634 then throw("1 pmnt expd")
631635 else {
632636 let poolConfig = gpc()
633637 let lpId = poolConfig[idxLPAsId]
634638 let amId = poolConfig[idxAmAsId]
635639 let prId = poolConfig[idxPrAsId]
636640 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
637641 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
638642 let poolStatus = poolConfig[idxPoolSt]
639- let userAddress = if ((caller == this))
643+ let userAddress = if ((caller == restContract))
640644 then originCaller
641645 else caller
642646 let pmt = value(payments[0])
643647 let pmtAssetId = value(pmt.assetId)
644648 let pmtAmt = pmt.amount
645649 if ((1000000000 > pmtAmt))
646650 then throw("Min pmt 10 LP")
647651 else {
648652 let txId58 = toBase58String(transactionId)
649653 if ((lpId != toBase58String(pmtAssetId)))
650654 then throw("Wrong LP")
651655 else {
652656 let amBalance = getAccBalance(amId)
653657 let prBalance = getAccBalance(prId)
654- let $t02625626364 = {
658+ let $t02642226530 = {
655659 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
656660 if ($isInstanceOf(@, "(Int, Int)"))
657661 then @
658662 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
659663 }
660- let totalGet = $t02625626364._1
661- let feeAmount = $t02625626364._2
664+ let totalGet = $t02642226530._1
665+ let feeAmount = $t02642226530._2
662666 let totalAmount = if (if ((minOutAmount > 0))
663667 then (minOutAmount > totalGet)
664668 else false)
665669 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
666670 else totalGet
667- let $t02655126858 = if ((outAssetId == amId))
671+ let $t02671727024 = if ((outAssetId == amId))
668672 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
669673 else if ((outAssetId == prId))
670674 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
671675 else throw("invalid out asset id")
672- let outAm = $t02655126858._1
673- let outPr = $t02655126858._2
674- let amBalanceNew = $t02655126858._3
675- let prBalanceNew = $t02655126858._4
676+ let outAm = $t02671727024._1
677+ let outPr = $t02671727024._2
678+ let amBalanceNew = $t02671727024._3
679+ let prBalanceNew = $t02671727024._4
676680 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
677681 let curPr = f1(curPrX18, scale8)
678682 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
679683 then unit
680684 else fromBase58String(outAssetId)
681685 let sendFeeToMatcher = if ((feeAmount > 0))
682686 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
683687 else nil
684688 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)
685689 if ((state == state))
686690 then {
687691 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
688692 if ((burn == burn))
689693 then $Tuple2(state, totalAmount)
690694 else throw("Strict value is not equal to itself.")
691695 }
692696 else throw("Strict value is not equal to itself.")
693697 }
694698 }
695699 }
696700
697701
698702 func m () = match getString(mpk()) {
699703 case s: String =>
700704 fromBase58String(s)
701705 case _: Unit =>
702706 unit
703707 case _ =>
704708 throw("Match error")
705709 }
706710
707711
708712 func pm () = match getString(pmpk()) {
709713 case s: String =>
710714 fromBase58String(s)
711715 case _: Unit =>
712716 unit
713717 case _ =>
714718 throw("Match error")
715719 }
716720
717721
718722 let pd = throw("Permission denied")
719723
720724 func mm (i) = match m() {
721725 case pk: ByteVector =>
722726 if ((i.callerPublicKey == pk))
723727 then true
724728 else pd
725729 case _: Unit =>
726730 if ((i.caller == this))
727731 then true
728732 else pd
729733 case _ =>
730734 throw("Match error")
731735 }
732736
733737
734738 @Callable(i)
735739 func constructor (fc) = {
736740 let c = mm(i)
737741 if ((c == c))
738742 then [StringEntry(fc(), fc)]
739743 else throw("Strict value is not equal to itself.")
740744 }
741745
742746
743747
744748 @Callable(i)
745749 func setManager (pendingManagerPublicKey) = {
746750 let c = mm(i)
747751 if ((c == c))
748752 then {
749753 let cm = fromBase58String(pendingManagerPublicKey)
750754 if ((cm == cm))
751755 then [StringEntry(pmpk(), pendingManagerPublicKey)]
752756 else throw("Strict value is not equal to itself.")
753757 }
754758 else throw("Strict value is not equal to itself.")
755759 }
756760
757761
758762
759763 @Callable(i)
760764 func confirmManager () = {
761765 let p = pm()
762766 let hpm = if (isDefined(p))
763767 then true
764768 else throw("No pending manager")
765769 if ((hpm == hpm))
766770 then {
767771 let cpm = if ((i.callerPublicKey == value(p)))
768772 then true
769773 else throw("You are not pending manager")
770774 if ((cpm == cpm))
771775 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
772776 else throw("Strict value is not equal to itself.")
773777 }
774778 else throw("Strict value is not equal to itself.")
775779 }
776780
777781
778782
779783 @Callable(i)
780784 func put (slip,autoStake) = {
781785 let factCfg = gfc()
782786 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
783787 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
784788 if ((0 > slip))
785789 then throw("Wrong slippage")
786790 else if ((size(i.payments) != 2))
787791 then throw("2 pmnts expd")
788792 else {
789793 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, "")
790794 let emitLpAmt = e._2
791795 let lpAssetId = e._7
792796 let state = e._9
793797 let amDiff = e._10
794798 let prDiff = e._11
795799 let amId = e._12
796800 let prId = e._13
797801 let r = invoke(fca, "emit", [emitLpAmt], nil)
798802 if ((r == r))
799803 then {
800804 let el = match r {
801805 case legacy: Address =>
802806 invoke(legacy, "emit", [emitLpAmt], nil)
803807 case _ =>
804808 unit
805809 }
806810 if ((el == el))
807811 then {
808812 let sa = if ((amDiff > 0))
809813 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
810814 else nil
811815 if ((sa == sa))
812816 then {
813817 let sp = if ((prDiff > 0))
814818 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
815819 else nil
816820 if ((sp == sp))
817821 then {
818822 let lpTrnsfr = if (autoStake)
819823 then {
820824 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
821825 if ((ss == ss))
822826 then nil
823827 else throw("Strict value is not equal to itself.")
824828 }
825829 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
826830 (state ++ lpTrnsfr)
827831 }
828832 else throw("Strict value is not equal to itself.")
829833 }
830834 else throw("Strict value is not equal to itself.")
831835 }
832836 else throw("Strict value is not equal to itself.")
833837 }
834838 else throw("Strict value is not equal to itself.")
835839 }
836840 }
837841
838842
839843
840844 @Callable(i)
841845 func putOneTknV2 (minOutAmount,autoStake) = if ((size(i.payments) != 1))
842846 then throw("1 pmnt expd")
843847 else {
844848 let poolConfig = gpc()
845849 let amId = poolConfig[idxAmAsId]
846850 let prId = poolConfig[idxPrAsId]
847851 let lpId = fromBase58String(poolConfig[idxLPAsId])
848852 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
849853 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
850854 let userAddress = if ((i.caller == this))
851855 then i.originCaller
852856 else i.caller
853857 let pmt = value(i.payments[0])
854858 let pmtAssetId = toBase58String(value(pmt.assetId))
855859 let pmtAmt = pmt.amount
856860 if ((10000000 > pmtAmt))
857861 then throw("Wrong pmt amt")
858862 else {
859- let $t03173531860 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
860- let estimLP = $t03173531860._1
861- let state = $t03173531860._2
862- let feeAmount = $t03173531860._3
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
863867 let emitLpAmt = if (if ((minOutAmount > 0))
864868 then (minOutAmount > estimLP)
865869 else false)
866870 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
867871 else estimLP
868872 let e = invoke(fca, "emit", [emitLpAmt], nil)
869873 if ((e == e))
870874 then {
871875 let el = match e {
872876 case legacy: Address =>
873877 invoke(legacy, "emit", [emitLpAmt], nil)
874878 case _ =>
875879 unit
876880 }
877881 if ((el == el))
878882 then {
879883 let lpTrnsfr = if (autoStake)
880884 then {
881885 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
882886 if ((ss == ss))
883887 then nil
884888 else throw("Strict value is not equal to itself.")
885889 }
886890 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
887891 let sendFeeToMatcher = if ((feeAmount > 0))
888892 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
889893 else nil
890894 $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
891895 }
892896 else throw("Strict value is not equal to itself.")
893897 }
894898 else throw("Strict value is not equal to itself.")
895899 }
896900 }
897901
898902
899903
900904 @Callable(i)
901905 func putForFree (maxSlpg) = if ((0 > maxSlpg))
902906 then throw("Wrong slpg")
903907 else if ((size(i.payments) != 2))
904908 then throw("2 pmnts expd")
905909 else {
906910 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, "")
907911 estPut._9
908912 }
909913
910914
911915
912916 @Callable(i)
913917 func get () = {
914918 let r = cg(i)
915919 let outAmtAmt = r._1
916920 let outPrAmt = r._2
917921 let pmtAmt = r._3
918922 let pmtAssetId = r._4
919923 let state = r._5
920924 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
921925 if ((b == b))
922926 then state
923927 else throw("Strict value is not equal to itself.")
924928 }
925929
926930
927931
928932 @Callable(i)
929933 func getOneTknV2 (outAssetId,minOutAmount) = {
930- let $t03404334198 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
931- let state = $t03404334198._1
932- let totalAmount = $t03404334198._2
934+ let $t03420934364 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
935+ let state = $t03420934364._1
936+ let totalAmount = $t03420934364._2
933937 $Tuple2(state, totalAmount)
934938 }
935939
936940
937941
938942 @Callable(i)
939943 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
940944 let poolConfig = gpc()
941945 let amId = poolConfig[idxAmAsId]
942946 let prId = poolConfig[idxPrAsId]
943947 let lpId = poolConfig[idxLPAsId]
944948 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
945949 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
946950 let D0 = getD(xp)
947951 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
948952 let index = if ((outAssetId == amId))
949953 then 0
950954 else if ((outAssetId == prId))
951955 then 1
952956 else throw("invalid out asset id")
953957 let newY = getYD(xp, index, D1)
954958 let dy = (xp[index] - newY)
955959 let totalGetRaw = toInt((dy - big1))
956- let $t03497735026 = takeFee(totalGetRaw)
957- let totalGet = $t03497735026._1
958- let feeAmount = $t03497735026._2
960+ let $t03514335192 = takeFee(totalGetRaw)
961+ let totalGet = $t03514335192._1
962+ let feeAmount = $t03514335192._2
959963 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
960964 }
961965
962966
963967
964968 @Callable(i)
965969 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
966970 let poolConfig = gpc()
967971 let amId = poolConfig[idxAmAsId]
968972 let prId = poolConfig[idxPrAsId]
969973 let lpId = poolConfig[idxLPAsId]
970974 let amBalance = getAccBalance(amId)
971975 let prBalance = getAccBalance(prId)
972- let $t03537135486 = {
976+ let $t03553735652 = {
973977 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
974978 if ($isInstanceOf(@, "(Int, Int)"))
975979 then @
976980 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
977981 }
978- let totalGet = $t03537135486._1
979- let feeAmount = $t03537135486._2
982+ let totalGet = $t03553735652._1
983+ let feeAmount = $t03553735652._2
980984 let r = ego("", lpId, lpAssetAmount, this)
981985 let outAmAmt = r._1
982986 let outPrAmt = r._2
983987 let sumOfGetAssets = (outAmAmt + outPrAmt)
984988 let bonus = fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
985989 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
986990 }
987991
988992
989993
990994 @Callable(i)
991995 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
992996 let r = cg(i)
993997 let outAmAmt = r._1
994998 let outPrAmt = r._2
995999 let pmtAmt = r._3
9961000 let pmtAssetId = r._4
9971001 let state = r._5
9981002 if ((noLessThenAmtAsset > outAmAmt))
9991003 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
10001004 else if ((noLessThenPriceAsset > outPrAmt))
10011005 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
10021006 else {
10031007 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10041008 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
10051009 then state
10061010 else throw("Strict value is not equal to itself.")
10071011 }
10081012 }
10091013
10101014
10111015
10121016 @Callable(i)
10131017 func unstakeAndGet (amount) = {
10141018 let checkPayments = if ((size(i.payments) != 0))
10151019 then throw("No pmnts expd")
10161020 else true
10171021 if ((checkPayments == checkPayments))
10181022 then {
10191023 let cfg = gpc()
10201024 let factoryCfg = gfc()
10211025 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10221026 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10231027 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
10241028 if ((unstakeInv == unstakeInv))
10251029 then {
10261030 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
10271031 let sts = parseIntValue(r._9)
10281032 let state = r._10
10291033 let v = if (if (igs())
10301034 then true
10311035 else (sts == PoolShutdown))
10321036 then throw(("Blocked: " + toString(sts)))
10331037 else true
10341038 if ((v == v))
10351039 then {
10361040 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
10371041 if ((burnA == burnA))
10381042 then state
10391043 else throw("Strict value is not equal to itself.")
10401044 }
10411045 else throw("Strict value is not equal to itself.")
10421046 }
10431047 else throw("Strict value is not equal to itself.")
10441048 }
10451049 else throw("Strict value is not equal to itself.")
10461050 }
10471051
10481052
10491053
10501054 @Callable(i)
10511055 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
10521056 let checkPayments = if ((size(i.payments) != 0))
10531057 then throw("No pmnts expd")
10541058 else true
10551059 if ((checkPayments == checkPayments))
10561060 then {
10571061 let cfg = gpc()
10581062 let factoryCfg = gfc()
10591063 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10601064 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10611065 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10621066 if ((unstakeInv == unstakeInv))
10631067 then {
1064- let $t03779337981 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1065- let state = $t03779337981._1
1066- let totalAmount = $t03779337981._2
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
10671071 $Tuple2(state, totalAmount)
10681072 }
10691073 else throw("Strict value is not equal to itself.")
10701074 }
10711075 else throw("Strict value is not equal to itself.")
10721076 }
10731077
10741078
10751079
10761080 @Callable(i)
10771081 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
10781082 let poolConfig = gpc()
10791083 let amId = poolConfig[idxAmAsId]
10801084 let prId = poolConfig[idxPrAsId]
10811085 let lpId = poolConfig[idxLPAsId]
1082- let $t03824038337 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1083- let lpAmount = $t03824038337._1
1084- let state = $t03824038337._2
1085- let feeAmount = $t03824038337._3
1086- let bonus = $t03824038337._4
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
10871091 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10881092 }
10891093
10901094
10911095
10921096 @Callable(i)
10931097 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
10941098 then throw("denied")
10951099 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
10961100
10971101
10981102
10991103 @Callable(i)
11001104 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
11011105 then pd
11021106 else [StringEntry(k, v)]
11031107
11041108
11051109
11061110 @Callable(i)
11071111 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
11081112 then pd
11091113 else [IntegerEntry(k, v)]
11101114
11111115
11121116
11131117 @Callable(i)
11141118 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
11151119
11161120
11171121
11181122 @Callable(i)
11191123 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
11201124
11211125
11221126
11231127 @Callable(i)
11241128 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
11251129 let pr = calcPrices(amAmt, prAmt, lpAmt)
11261130 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
11271131 }
11281132
11291133
11301134
11311135 @Callable(i)
11321136 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
11331137
11341138
11351139
11361140 @Callable(i)
11371141 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
11381142
11391143
11401144
11411145 @Callable(i)
11421146 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
11431147
11441148
11451149
11461150 @Callable(i)
11471151 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, ""))
11481152
11491153
11501154
11511155 @Callable(i)
11521156 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
11531157 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
11541158 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
11551159 }
11561160
11571161
11581162
11591163 @Callable(i)
11601164 func getFeeREADONLY () = $Tuple2(nil, fee)
11611165
11621166
11631167 @Verifier(tx)
11641168 func verify () = {
11651169 let targetPublicKey = match m() {
11661170 case pk: ByteVector =>
11671171 pk
11681172 case _: Unit =>
11691173 tx.senderPublicKey
11701174 case _ =>
11711175 throw("Match error")
11721176 }
11731177 match tx {
11741178 case order: Order =>
11751179 let matcherPub = mp()
11761180 let orderValid = moa(order)
11771181 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
11781182 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
11791183 if (if (if (orderValid)
11801184 then senderValid
11811185 else false)
11821186 then matcherValid
11831187 else false)
11841188 then true
11851189 else toe(orderValid, senderValid, matcherValid)
11861190 case s: SetScriptTransaction =>
11871191 let newHash = blake2b256(value(s.script))
11881192 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
11891193 let currentHash = scriptHash(this)
11901194 if (if ((allowedHash == newHash))
11911195 then (currentHash != newHash)
11921196 else false)
11931197 then true
11941198 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
11951199 case _ =>
11961200 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
11971201 }
11981202 }
11991203

github/deemru/w8io/169f3d6 
161.19 ms