tx · 8PTiB77Uppm7wMEjwmh4aYggY3PSChJZNzWw2wPBNpeP

3MzqQ3HKdkHmJmk9mDhAeAMxmK5D2ztdAe5:  -0.14000000 Waves

2022.10.24 16:28 [2286552] smart account 3MzqQ3HKdkHmJmk9mDhAeAMxmK5D2ztdAe5 > SELF 0.00000000 Waves

{ "type": 13, "id": "8PTiB77Uppm7wMEjwmh4aYggY3PSChJZNzWw2wPBNpeP", "fee": 14000000, "feeAssetId": null, "timestamp": 1666618112591, "version": 2, "chainId": 84, "sender": "3MzqQ3HKdkHmJmk9mDhAeAMxmK5D2ztdAe5", "senderPublicKey": "FEnkfXnQZkk1FmjhH6QZqyK2taN6ngnZBexevKxouLUM", "proofs": [ "vx6eRvapozeqP5rNzmriMX3vF146sRWm18EV8A3gxLbPXPJZq1NtioDARZd6TrKb2H49bnqPGb6YvyfKYtTVL6V", "2xE8wgijn6kSDQJrJC48P1JxeeHR9vJA6Fo9r14SFx6tsw8fCQdw7j6MwXtQAL5D4bhbmxyVV6AYY7Z2pvegxdEY" ], "script": "base64:BgJKCAISBgoEAhgREhIGCgQCGBESEgYKBAIYERISBgoEAhgREhIGCgQCGBESEgYKBAIYERISBgoEAhgREhIGCgQCGBESEgYKBAIYERJMAAd2ZXJzaW9uAgUxLjAuMAAIa1ZlcnNpb24CB3ZlcnNpb24AB2tBY3RpdmUCBmFjdGl2ZQAJa0Fzc2V0SWRBAgpBX2Fzc2V0X2lkAAlrQXNzZXRJZEICCkJfYXNzZXRfaWQACWtCYWxhbmNlQQIPQV9hc3NldF9iYWxhbmNlAAlrQmFsYW5jZUICD0JfYXNzZXRfYmFsYW5jZQANa0JhbGFuY2VJbml0QQIMQV9hc3NldF9pbml0AA1rQmFsYW5jZUluaXRCAgxCX2Fzc2V0X2luaXQADWtTaGFyZUFzc2V0SWQCDnNoYXJlX2Fzc2V0X2lkABFrU2hhcmVBc3NldFN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AARrRmVlAgpjb21taXNzaW9uAAZrQ2F1c2UCDnNodXRkb3duX2NhdXNlAA1rRmlyc3RIYXJ2ZXN0Ag1maXJzdF9oYXJ2ZXN0ABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AhRmaXJzdF9oYXJ2ZXN0X2hlaWdodAALa1NoYXJlTGltaXQCHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAC2tCYXNlUGVyaW9kAgtiYXNlX3BlcmlvZAANa1BlcmlvZExlbmd0aAINcGVyaW9kX2xlbmd0aAAMa1N0YXJ0SGVpZ2h0AgxzdGFydF9oZWlnaHQADGtVU0ROQWRkcmVzcwIYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAxrRVVSTkFkZHJlc3MCFHN0YWtpbmdfZXVybl9hZGRyZXNzAA5rTGVhc2luZ0Ftb3VudAIObGVhc2luZ19hbW91bnQADGtVU0ROQXNzZXRJZAINdXNkbl9hc3NldF9pZAAMa0VVUk5Bc3NldElkAg1ldXJuX2Fzc2V0X2lkAA5rU3Rha2luZ0Fzc2V0cwIOc3Rha2luZ19hc3NldHMADWtPcmFjbGVBY3RpdmUCFGFjdGl2ZV9hbGxfY29udHJhY3RzABdrT3JhY2xlQWN0aXZlRXhjaGFuZ2VycwIYYWN0aXZlX2dsb2JhbF9leGNoYW5nZXJzAAprRGlzY291bnRzAglkaXNjb3VudHMAD2tEaXNjb3VudFZhbHVlcwIPZGlzY291bnRfdmFsdWVzAA9rVXNlckdTd29wSW5Hb3YCDV9HU3dvcF9hbW91bnQADmtVc2VyU3dvcEluR292AgxfU1dPUF9hbW91bnQAC2tPcmFjbGVQb29sAgVwb29sXwANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAAtrR292QWRkcmVzcwISZ292ZXJuYW5jZV9hZGRyZXNzAA9rRmFybWluZ0FkZHJlc3MCD2Zhcm1pbmdfYWRkcmVzcwAGb3JhY2xlCQEHQWRkcmVzcwEBGgFUSBOXDMDTM8wlMoC2KfenZGiAq+PMe0uZARNnZXRCYXNlNThGcm9tT3JhY2xlAQNrZXkEByRtYXRjaDAJAJ0IAgUGb3JhY2xlBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQkArAICBQNrZXkCCGlzIGVtcHR5AAxhZG1pblB1YktleTEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MQAMYWRtaW5QdWJLZXkyCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTIADGFkbWluUHViS2V5MwkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkzABFhZG1pbkludm9rZVB1YktleQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRJrQWRtaW5JbnZva2VQdWJLZXkAD21vbmV5Qm94QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEGtNb25leUJveEFkZHJlc3MADXZvdGluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ5rVm90aW5nQWRkcmVzcwAKZ292QWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFC2tHb3ZBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwAEVVNETgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFzc2V0SWQABEVVUk4JARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa0VVUk5Bc3NldElkAA1zdGFraW5nQXNzZXRzCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFDmtTdGFraW5nQXNzZXRzABJzdGFraW5nVVNETkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrVVNETkFkZHJlc3MAEnN0YWtpbmdFVVJOQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtFVVJOQWRkcmVzcwAKYmFzZVBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFC2tCYXNlUGVyaW9kAhFFbXB0eSBrQmFzZVBlcmlvZAALc3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQxrU3RhcnRIZWlnaHQCEkVtcHR5IGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUNa1BlcmlvZExlbmd0aAITRW1wdHkga1BlcmlvZExlbmd0aAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kCQBkAgkAZAIFCmJhc2VQZXJpb2QJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAAMABmFjdGl2ZQMJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBm9yYWNsZQUNa09yYWNsZUFjdGl2ZQkBEUBleHRyTmF0aXZlKDEwNTEpAgUGb3JhY2xlBRdrT3JhY2xlQWN0aXZlRXhjaGFuZ2VycwcACWZlZVNjYWxlNgDAhD0ABnNjYWxlOACAwtcvAQ5hY2NvdW50QmFsYW5jZQIHYXNzZXRJZARwb29sBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHBvb2wFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQRwb29sCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yAQxzdGFrZWRBbW91bnQCB2Fzc2V0SWQEcG9vbAQWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBANhSWQFByRtYXRjaDADCQAAAgUDYUlkBQRVU0ROCQCaCAIFEnN0YWtpbmdVU0ROQWRkcmVzcwkArAICCQCsAgIJAKwCAgIMcnBkX2JhbGFuY2VfCQDYBAEFA2FJZAIBXwkApQgBBQRwb29sAwkAAAIFA2FJZAUERVVSTgkAmggCBRJzdGFraW5nRVVSTkFkZHJlc3MJAKwCAgkArAICCQCsAgICGCVzJXMlc19fc3Rha2luZ0JhbGFuY2VfXwkA2AQBBQNhSWQCAl9fCQClCAEFBHBvb2wAAAMJAAECBQckbWF0Y2gwAgRVbml0CQELdmFsdWVPckVsc2UCCQCaCAIFBHBvb2wFDmtMZWFzaW5nQW1vdW50AAAJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZAMJAAECBQckbWF0Y2gwAgNJbnQEAWkFByRtYXRjaDAFAWkAAAEMZ2V0QXNzZXRJbmZvAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwMJAAECBQckbWF0Y2gwAgZTdHJpbmcGCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAECyR0MDQwMDU0MTc3BAckbWF0Y2gxBQJpZAMJAAECBQckbWF0Y2gxAgpCeXRlVmVjdG9yBANhSWQFByRtYXRjaDEJAJQKAgkA2AQBBQNhSWQFA2FJZAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEA2FJZAUHJG1hdGNoMQkAlAoCBQNhSWQJANkEAQUDYUlkCQACAQILTWF0Y2ggZXJyb3IECHN0cmluZ0lkCAULJHQwNDAwNTQxNzcCXzEEB2J5dGVzSWQIBQskdDA0MDA1NDE3NwJfMgQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFB2J5dGVzSWQJAKwCAgkArAICAgZBc3NldCAFCHN0cmluZ0lkAg4gZG9lc24ndCBleGlzdAkAlQoDBQhzdHJpbmdJZAgFBGluZm8EbmFtZQgFBGluZm8IZGVjaW1hbHMDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAJAJUKAwIFV0FWRVMCBVdBVkVTAAgJAAIBAgtNYXRjaCBlcnJvcgEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAEUY2FsY3VsYXRlRmVlRGlzY291bnQBCHVzZXJBZGRyBApzd29wQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgkApQgBBQh1c2VyQWRkcgUOa1VzZXJTd29wSW5Hb3YAAAQLZ1N3b3BBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKZ292QWRkcmVzcwkArAICCQClCAEFCHVzZXJBZGRyBQ9rVXNlckdTd29wSW5Hb3YAAAQOZGlzY291bnRWYWx1ZXMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQ9rRGlzY291bnRWYWx1ZXMCASwECWRpc2NvdW50cwkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQZvcmFjbGUFCmtEaXNjb3VudHMCASwDAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAAkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABBQtnU3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAAMDCQBnAgULZ1N3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIFC2dTd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwABAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAIJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwULZ1N3b3BBbW91bnQHCQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAIDAwkAZwIFC2dTd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAEBQtnU3dvcEFtb3VudAcJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMAAwMJAGcCBQtnU3dvcEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmRpc2NvdW50VmFsdWVzAAQJAGUCBQlmZWVTY2FsZTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlkaXNjb3VudHMABAUJZmVlU2NhbGU2AQ1jYWxjdWxhdGVGZWVzBglwbXRBbW91bnQSbWluQW1vdW50VG9SZWNlaXZlCXRva2VuRnJvbQd0b2tlblRvA2ZlZQ1mZWVHb3Zlcm5hbmNlBBBhbW91bnRXaXRob3V0RmVlCQBrAwUHdG9rZW5UbwUJcG10QW1vdW50CQBkAgUJcG10QW1vdW50BQl0b2tlbkZyb20EDWFtb3VudFdpdGhGZWUJAGsDBRBhbW91bnRXaXRob3V0RmVlCQBlAgUJZmVlU2NhbGU2BQNmZWUFCWZlZVNjYWxlNgQQZ292ZXJuYW5jZVJld2FyZAkAawMFEGFtb3VudFdpdGhvdXRGZWUFDWZlZUdvdmVybmFuY2UFCWZlZVNjYWxlNgMJAGYCBRJtaW5BbW91bnRUb1JlY2VpdmUFDWFtb3VudFdpdGhGZWUJAAIBCQCsAgIJAKwCAgkArAICAh1DYWxjdWxhdGVkIGFtb3VudCB0byByZWNlaXZlIAkApAMBBQ1hbW91bnRXaXRoRmVlAiAgaXMgbGVzcyB0aGFuIHNwZWNpZmllZCBtaW5pbXVtIAkApAMBBRJtaW5BbW91bnRUb1JlY2VpdmUJAJUKAwUQYW1vdW50V2l0aG91dEZlZQUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAEQY2FsY3VsYXRlVmlydEdldAMJcG10QW1vdW50B2JhbGFuY2UDZmVlBAFhAAEEAWIJAGUCCQBkAgkAZAIFB2JhbGFuY2UJAGsDBQdiYWxhbmNlCQBlAgUJZmVlU2NhbGU2BQNmZWUFCWZlZVNjYWxlNgkAawMFCXBtdEFtb3VudAkAZQIFCWZlZVNjYWxlNgUDZmVlBQlmZWVTY2FsZTYFCXBtdEFtb3VudAQBYwkAuQICCQC+AgEJALYCAQUHYmFsYW5jZQkAtgIBBQlwbXRBbW91bnQEAUQJALgCAgkAuQICCQC2AgEFAWIJALYCAQUBYgkAuQICCQC5AgIJALYCAQAECQC2AgEFAWEFAWMJAGgCCQCgAwEJALoCAgkAtwICCQC+AgEJALYCAQUBYgkAdgYFAUQAAAkAtgIBAAUAAQAABQRET1dOCQC2AgEAAgUBYQERcGFyc2VQYXltZW50QXNzZXQBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAEABQR1bml0BQdhc3NldElkARFzdXNwZW5kU3VzcGljaW91cwYPYWNjb3VudEJhbGFuY2VBD2FjY291bnRCYWxhbmNlQghiYWxhbmNlQQhiYWxhbmNlQghhc3NldElkQQhhc3NldElkQgkBB3N1c3BlbmQBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiNTdXNwaWNpb3VzIHN0YXRlLiBBY3R1YWwgYmFsYW5jZXM6IAkApAMBBQ9hY2NvdW50QmFsYW5jZUECASAFCGFzc2V0SWRBAgIsIAkApAMBBQ9hY2NvdW50QmFsYW5jZUICASAFCGFzc2V0SWRCAgkuIFN0YXRlOiAJAKQDAQUIYmFsYW5jZUECASAFCGFzc2V0SWRBAgIsIAkApAMBBQhiYWxhbmNlQgIBIAUIYXNzZXRJZEIBCGlzQWN0aXZlAAMFBmFjdGl2ZQUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBDGlzT3JhY2xlUG9vbAELcG9vbEFkZHJlc3MDCQEJaXNEZWZpbmVkAQkAnQgCBQZvcmFjbGUJAKwCAgULa09yYWNsZVBvb2wFC3Bvb2xBZGRyZXNzBQR1bml0CQACAQIbREFwcCBpcyBub3QgcmVnaXN0ZXJlZCBwb29sAQ9nZXRQb29sQmFsYW5jZXMDBHBvb2wIYXNzZXRJZEEIYXNzZXRJZEIECGJhbGFuY2VBCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sBQlrQmFsYW5jZUEECGJhbGFuY2VCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sBQlrQmFsYW5jZUIEDXN0YWtlZEFtb3VudEEJAQxzdGFrZWRBbW91bnQCBQhhc3NldElkQQUEcG9vbAQNc3Rha2VkQW1vdW50QgkBDHN0YWtlZEFtb3VudAIFCGFzc2V0SWRCBQRwb29sBA9hY2NvdW50QmFsYW5jZUEJAGQCCQEOYWNjb3VudEJhbGFuY2UCBQhhc3NldElkQQUEcG9vbAUNc3Rha2VkQW1vdW50QQQPYWNjb3VudEJhbGFuY2VCCQBkAgkBDmFjY291bnRCYWxhbmNlAgUIYXNzZXRJZEIFBHBvb2wFDXN0YWtlZEFtb3VudEIEC3NoYXJlU3VwcGx5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sBRFrU2hhcmVBc3NldFN1cHBseQkAlwoFBQhiYWxhbmNlQQUIYmFsYW5jZUIFD2FjY291bnRCYWxhbmNlQQUPYWNjb3VudEJhbGFuY2VCBQtzaGFyZVN1cHBseQENZ2V0UG9vbEFzc2V0cwEEcG9vbAQLc3RyQXNzZXRJZEEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wFCWtBc3NldElkQQQLc3RyQXNzZXRJZEIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wFCWtBc3NldElkQgQIYXNzZXRJZEEDCQAAAgULc3RyQXNzZXRJZEECBVdBVkVTBQR1bml0CQDZBAEFC3N0ckFzc2V0SWRBBAhhc3NldElkQgMJAAACBQtzdHJBc3NldElkQgIFV0FWRVMFBHVuaXQJANkEAQULc3RyQXNzZXRJZEIEDHNoYXJlQXNzZXRJZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQRwb29sBQ1rU2hhcmVBc3NldElkCQCXCgUFC3N0ckFzc2V0SWRBBQtzdHJBc3NldElkQgUIYXNzZXRJZEEFCGFzc2V0SWRCBQxzaGFyZUFzc2V0SWQBDGdldEZlZVBhcmFtcwIEcG9vbAZjYWxsZXIEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBBQZjYWxsZXIEA2ZlZQkAbgQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHBvb2wFBGtGZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcEBmdvdkZlZQkAbgQJAGsDBQNmZWUAKABkBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HCQCUCgIFA2ZlZQUGZ292RmVlCQFpAQRpbml0BAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwQGY2FsbGVyCQEHQWRkcmVzcwEFC2NhbGxlckJ5dGVzBAskdDA4OTk2OTA3NAkAlAoCCQCRAwIFCHBBbW91bnRzAAAJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAAECnBtdEFtb3VudEEIBQskdDA4OTk2OTA3NAJfMQQLcG10QXNzZXRJZEEIBQskdDA4OTk2OTA3NAJfMgQLJHQwOTA3OTkxNTcJAJQKAgkAkQMCBQhwQW1vdW50cwABCQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwABBApwbXRBbW91bnRCCAULJHQwOTA3OTkxNTcCXzEEC3BtdEFzc2V0SWRCCAULJHQwOTA3OTkxNTcCXzIDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzCQDMCAIFEWFkbWluSW52b2tlUHViS2V5BQNuaWwIBQFpFW9yaWdpbkNhbGxlclB1YmxpY0tleQkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAQlpc0RlZmluZWQBCQCbCAIFBmNhbGxlcgUHa0FjdGl2ZQkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUDCQAAAgULcG10QXNzZXRJZEEFC3BtdEFzc2V0SWRCCQACAQIYQXNzZXRzIG11c3QgYmUgZGlmZmVyZW50BAskdDA5NTI3OTYwNAkBDGdldEFzc2V0SW5mbwEFC3BtdEFzc2V0SWRBBA5wbXRTdHJBc3NldElkQQgFCyR0MDk1Mjc5NjA0Al8xBA1wbXRBc3NldE5hbWVBCAULJHQwOTUyNzk2MDQCXzIEDHBtdERlY2ltYWxzQQgFCyR0MDk1Mjc5NjA0Al8zBAskdDA5NjEzOTY5MAkBDGdldEFzc2V0SW5mbwEFC3BtdEFzc2V0SWRCBA5wbXRTdHJBc3NldElkQggFCyR0MDk2MTM5NjkwAl8xBA1wbXRBc3NldE5hbWVCCAULJHQwOTYxMzk2OTACXzIEDHBtdERlY2ltYWxzQggFCyR0MDk2MTM5NjkwAl8zBAxmaXJzdEhhcnZlc3QJAAACCQCRAwIFBGFyZ3MAAAIEdHJ1ZQQJc2hhcmVOYW1lCQCsAgIJAKwCAgkArAICAgFzCQCvAgIFDXBtdEFzc2V0TmFtZUEABwIBXwkArwICBQ1wbXRBc3NldE5hbWVCAAcEEHNoYXJlRGVzY3JpcHRpb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQ1wbXRBc3NldE5hbWVBAgUgYW5kIAUNcG10QXNzZXROYW1lQgIMIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMEDXNoYXJlRGVjaW1hbHMJAGkCCQBkAgUMcG10RGVjaW1hbHNBBQxwbXREZWNpbWFsc0IAAgQEYXJnMQkAbAYFCnBtdEFtb3VudEEFDHBtdERlY2ltYWxzQQAFAAEFDHBtdERlY2ltYWxzQQUERE9XTgQEYXJnMgkAbAYFCnBtdEFtb3VudEIFDHBtdERlY2ltYWxzQgAFAAEFDHBtdERlY2ltYWxzQgUERE9XTgQEYXJnMwkAbAYACgAABQ1zaGFyZURlY2ltYWxzAAAAAAUERE9XTgQSc2hhcmVJbml0aWFsU3VwcGx5CQBrAwUEYXJnMQUEYXJnMgUEYXJnMwQKc2hhcmVJc3N1ZQkAwggFBQlzaGFyZU5hbWUFEHNoYXJlRGVzY3JpcHRpb24FEnNoYXJlSW5pdGlhbFN1cHBseQUNc2hhcmVEZWNpbWFscwYEDHNoYXJlSXNzdWVJZAkAuAgBBQpzaGFyZUlzc3VlBAZzdGFrZTEDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQ5wbXRTdHJBc3NldElkQQkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQpwbXRBbW91bnRBCQDMCAIFDnBtdFN0ckFzc2V0SWRBBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMQUGc3Rha2UxBAZzdGFrZTIDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQ5wbXRTdHJBc3NldElkQgkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQpwbXRBbW91bnRCCQDMCAIFDnBtdFN0ckFzc2V0SWRCBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMgUGc3Rha2UyBAliYXNlRW50cnkJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa1ZlcnNpb24FB3ZlcnNpb24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBc3NldElkQQUOcG10U3RyQXNzZXRJZEEJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa0Fzc2V0SWRCBQ5wbXRTdHJBc3NldElkQgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBBQpwbXRBbW91bnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIFCnBtdEFtb3VudEIJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfY3BtbQkAzAgCBQpzaGFyZUlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtTaGFyZUFzc2V0SWQJANgEAQUMc2hhcmVJc3N1ZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQUSc2hhcmVJbml0aWFsU3VwcGx5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUSc2hhcmVJbml0aWFsU3VwcGx5BQxzaGFyZUlzc3VlSWQFA25pbAMFDGZpcnN0SGFydmVzdAkAlAoCBQNuaWwJAJQKAgkAzggCBQliYXNlRW50cnkJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtGaXJzdEhhcnZlc3QFDGZpcnN0SGFydmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa0ZpcnN0SGFydmVzdEhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0CQBoAgUVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kBQxwZXJpb2RMZW5ndGgFA25pbAUDbmlsCQCUCgIFA25pbAkAlAoCBQliYXNlRW50cnkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFpbml0V2l0aEluaXRSYXRpbwQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMEBmNhbGxlcgkBB0FkZHJlc3MBBQtjYWxsZXJCeXRlcwQNJHQwMTE5MzUxMjEzNQkAlwoFCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwABCQCRAwIFBGFyZ3MAAgkAkQMCBQRhcmdzAAMJAAACCQCRAwIFBGFyZ3MABAIEdHJ1ZQQJYW10QXNzZXRBCAUNJHQwMTE5MzUxMjEzNQJfMQQJYW10QXNzZXRCCAUNJHQwMTE5MzUxMjEzNQJfMgQLYXNzZXRJZEFTdHIIBQ0kdDAxMTkzNTEyMTM1Al8zBAthc3NldElkQlN0cggFDSR0MDExOTM1MTIxMzUCXzQEDGZpcnN0SGFydmVzdAgFDSR0MDExOTM1MTIxMzUCXzUDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzCQDMCAIFEWFkbWluSW52b2tlUHViS2V5BQNuaWwIBQFpFW9yaWdpbkNhbGxlclB1YmxpY0tleQkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAQlpc0RlZmluZWQBCQCbCAIFBmNhbGxlcgUHa0FjdGl2ZQkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUDCQAAAgULYXNzZXRJZEFTdHIFC2Fzc2V0SWRCU3RyCQACAQIYQXNzZXRzIG11c3QgYmUgZGlmZmVyZW50BA0kdDAxMjUwNTEyNTgyCQEMZ2V0QXNzZXRJbmZvAQULYXNzZXRJZEFTdHIEDnBtdFN0ckFzc2V0SWRBCAUNJHQwMTI1MDUxMjU4MgJfMQQNcG10QXNzZXROYW1lQQgFDSR0MDEyNTA1MTI1ODICXzIEDHBtdERlY2ltYWxzQQgFDSR0MDEyNTA1MTI1ODICXzMEDSR0MDEyNTkxMTI2NjgJAQxnZXRBc3NldEluZm8BBQthc3NldElkQlN0cgQOcG10U3RyQXNzZXRJZEIIBQ0kdDAxMjU5MTEyNjY4Al8xBA1wbXRBc3NldE5hbWVCCAUNJHQwMTI1OTExMjY2OAJfMgQMcG10RGVjaW1hbHNCCAUNJHQwMTI1OTExMjY2OAJfMwQJc2hhcmVOYW1lCQCsAgIJAKwCAgkArAICAgFzCQCvAgIFDXBtdEFzc2V0TmFtZUEABwIBXwkArwICBQ1wbXRBc3NldE5hbWVCAAcEEHNoYXJlRGVzY3JpcHRpb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiJTaGFyZVRva2VuIG9mIFN3b3BGaSBwcm90b2NvbCBmb3IgBQ1wbXRBc3NldE5hbWVBAgUgYW5kIAUNcG10QXNzZXROYW1lQgIMIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMEDXNoYXJlRGVjaW1hbHMJAGkCCQBkAgUMcG10RGVjaW1hbHNBBQxwbXREZWNpbWFsc0IAAgQSc2hhcmVJbml0aWFsU3VwcGx5AAAECnNoYXJlSXNzdWUJAMIIBQUJc2hhcmVOYW1lBRBzaGFyZURlc2NyaXB0aW9uBRJzaGFyZUluaXRpYWxTdXBwbHkFDXNoYXJlRGVjaW1hbHMGBAxzaGFyZUlzc3VlSWQJALgIAQUKc2hhcmVJc3N1ZQQJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELU3RyaW5nRW50cnkCBQlrQXNzZXRJZEEFDnBtdFN0ckFzc2V0SWRBCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBc3NldElkQgUOcG10U3RyQXNzZXRJZEIJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtCYWxhbmNlSW5pdEEFCWFtdEFzc2V0QQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa0JhbGFuY2VJbml0QgUJYW10QXNzZXRCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFBGtGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQINYmFzZV9mZWVfY3BtbQkAzAgCBQpzaGFyZUlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtTaGFyZUFzc2V0SWQJANgEAQUMc2hhcmVJc3N1ZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQUSc2hhcmVJbml0aWFsU3VwcGx5BQNuaWwDBQxmaXJzdEhhcnZlc3QJAJQKAgUDbmlsCQCUCgIJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rRmlyc3RIYXJ2ZXN0BQxmaXJzdEhhcnZlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tGaXJzdEhhcnZlc3RIZWlnaHQJAGQCBQtzdGFydEhlaWdodAkAaAIFFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUMcGVyaW9kTGVuZ3RoBQNuaWwFA25pbAkAlAoCBQNuaWwJAJQKAgUJYmFzZUVudHJ5BQNuaWwBaQEYa2VlcExpbWl0Rm9yRmlyc3RIYXJ2ZXN0BAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwkAzAgCBRFhZG1pbkludm9rZVB1YktleQUDbmlsCAUBaRVvcmlnaW5DYWxsZXJQdWJsaWNLZXkJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24ECnNoYXJlTGltaXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRhcmdzAAAJAJQKAgUDbmlsCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tTaGFyZUxpbWl0BQpzaGFyZUxpbWl0BQNuaWwFA25pbAFpAQhleGNoYW5nZQQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMJAQt2YWx1ZU9yRWxzZQIJAQxpc09yYWNsZVBvb2wBCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQGY2FsbGVyCQEHQWRkcmVzcwEFC2NhbGxlckJ5dGVzBA0kdDAxNDk5MzE1MDY5CQCUCgIJAJEDAgUIcEFtb3VudHMAAAkBEXBhcnNlUGF5bWVudEFzc2V0AQkAkQMCBQlwQXNzZXRJZHMAAAQJcG10QW1vdW50CAUNJHQwMTQ5OTMxNTA2OQJfMQQKcG10QXNzZXRJZAgFDSR0MDE0OTkzMTUwNjkCXzIEEm1pbkFtb3VudFRvUmVjZWl2ZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAAQNJHQwMTUxNDIxNTIxOAkBDWdldFBvb2xBc3NldHMBCAUBaQZjYWxsZXIEC3N0ckFzc2V0SWRBCAUNJHQwMTUxNDIxNTIxOAJfMQQLc3RyQXNzZXRJZEIIBQ0kdDAxNTE0MjE1MjE4Al8yBAhhc3NldElkQQgFDSR0MDE1MTQyMTUyMTgCXzMECGFzc2V0SWRCCAUNJHQwMTUxNDIxNTIxOAJfNAQNJHQwMTUyMzExNTMzNwkBD2dldFBvb2xCYWxhbmNlcwMIBQFpBmNhbGxlcgUIYXNzZXRJZEEFCGFzc2V0SWRCBAhiYWxhbmNlQQgFDSR0MDE1MjMxMTUzMzcCXzEECGJhbGFuY2VCCAUNJHQwMTUyMzExNTMzNwJfMgQPYWNjb3VudEJhbGFuY2VBCAUNJHQwMTUyMzExNTMzNwJfMwQPYWNjb3VudEJhbGFuY2VCCAUNJHQwMTUyMzExNTMzNwJfNAMDCQAAAgUIYmFsYW5jZUEAAAYJAAACBQhiYWxhbmNlQgAACQACAQIgQ2FuJ3QgZXhjaGFuZ2Ugd2l0aCB6ZXJvIGJhbGFuY2UDCQBnAgAABRJtaW5BbW91bnRUb1JlY2VpdmUJAAIBCQCsAgICNE1pbmltYWwgYW1vdW50IHRvIHJlY2VpdmUgbXVzdCBiZSBwb3NpdGl2ZS4gQWN0dWFsOiAJAKQDAQUSbWluQW1vdW50VG9SZWNlaXZlAwkBAiE9AgkAkAMBBQhwQW1vdW50cwABCQACAQIdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFCGFzc2V0SWRBCQDMCAIFCGFzc2V0SWRCBQNuaWwFCnBtdEFzc2V0SWQJAAIBCQCsAgIJAKwCAgkArAICAiRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAFC3N0ckFzc2V0SWRBAgQgb3IgBQtzdHJBc3NldElkQgMDCQBmAgUIYmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQQYJAGYCBQhiYWxhbmNlQgUPYWNjb3VudEJhbGFuY2VCCQCUCgIFA25pbAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUJcG10QW1vdW50BQpwbXRBc3NldElkBQNuaWwJARFzdXNwZW5kU3VzcGljaW91cwYFD2FjY291bnRCYWxhbmNlQQUPYWNjb3VudEJhbGFuY2VCBQhiYWxhbmNlQQUIYmFsYW5jZUIFC3N0ckFzc2V0SWRBBQtzdHJBc3NldElkQgQNJHQwMTYyMjIxNjI4MAkBDGdldEZlZVBhcmFtcwIIBQFpBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyBANmZWUIBQ0kdDAxNjIyMjE2MjgwAl8xBAZnb3ZGZWUIBQ0kdDAxNjIyMjE2MjgwAl8yBA0kdDAxNjI5NzE2NjM0AwkAAAIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQENY2FsY3VsYXRlRmVlcwYFCXBtdEFtb3VudAUSbWluQW1vdW50VG9SZWNlaXZlBQhiYWxhbmNlQQUIYmFsYW5jZUIFA2ZlZQUGZ292RmVlCQENY2FsY3VsYXRlRmVlcwYFCXBtdEFtb3VudAUSbWluQW1vdW50VG9SZWNlaXZlBQhiYWxhbmNlQgUIYmFsYW5jZUEFA2ZlZQUGZ292RmVlBBBhbW91bnRXaXRob3V0RmVlCAUNJHQwMTYyOTcxNjYzNAJfMQQNYW1vdW50V2l0aEZlZQgFDSR0MDE2Mjk3MTY2MzQCXzIEEGdvdmVybmFuY2VSZXdhcmQIBQ0kdDAxNjI5NzE2NjM0Al8zBA0kdDAxNjY1MjE2OTc3AwkAAAIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQCVCgMJAGQCBQhiYWxhbmNlQQUJcG10QW1vdW50CQBlAgkAZQIFCGJhbGFuY2VCBQ1hbW91bnRXaXRoRmVlBRBnb3Zlcm5hbmNlUmV3YXJkBQhhc3NldElkQgkAlQoDCQBlAgkAZQIFCGJhbGFuY2VBBQ1hbW91bnRXaXRoRmVlBRBnb3Zlcm5hbmNlUmV3YXJkCQBkAgUIYmFsYW5jZUIFCXBtdEFtb3VudAUIYXNzZXRJZEEEC25ld0JhbGFuY2VBCAUNJHQwMTY2NTIxNjk3NwJfMQQLbmV3QmFsYW5jZUIIBQ0kdDAxNjY1MjE2OTc3Al8yBAthc3NldElkU2VuZAgFDSR0MDE2NjUyMTY5NzcCXzMEDSR0MDE2OTk1MTcyNDUDCQAAAgUKcG10QXNzZXRJZAUIYXNzZXRJZEEJAJQKAgUJcG10QW1vdW50CQBkAgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAkAlAoCCQBkAgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAUJcG10QW1vdW50BAxzdGFrZUFtb3VudEEIBQ0kdDAxNjk5NTE3MjQ1Al8xBAxzdGFrZUFtb3VudEIIBQ0kdDAxNjk5NTE3MjQ1Al8yBAZzdGFrZTEDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQQkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCCQAAAgUKcG10QXNzZXRJZAUIYXNzZXRJZEEJAMwIAgUMc3Rha2VBbW91bnRBCQDMCAIFC3N0ckFzc2V0SWRBBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMQUGc3Rha2UxBAZzdGFrZTIDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQgkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCCQAAAgUKcG10QXNzZXRJZAUIYXNzZXRJZEIJAMwIAgUMc3Rha2VBbW91bnRCCQDMCAIFC3N0ckFzc2V0SWRCBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMgUGc3Rha2UyCQCUCgIFA25pbAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEFC25ld0JhbGFuY2VBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIFC25ld0JhbGFuY2VCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUNYW1vdW50V2l0aEZlZQULYXNzZXRJZFNlbmQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBRBnb3Zlcm5hbmNlUmV3YXJkBQthc3NldElkU2VuZAUDbmlsCQDMCAIFDWFtb3VudFdpdGhGZWUJAMwIAgULYXNzZXRJZFNlbmQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zBAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEC3BtdEFzc2V0SWRBCQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwAABAtwbXRBc3NldElkQgkBEXBhcnNlUGF5bWVudEFzc2V0AQkAkQMCBQlwQXNzZXRJZHMAAQQMc3Rha2VGYXJtaW5nCQAAAgkAkQMCBQRhcmdzAAACBHRydWUECGxvY2tUeXBlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwABBA0kdDAxODUwODE4NTk4CQENZ2V0UG9vbEFzc2V0cwEIBQFpBmNhbGxlcgQLc3RyQXNzZXRJZEEIBQ0kdDAxODUwODE4NTk4Al8xBAtzdHJBc3NldElkQggFDSR0MDE4NTA4MTg1OTgCXzIECGFzc2V0SWRBCAUNJHQwMTg1MDgxODU5OAJfMwQIYXNzZXRJZEIIBQ0kdDAxODUwODE4NTk4Al80BAxzaGFyZUFzc2V0SWQIBQ0kdDAxODUwODE4NTk4Al81BA0kdDAxODYxMTE4NzM1CQEPZ2V0UG9vbEJhbGFuY2VzAwgFAWkGY2FsbGVyBQhhc3NldElkQQUIYXNzZXRJZEIECGJhbGFuY2VBCAUNJHQwMTg2MTExODczNQJfMQQIYmFsYW5jZUIIBQ0kdDAxODYxMTE4NzM1Al8yBA9hY2NvdW50QmFsYW5jZUEIBQ0kdDAxODYxMTE4NzM1Al8zBA9hY2NvdW50QmFsYW5jZUIIBQ0kdDAxODYxMTE4NzM1Al80BBBzaGFyZUFzc2V0U3VwcGx5CAUNJHQwMTg2MTExODczNQJfNQMDCQECIT0CCQCQAwEFCHBBbW91bnRzAAIJAQIhPQIJAJADAQUIcEFtb3VudHMAAwcJAAIBAh5Ud28gb3IgdGhyZWUgcGF5bWVudHMgZXhwZWN0ZWQDAwkBAiE9AgULcG10QXNzZXRJZEEFCGFzc2V0SWRBBgkBAiE9AgULcG10QXNzZXRJZEIFCGFzc2V0SWRCCQACAQkArAICCQCsAgIJAKwCAgIlSW5jb3JyZWN0IGFzc2V0cyBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAULc3RyQXNzZXRJZEECBSBhbmQgBQtzdHJBc3NldElkQgMDCQBmAgUIYmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQQYJAGYCBQhiYWxhbmNlQgUPYWNjb3VudEJhbGFuY2VCCQCUCgIFA25pbAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgkAkQMCBQhwQW1vdW50cwAABQtwbXRBc3NldElkQQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIJAJEDAgUIcEFtb3VudHMAAQULcG10QXNzZXRJZEIFA25pbAkBEXN1c3BlbmRTdXNwaWNpb3VzBgUPYWNjb3VudEJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUIFCGJhbGFuY2VBBQhiYWxhbmNlQgULc3RyQXNzZXRJZEEFC3N0ckFzc2V0SWRCBA0kdDAxOTQzMzE5NTEwCQEMZ2V0QXNzZXRJbmZvAQULcG10QXNzZXRJZEEEDnBtdFN0ckFzc2V0SWRBCAUNJHQwMTk0MzMxOTUxMAJfMQQNcG10QXNzZXROYW1lQQgFDSR0MDE5NDMzMTk1MTACXzIEDHBtdERlY2ltYWxzQQgFDSR0MDE5NDMzMTk1MTACXzMEDSR0MDE5NTI3MTk2MDQJAQxnZXRBc3NldEluZm8BBQtwbXRBc3NldElkQgQOcG10U3RyQXNzZXRJZEIIBQ0kdDAxOTUyNzE5NjA0Al8xBA1wbXRBc3NldE5hbWVCCAUNJHQwMTk1MjcxOTYwNAJfMgQMcG10RGVjaW1hbHNCCAUNJHQwMTk1MjcxOTYwNAJfMwQHaW5pdGlhbAkAAAIJAGQCBQhiYWxhbmNlQQUIYmFsYW5jZUIAAAQNJHQwMTk2NzkyMDUyMgMFB2luaXRpYWwJAJcKBQkAkQMCBQhwQW1vdW50cwAACQCRAwIFCHBBbW91bnRzAAEAAAULcG10QXNzZXRJZEEAAQQTcmF0aW9TaGFyZVRva2Vuc0luQQkAawMFBnNjYWxlOAkAkQMCBQhwQW1vdW50cwAABQhiYWxhbmNlQQQTcmF0aW9TaGFyZVRva2Vuc0luQgkAawMFBnNjYWxlOAkAkQMCBQhwQW1vdW50cwABBQhiYWxhbmNlQgMJAGYCBRNyYXRpb1NoYXJlVG9rZW5zSW5CBRNyYXRpb1NoYXJlVG9rZW5zSW5BBANwbXQJAGsDCQCRAwIFCHBBbW91bnRzAAAFCGJhbGFuY2VCBQhiYWxhbmNlQQkAlwoFCQCRAwIFCHBBbW91bnRzAAAFA3BtdAkAZQIJAJEDAgUIcEFtb3VudHMAAQUDcG10BQtwbXRBc3NldElkQgUTcmF0aW9TaGFyZVRva2Vuc0luQQQDcG10CQBrAwkAkQMCBQhwQW1vdW50cwABBQhiYWxhbmNlQQUIYmFsYW5jZUIJAJcKBQUDcG10CQCRAwIFCHBBbW91bnRzAAEJAGUCCQCRAwIFCHBBbW91bnRzAAAFA3BtdAULcG10QXNzZXRJZEEFE3JhdGlvU2hhcmVUb2tlbnNJbkIECnBtdEFtb3VudEEIBQ0kdDAxOTY3OTIwNTIyAl8xBApwbXRBbW91bnRCCAUNJHQwMTk2NzkyMDUyMgJfMgQGY2hhbmdlCAUNJHQwMTk2NzkyMDUyMgJfMwQNY2hhbmdlQXNzZXRJZAgFDSR0MDE5Njc5MjA1MjICXzQED3NoYXJlVG9rZW5SYXRpbwgFDSR0MDE5Njc5MjA1MjICXzUEFXNoYXJlVG9rZW5Ub1BheUFtb3VudAMFB2luaXRpYWwEDXNoYXJlRGVjaW1hbHMJAGkCCQBkAgUMcG10RGVjaW1hbHNBBQxwbXREZWNpbWFsc0IAAgkAawMJAGwGBQpwbXRBbW91bnRBBQxwbXREZWNpbWFsc0EABQABBQxwbXREZWNpbWFsc0EFBERPV04JAGwGBQpwbXRBbW91bnRCBQxwbXREZWNpbWFsc0IABQABBQxwbXREZWNpbWFsc0IFBERPV04JAGwGAAoAAAUNc2hhcmVEZWNpbWFscwAAAAAFBERPV04JAGsDBQ9zaGFyZVRva2VuUmF0aW8FEHNoYXJlQXNzZXRTdXBwbHkFBnNjYWxlOAMJAAACBRVzaGFyZVRva2VuVG9QYXlBbW91bnQAAAkAAgECHVRvbyBzbWFsbCBhbW91bnQgdG8gcmVwbGVuaXNoAwkAZgIAAAUGY2hhbmdlCQACAQIKQ2hhbmdlIDwgMAQGc3Rha2UxAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QQkAzAgCBQ5wbXRTdHJBc3NldElkQQUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QgkAzAgCBQ5wbXRTdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgQMc2hhcmVUb2tlblNUAwUMc3Rha2VGYXJtaW5nBApzdFBheW1lbnRzCQDOCAIJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAUVc2hhcmVUb2tlblRvUGF5QW1vdW50BQNuaWwDCQAAAgkAkAMBBQhwQW1vdW50cwADCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQCRAwIFCXBBc3NldElkcwACCQCRAwIFCHBBbW91bnRzAAIFA25pbAUDbmlsBAdyZWlzc3VlCQD8BwQIBQFpBmNhbGxlcgIRcmVpc3N1ZVNoYXJlVG9rZW4JAMwIAgUVc2hhcmVUb2tlblRvUGF5QW1vdW50BQNuaWwFA25pbAMJAAACBQdyZWlzc3VlBQdyZWlzc3VlBAZzdGFrZTMJAPwHBAUOZmFybWluZ0FkZHJlc3MCD2xvY2tTaGFyZVRva2VucwkAzAgCCQClCAEIBQFpBmNhbGxlcgkAzAgCBQhsb2NrVHlwZQUDbmlsBQpzdFBheW1lbnRzAwkAAAIFBnN0YWtlMwUGc3Rha2UzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBB1JlaXNzdWUDBQxzaGFyZUFzc2V0SWQFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFDHNoYXJlQXNzZXRJZAUDbmlsCQCUCgIFA25pbAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQQkAZAIFCGJhbGFuY2VBBQpwbXRBbW91bnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIJAGQCBQhiYWxhbmNlQgUKcG10QW1vdW50QgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBRBzaGFyZUFzc2V0U3VwcGx5BRVzaGFyZVRva2VuVG9QYXlBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQZjaGFuZ2UFDWNoYW5nZUFzc2V0SWQFA25pbAUMc2hhcmVUb2tlblNUBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVcmVwbGVuaXNoV2l0aE9uZVRva2VuBAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMECnBtdEFzc2V0SWQJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAAECXBtdEFtb3VudAkAkQMCBQhwQW1vdW50cwAABBB2aXJ0R2V0TWluQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwAABAxzdGFrZUZhcm1pbmcJAAACCQCRAwIFBGFyZ3MAAQIEdHJ1ZQQIbG9ja1R5cGUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRhcmdzAAEEDSR0MDIzMzYzMjM0NTMJAQ1nZXRQb29sQXNzZXRzAQgFAWkGY2FsbGVyBAtzdHJBc3NldElkQQgFDSR0MDIzMzYzMjM0NTMCXzEEC3N0ckFzc2V0SWRCCAUNJHQwMjMzNjMyMzQ1MwJfMgQIYXNzZXRJZEEIBQ0kdDAyMzM2MzIzNDUzAl8zBAhhc3NldElkQggFDSR0MDIzMzYzMjM0NTMCXzQEDHNoYXJlQXNzZXRJZAgFDSR0MDIzMzYzMjM0NTMCXzUEDSR0MDIzNDY2MjM1OTAJAQ9nZXRQb29sQmFsYW5jZXMDCAUBaQZjYWxsZXIFCGFzc2V0SWRBBQhhc3NldElkQgQIYmFsYW5jZUEIBQ0kdDAyMzQ2NjIzNTkwAl8xBAhiYWxhbmNlQggFDSR0MDIzNDY2MjM1OTACXzIED2FjY291bnRCYWxhbmNlQQgFDSR0MDIzNDY2MjM1OTACXzMED2FjY291bnRCYWxhbmNlQggFDSR0MDIzNDY2MjM1OTACXzQEEHNoYXJlQXNzZXRTdXBwbHkIBQ0kdDAyMzQ2NjIzNTkwAl81BAdpbml0aWFsCQAAAgkAZAIFCGJhbGFuY2VBBQhiYWxhbmNlQgAAAwMJAQIhPQIJAJADAQUIcEFtb3VudHMAAQkBAiE9AgkAkAMBBQhwQW1vdW50cwACBwkAAgECI1R3byBvciBvbmUgYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAQIhPQIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQECIT0CBQpwbXRBc3NldElkBQhhc3NldElkQgcJAAIBCQCsAgIJAKwCAgkArAICAiRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAFC3N0ckFzc2V0SWRBAgQgb3IgBQtzdHJBc3NldElkQgMFB2luaXRpYWwJAAIBAjBGb3IgaW5pdGlhbCBleGNoYW5nZXIgeW91IG5lZWQgdG8gdXNlIHR3byB0b2tlbnMDAwkAZgIFCGJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUEGCQBmAgUIYmFsYW5jZUIFD2FjY291bnRCYWxhbmNlQgkAlAoCBQNuaWwJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXBtdEFtb3VudAUKcG10QXNzZXRJZAUDbmlsCQERc3VzcGVuZFN1c3BpY2lvdXMGBQ9hY2NvdW50QmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQgUIYmFsYW5jZUEFCGJhbGFuY2VCBQtzdHJBc3NldElkQQULc3RyQXNzZXRJZEIEDSR0MDI0Mzc1MjQ0MzMJAQxnZXRGZWVQYXJhbXMCCAUBaQZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQDZmVlCAUNJHQwMjQzNzUyNDQzMwJfMQQGZ292RmVlCAUNJHQwMjQzNzUyNDQzMwJfMgQNJHQwMjQ0NTAyNjMzNgMJAAACBQpwbXRBc3NldElkBQhhc3NldElkQQQNdmlydFBheUFtb3VudAkBEGNhbGN1bGF0ZVZpcnRHZXQDBQlwbXRBbW91bnQFCGJhbGFuY2VBBQNmZWUEDSR0MDI0NzI5MjQ4NjYJAQ1jYWxjdWxhdGVGZWVzBgUNdmlydFBheUFtb3VudAUQdmlydEdldE1pbkFtb3VudAUIYmFsYW5jZUEFCGJhbGFuY2VCBQNmZWUFBmdvdkZlZQQQYW1vdW50V2l0aG91dEZlZQgFDSR0MDI0NzI5MjQ4NjYCXzEEDWFtb3VudFdpdGhGZWUIBQ0kdDAyNDcyOTI0ODY2Al8yBBBnb3Zlcm5hbmNlUmV3YXJkCAUNJHQwMjQ3MjkyNDg2NgJfMwQLbmV3QmFsYW5jZUEJAGQCBQhiYWxhbmNlQQUJcG10QW1vdW50BAtuZXdCYWxhbmNlQgkAZQIFCGJhbGFuY2VCBRBnb3Zlcm5hbmNlUmV3YXJkBBNyYXRpb1NoYXJlVG9rZW5zSW5BCQBrAwkAZQIFCXBtdEFtb3VudAUNdmlydFBheUFtb3VudAUGc2NhbGU4BQtuZXdCYWxhbmNlQQQTcmF0aW9TaGFyZVRva2Vuc0luQgkAawMFDWFtb3VudFdpdGhGZWUFBnNjYWxlOAULbmV3QmFsYW5jZUIEFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAawMJAJcDAQkAzAgCBRNyYXRpb1NoYXJlVG9rZW5zSW5BCQDMCAIFE3JhdGlvU2hhcmVUb2tlbnNJbkIFA25pbAUQc2hhcmVBc3NldFN1cHBseQUGc2NhbGU4CQCZCgcFC25ld0JhbGFuY2VBBQtuZXdCYWxhbmNlQgUVc2hhcmVUb2tlblRvUGF5QW1vdW50BRBnb3Zlcm5hbmNlUmV3YXJkBQhhc3NldElkQgULc3RyQXNzZXRJZEIFC3N0ckFzc2V0SWRBBA12aXJ0UGF5QW1vdW50CQEQY2FsY3VsYXRlVmlydEdldAMFCXBtdEFtb3VudAUIYmFsYW5jZUIFA2ZlZQQNJHQwMjU2MDEyNTczOAkBDWNhbGN1bGF0ZUZlZXMGBQ12aXJ0UGF5QW1vdW50BRB2aXJ0R2V0TWluQW1vdW50BQhiYWxhbmNlQgUIYmFsYW5jZUEFA2ZlZQUGZ292RmVlBBBhbW91bnRXaXRob3V0RmVlCAUNJHQwMjU2MDEyNTczOAJfMQQNYW1vdW50V2l0aEZlZQgFDSR0MDI1NjAxMjU3MzgCXzIEEGdvdmVybmFuY2VSZXdhcmQIBQ0kdDAyNTYwMTI1NzM4Al8zBAtuZXdCYWxhbmNlQQkAZQIFCGJhbGFuY2VBBRBnb3Zlcm5hbmNlUmV3YXJkBAtuZXdCYWxhbmNlQgkAZAIFCGJhbGFuY2VCBQlwbXRBbW91bnQEE3JhdGlvU2hhcmVUb2tlbnNJbkEJAGsDBQ1hbW91bnRXaXRoRmVlBQZzY2FsZTgFC25ld0JhbGFuY2VBBBNyYXRpb1NoYXJlVG9rZW5zSW5CCQBrAwkAZQIFCXBtdEFtb3VudAUNdmlydFBheUFtb3VudAUGc2NhbGU4BQtuZXdCYWxhbmNlQgQVc2hhcmVUb2tlblRvUGF5QW1vdW50CQBrAwkAlwMBCQDMCAIFE3JhdGlvU2hhcmVUb2tlbnNJbkEJAMwIAgUTcmF0aW9TaGFyZVRva2Vuc0luQgUDbmlsBRBzaGFyZUFzc2V0U3VwcGx5BQZzY2FsZTgJAJkKBwULbmV3QmFsYW5jZUEFC25ld0JhbGFuY2VCBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFEGdvdmVybmFuY2VSZXdhcmQFCGFzc2V0SWRBBQtzdHJBc3NldElkQQULc3RyQXNzZXRJZEIEC25ld0JhbGFuY2VBCAUNJHQwMjQ0NTAyNjMzNgJfMQQLbmV3QmFsYW5jZUIIBQ0kdDAyNDQ1MDI2MzM2Al8yBBVzaGFyZVRva2VuVG9QYXlBbW91bnQIBQ0kdDAyNDQ1MDI2MzM2Al8zBAlnb3ZSZXdhcmQIBQ0kdDAyNDQ1MDI2MzM2Al80BA5nb3ZSZXdhcmRBc3NldAgFDSR0MDI0NDUwMjYzMzYCXzUEEWdvdlJld2FyZEFzc2V0U3RyCAUNJHQwMjQ0NTAyNjMzNgJfNgQNcG10QXNzZXRJZFN0cggFDSR0MDI0NDUwMjYzMzYCXzcDCQAAAgUVc2hhcmVUb2tlblRvUGF5QW1vdW50AAAJAAIBAh1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAQGc3Rha2UxAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUNcG10QXNzZXRJZFN0cgkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQlwbXRBbW91bnQJAMwIAgUNcG10QXNzZXRJZFN0cgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwURZ292UmV3YXJkQXNzZXRTdHIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgUJZ292UmV3YXJkCQDMCAIFEWdvdlJld2FyZEFzc2V0U3RyBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMgUGc3Rha2UyBAxzaGFyZVRva2VuU1QDBQxzdGFrZUZhcm1pbmcECnN0UGF5bWVudHMJAM4IAgkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFA25pbAMJAAACCQCQAwEFCHBBbW91bnRzAAIJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAJEDAgUJcEFzc2V0SWRzAAEJAJEDAgUIcEFtb3VudHMAAQUDbmlsBQNuaWwEB3JlaXNzdWUJAPwHBAgFAWkGY2FsbGVyAhFyZWlzc3VlU2hhcmVUb2tlbgkAzAgCBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFA25pbAUDbmlsAwkAAAIFB3JlaXNzdWUFB3JlaXNzdWUEBnN0YWtlMwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIPbG9ja1NoYXJlVG9rZW5zCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFCGxvY2tUeXBlBQNuaWwFCnN0UGF5bWVudHMDCQAAAgUGc3Rha2UzBQZzdGFrZTMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUMc2hhcmVBc3NldElkBQNuaWwJAJQKAgUDbmlsCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBBQtuZXdCYWxhbmNlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCBQtuZXdCYWxhbmNlQgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBRBzaGFyZUFzc2V0U3VwcGx5BRVzaGFyZVRva2VuVG9QYXlBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQlnb3ZSZXdhcmQFDmdvdlJld2FyZEFzc2V0BQNuaWwFDHNoYXJlVG9rZW5TVAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3BAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEDSR0MDI4MzgzMjg0NzMJAQ1nZXRQb29sQXNzZXRzAQgFAWkGY2FsbGVyBAtzdHJBc3NldElkQQgFDSR0MDI4MzgzMjg0NzMCXzEEC3N0ckFzc2V0SWRCCAUNJHQwMjgzODMyODQ3MwJfMgQIYXNzZXRJZEEIBQ0kdDAyODM4MzI4NDczAl8zBAhhc3NldElkQggFDSR0MDI4MzgzMjg0NzMCXzQEDHNoYXJlQXNzZXRJZAgFDSR0MDI4MzgzMjg0NzMCXzUEDSR0MDI4NDg2Mjg2MTAJAQ9nZXRQb29sQmFsYW5jZXMDCAUBaQZjYWxsZXIFCGFzc2V0SWRBBQhhc3NldElkQgQIYmFsYW5jZUEIBQ0kdDAyODQ4NjI4NjEwAl8xBAhiYWxhbmNlQggFDSR0MDI4NDg2Mjg2MTACXzIED2FjY291bnRCYWxhbmNlQQgFDSR0MDI4NDg2Mjg2MTACXzMED2FjY291bnRCYWxhbmNlQggFDSR0MDI4NDg2Mjg2MTACXzQEEHNoYXJlQXNzZXRTdXBwbHkIBQ0kdDAyODQ4NjI4NjEwAl81BA0kdDAyODYyMzI5MDMxAwkAAAIJAJADAQUIcEFtb3VudHMAAQQGcEFzc2V0CQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwAAAwkBAiE9AgUGcEFzc2V0BQxzaGFyZUFzc2V0SWQJAAIBCQCsAgICJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAkA2AQBBQxzaGFyZUFzc2V0SWQJAJQKAgkAkQMCBQhwQW1vdW50cwAABQZwQXNzZXQJAJQKAgAABQxzaGFyZUFzc2V0SWQECXBtdEFtb3VudAgFDSR0MDI4NjIzMjkwMzECXzEECnBtdEFzc2V0SWQIBQ0kdDAyODYyMzI5MDMxAl8yAwkAZgIJAJADAQUIcEFtb3VudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwMJAGYCBQhiYWxhbmNlQQUPYWNjb3VudEJhbGFuY2VBBgkAZgIFCGJhbGFuY2VCBQ9hY2NvdW50QmFsYW5jZUIJAJQKAgUDbmlsCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQlwbXRBbW91bnQFCnBtdEFzc2V0SWQFA25pbAkBEXN1c3BlbmRTdXNwaWNpb3VzBgUPYWNjb3VudEJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUIFCGJhbGFuY2VBBQhiYWxhbmNlQgULc3RyQXNzZXRJZEEFC3N0ckFzc2V0SWRCBAx1bmxvY2tBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkBC3ZhbHVlT3JFbHNlAgkAkQMCBQRhcmdzAAACATAEBnVubG9jawMJAGYCBQx1bmxvY2tBbW91bnQAAAkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEIBQFpBmNhbGxlcgkAzAgCBQx1bmxvY2tBbW91bnQFA25pbAUDbmlsAAADCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUJcG10QW1vdW50BQx1bmxvY2tBbW91bnQEDGFtb3VudFRvUGF5QQkAawMFDndpdGhkcmF3QW1vdW50BQhiYWxhbmNlQQUQc2hhcmVBc3NldFN1cHBseQQMYW1vdW50VG9QYXlCCQBrAwUOd2l0aGRyYXdBbW91bnQFCGJhbGFuY2VCBRBzaGFyZUFzc2V0U3VwcGx5BAZzdGFrZTEDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQQkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBwkAzAgCBQxhbW91bnRUb1BheUEJAMwIAgULc3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UxBQZzdGFrZTEEBnN0YWtlMgMJAQhjb250YWlucwIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRCCQD8BwQIBQFpBmNhbGxlcgIMc3Rha2VVbnN0YWtlCQDMCAIHCQDMCAIFDGFtb3VudFRvUGF5QgkAzAgCBQtzdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUMdW5sb2NrQW1vdW50BQxzaGFyZUFzc2V0SWQFA25pbAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEJAGUCBQhiYWxhbmNlQQUMYW1vdW50VG9QYXlBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIJAGUCBQhiYWxhbmNlQgUMYW1vdW50VG9QYXlCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFEHNoYXJlQXNzZXRTdXBwbHkFDndpdGhkcmF3QW1vdW50CQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFDGFtb3VudFRvUGF5QQUIYXNzZXRJZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQxhbW91bnRUb1BheUIFCGFzc2V0SWRCBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARB3aXRoZHJhd09uZVRva2VuBAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEDXdpdGhkcmF3QXNzZXQDCQAAAgkAkQMCBQRhcmdzAAACAAUEdW5pdAkA2QQBCQCRAwIFBGFyZ3MAAAQNJHQwMzEyMzkzMTMyOQkBDWdldFBvb2xBc3NldHMBCAUBaQZjYWxsZXIEC3N0ckFzc2V0SWRBCAUNJHQwMzEyMzkzMTMyOQJfMQQLc3RyQXNzZXRJZEIIBQ0kdDAzMTIzOTMxMzI5Al8yBAhhc3NldElkQQgFDSR0MDMxMjM5MzEzMjkCXzMECGFzc2V0SWRCCAUNJHQwMzEyMzkzMTMyOQJfNAQMc2hhcmVBc3NldElkCAUNJHQwMzEyMzkzMTMyOQJfNQQNJHQwMzEzNDIzMTQ2NgkBD2dldFBvb2xCYWxhbmNlcwMIBQFpBmNhbGxlcgUIYXNzZXRJZEEFCGFzc2V0SWRCBAhiYWxhbmNlQQgFDSR0MDMxMzQyMzE0NjYCXzEECGJhbGFuY2VCCAUNJHQwMzEzNDIzMTQ2NgJfMgQPYWNjb3VudEJhbGFuY2VBCAUNJHQwMzEzNDIzMTQ2NgJfMwQPYWNjb3VudEJhbGFuY2VCCAUNJHQwMzEzNDIzMTQ2NgJfNAQQc2hhcmVBc3NldFN1cHBseQgFDSR0MDMxMzQyMzE0NjYCXzUEDSR0MDMxNDc5MzE4NTkDCQAAAgkAkAMBBQhwQW1vdW50cwABBAZwQXNzZXQJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAADCQECIT0CBQZwQXNzZXQFDHNoYXJlQXNzZXRJZAkAAgEJAKwCAgIkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogCQDYBAEFDHNoYXJlQXNzZXRJZAkAlAoCCQCRAwIFCHBBbW91bnRzAAAFBnBBc3NldAkAlAoCAAAFDHNoYXJlQXNzZXRJZAQJcG10QW1vdW50CAUNJHQwMzE0NzkzMTg1OQJfMQQKcG10QXNzZXRJZAgFDSR0MDMxNDc5MzE4NTkCXzIED3ZpcnRNaW5Ub1JlY2l2ZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAQMJAQIhPQIJAJADAQUIcEFtb3VudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAiE9AgUKcG10QXNzZXRJZAUMc2hhcmVBc3NldElkCQACAQkArAICAiRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAJANgEAQUMc2hhcmVBc3NldElkAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQhhc3NldElkQQkAzAgCBQhhc3NldElkQgUDbmlsBQ13aXRoZHJhd0Fzc2V0CQACAQIZSW5jb3JyZWN0IHdpdGhkcmF3IGFzc2V0LgMDCQBmAgUIYmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQQYJAGYCBQhiYWxhbmNlQgUPYWNjb3VudEJhbGFuY2VCCQCUCgIFA25pbAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUJcG10QW1vdW50BQpwbXRBc3NldElkBQNuaWwJARFzdXNwZW5kU3VzcGljaW91cwYFD2FjY291bnRCYWxhbmNlQQUPYWNjb3VudEJhbGFuY2VCBQhiYWxhbmNlQQUIYmFsYW5jZUIFC3N0ckFzc2V0SWRBBQtzdHJBc3NldElkQgQMdW5sb2NrQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAQt2YWx1ZU9yRWxzZQIJAJEDAgUEYXJncwACAgEwBAZ1bmxvY2sDCQBmAgUMdW5sb2NrQW1vdW50AAAJAPwHBAUOZmFybWluZ0FkZHJlc3MCE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAAAAwkAAAIFBnVubG9jawUGdW5sb2NrBA53aXRoZHJhd0Ftb3VudAkAZAIFCXBtdEFtb3VudAUMdW5sb2NrQW1vdW50BAxhbW91bnRUb1BheUEJAGsDBQ53aXRoZHJhd0Ftb3VudAUIYmFsYW5jZUEFEHNoYXJlQXNzZXRTdXBwbHkEDGFtb3VudFRvUGF5QgkAawMFDndpdGhkcmF3QW1vdW50BQhiYWxhbmNlQgUQc2hhcmVBc3NldFN1cHBseQQNJHQwMzMxMDQzMzE2MgkBDGdldEZlZVBhcmFtcwIIBQFpBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyBANmZWUIBQ0kdDAzMzEwNDMzMTYyAl8xBAZnb3ZGZWUIBQ0kdDAzMzEwNDMzMTYyAl8yBA0kdDAzMzE3OTMzNTc5AwkAAAIFDXdpdGhkcmF3QXNzZXQFCGFzc2V0SWRBCQENY2FsY3VsYXRlRmVlcwYFDGFtb3VudFRvUGF5QgUPdmlydE1pblRvUmVjaXZlCQBlAgUIYmFsYW5jZUIFDGFtb3VudFRvUGF5QgkAZQIFCGJhbGFuY2VBBQxhbW91bnRUb1BheUEFA2ZlZQUGZ292RmVlCQENY2FsY3VsYXRlRmVlcwYFDGFtb3VudFRvUGF5QQUPdmlydE1pblRvUmVjaXZlCQBlAgUIYmFsYW5jZUEFDGFtb3VudFRvUGF5QQkAZQIFCGJhbGFuY2VCBQxhbW91bnRUb1BheUIFA2ZlZQUGZ292RmVlBBBhbW91bnRXaXRob3V0RmVlCAUNJHQwMzMxNzkzMzU3OQJfMQQNYW1vdW50V2l0aEZlZQgFDSR0MDMzMTc5MzM1NzkCXzIEEGdvdmVybmFuY2VSZXdhcmQIBQ0kdDAzMzE3OTMzNTc5Al8zBA0kdDAzMzU5NjM0OTQyAwkAAAIFDXdpdGhkcmF3QXNzZXQFCGFzc2V0SWRBBAd1bnN0YWtlAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgkAZAIJAGQCBQxhbW91bnRUb1BheUEFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQJAMwIAgULc3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAlgoECQBlAgkAZQIJAGUCBQhiYWxhbmNlQQUMYW1vdW50VG9QYXlBBQ1hbW91bnRXaXRoRmVlBRBnb3Zlcm5hbmNlUmV3YXJkBQhiYWxhbmNlQgUIYXNzZXRJZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBkAgUMYW1vdW50VG9QYXlBBQ1hbW91bnRXaXRoRmVlBQhhc3NldElkQQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAd1bnN0YWtlAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgkAZAIJAGQCBQxhbW91bnRUb1BheUIFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQJAMwIAgULc3RyQXNzZXRJZEIFA25pbAUDbmlsAAADCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAlgoEBQhiYWxhbmNlQQkAZQIJAGUCCQBlAgUIYmFsYW5jZUIFDGFtb3VudFRvUGF5QgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAUIYXNzZXRJZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBkAgUMYW1vdW50VG9QYXlCBQ1hbW91bnRXaXRoRmVlBQhhc3NldElkQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAtuZXdCYWxhbmNlQQgFDSR0MDMzNTk2MzQ5NDICXzEEC25ld0JhbGFuY2VCCAUNJHQwMzM1OTYzNDk0MgJfMgQQZ292UmV3YXJkQXNzZXRJZAgFDSR0MDMzNTk2MzQ5NDICXzMEDHVzZXJUcmFuc2ZlcggFDSR0MDMzNTk2MzQ5NDICXzQJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDHVubG9ja0Ftb3VudAUMc2hhcmVBc3NldElkBQNuaWwJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEFC25ld0JhbGFuY2VBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIFC25ld0JhbGFuY2VCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFEHNoYXJlQXNzZXRTdXBwbHkFDndpdGhkcmF3QW1vdW50CQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MFEGdvdmVybmFuY2VSZXdhcmQFEGdvdlJld2FyZEFzc2V0SWQFA25pbAUMdXNlclRyYW5zZmVyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMJAQt2YWx1ZU9yRWxzZQIJAQxpc09yYWNsZVBvb2wBCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQNJHQwMzU2NjczNTc0MwkBDWdldFBvb2xBc3NldHMBCAUBaQZjYWxsZXIEC3N0ckFzc2V0SWRBCAUNJHQwMzU2NjczNTc0MwJfMQQLc3RyQXNzZXRJZEIIBQ0kdDAzNTY2NzM1NzQzAl8yBAhhc3NldElkQQgFDSR0MDM1NjY3MzU3NDMCXzMECGFzc2V0SWRCCAUNJHQwMzU2NjczNTc0MwJfNAQNJHQwMzU3NTYzNTg2MgkBD2dldFBvb2xCYWxhbmNlcwMIBQFpBmNhbGxlcgUIYXNzZXRJZEEFCGFzc2V0SWRCBAhiYWxhbmNlQQgFDSR0MDM1NzU2MzU4NjICXzEECGJhbGFuY2VCCAUNJHQwMzU3NTYzNTg2MgJfMgQPYWNjb3VudEJhbGFuY2VBCAUNJHQwMzU3NTYzNTg2MgJfMwQPYWNjb3VudEJhbGFuY2VCCAUNJHQwMzU3NTYzNTg2MgJfNAQNYW1vdW50RW5yb2xsQQkAZQIFD2FjY291bnRCYWxhbmNlQQUIYmFsYW5jZUEEDWFtb3VudEVucm9sbEIJAGUCBQ9hY2NvdW50QmFsYW5jZUIFCGJhbGFuY2VCAwkBAiE9AgUPbW9uZXlCb3hBZGRyZXNzCAUBaQxvcmlnaW5DYWxsZXIJAAIBAiZPbmx5IHRoZSB3YWxsZXQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMDCQBmAgAABQ1hbW91bnRFbnJvbGxBBgkAZgIAAAUNYW1vdW50RW5yb2xsQgkBB3N1c3BlbmQBAhZFbnJvbGwgYW1vdW50IG5lZ2F0aXZlAwMJAAACBQ1hbW91bnRFbnJvbGxBAAAJAAACBQ1hbW91bnRFbnJvbGxCAAAHCQACAQIQTm8gbW9uZXkgdG8gdGFrZQQGc3Rha2UxAwMJAQhjb250YWlucwIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRBCQBmAgUNYW1vdW50RW5yb2xsQQAABwkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQ1hbW91bnRFbnJvbGxBCQDMCAIFC3N0ckFzc2V0SWRBBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMQUGc3Rha2UxBAZzdGFrZTIDAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEIJAGYCBQ1hbW91bnRFbnJvbGxCAAAHCQD8BwQIBQFpBmNhbGxlcgIMc3Rha2VVbnN0YWtlCQDMCAIGCQDMCAIFDWFtb3VudEVucm9sbEIJAMwIAgULc3RyQXNzZXRJZEIFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UyBQZzdGFrZTIJAJQKAgUDbmlsCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQQkAZAIFCGJhbGFuY2VBBQ1hbW91bnRFbnJvbGxBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIJAGQCBQhiYWxhbmNlQgUNYW1vdW50RW5yb2xsQgUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIFE211bHRpU2lnbmVkQnlBZG1pbnNPGOnE", "height": 2286552, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6Ch1twG1dcQbDQGG7KUzv381N6NJFGBYT71XXfd1YobJ Next: B7e9P7PHJFgr5AWCtffp1bsgN35yv9gpSeQBNLxnWNe1 Diff:
OldNewDifferences
798798 let $t03310433162 = getFeeParams(i.caller, i.originCaller)
799799 let fee = $t03310433162._1
800800 let govFee = $t03310433162._2
801- let $t03317933519 = if ((withdrawAsset == assetIdA))
802- then calculateFees(amountToPayB, virtMinToRecive, balanceB, balanceA, fee, govFee)
803- else calculateFees(amountToPayA, virtMinToRecive, balanceA, balanceB, fee, govFee)
804- let amountWithoutFee = $t03317933519._1
805- let amountWithFee = $t03317933519._2
806- let governanceReward = $t03317933519._3
807- let $t03353634882 = if ((withdrawAsset == assetIdA))
801+ let $t03317933579 = if ((withdrawAsset == assetIdA))
802+ then calculateFees(amountToPayB, virtMinToRecive, (balanceB - amountToPayB), (balanceA - amountToPayA), fee, govFee)
803+ else calculateFees(amountToPayA, virtMinToRecive, (balanceA - amountToPayA), (balanceB - amountToPayB), fee, govFee)
804+ let amountWithoutFee = $t03317933579._1
805+ let amountWithFee = $t03317933579._2
806+ let governanceReward = $t03317933579._3
807+ let $t03359634942 = if ((withdrawAsset == assetIdA))
808808 then {
809809 let unstake = if (contains(stakingAssets, strAssetIdA))
810810 then invoke(i.caller, "stakeUnstake", [false, ((amountToPayA + amountWithFee) + governanceReward), strAssetIdA], nil)
821821 then $Tuple4(balanceA, (((balanceB - amountToPayB) - amountWithFee) - governanceReward), assetIdB, [ScriptTransfer(caller, (amountToPayB + amountWithFee), assetIdB)])
822822 else throw("Strict value is not equal to itself.")
823823 }
824- let newBalanceA = $t03353634882._1
825- let newBalanceB = $t03353634882._2
826- let govRewardAssetId = $t03353634882._3
827- let userTransfer = $t03353634882._4
824+ let newBalanceA = $t03359634942._1
825+ let newBalanceB = $t03359634942._2
826+ let govRewardAssetId = $t03359634942._3
827+ let userTransfer = $t03359634942._4
828828 $Tuple2([ScriptTransfer(i.caller, unlockAmount, shareAssetId)], $Tuple2(([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply - withdrawAmount)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceReward, govRewardAssetId)] ++ userTransfer), nil))
829829 }
830830 else throw("Strict value is not equal to itself.")
835835
836836 @Callable(i)
837837 func takeIntoAccountExtraFunds (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
838- let $t03560735683 = getPoolAssets(i.caller)
839- let strAssetIdA = $t03560735683._1
840- let strAssetIdB = $t03560735683._2
841- let assetIdA = $t03560735683._3
842- let assetIdB = $t03560735683._4
843- let $t03569635802 = getPoolBalances(i.caller, assetIdA, assetIdB)
844- let balanceA = $t03569635802._1
845- let balanceB = $t03569635802._2
846- let accountBalanceA = $t03569635802._3
847- let accountBalanceB = $t03569635802._4
838+ let $t03566735743 = getPoolAssets(i.caller)
839+ let strAssetIdA = $t03566735743._1
840+ let strAssetIdB = $t03566735743._2
841+ let assetIdA = $t03566735743._3
842+ let assetIdB = $t03566735743._4
843+ let $t03575635862 = getPoolBalances(i.caller, assetIdA, assetIdB)
844+ let balanceA = $t03575635862._1
845+ let balanceB = $t03575635862._2
846+ let accountBalanceA = $t03575635862._3
847+ let accountBalanceB = $t03575635862._4
848848 let amountEnrollA = (accountBalanceA - balanceA)
849849 let amountEnrollB = (accountBalanceB - balanceB)
850850 if ((moneyBoxAddress != i.originCaller))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kBalanceInitA = "A_asset_init"
1919
2020 let kBalanceInitB = "B_asset_init"
2121
2222 let kShareAssetId = "share_asset_id"
2323
2424 let kShareAssetSupply = "share_asset_supply"
2525
2626 let kFee = "commission"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let kFirstHarvest = "first_harvest"
3131
3232 let kFirstHarvestHeight = "first_harvest_height"
3333
3434 let kShareLimit = "share_limit_on_first_harvest"
3535
3636 let kBasePeriod = "base_period"
3737
3838 let kPeriodLength = "period_length"
3939
4040 let kStartHeight = "start_height"
4141
4242 let kUSDNAddress = "staking_usdnnsbt_address"
4343
4444 let kEURNAddress = "staking_eurn_address"
4545
4646 let kLeasingAmount = "leasing_amount"
4747
4848 let kUSDNAssetId = "usdn_asset_id"
4949
5050 let kEURNAssetId = "eurn_asset_id"
5151
5252 let kStakingAssets = "staking_assets"
5353
5454 let kOracleActive = "active_all_contracts"
5555
5656 let kOracleActiveExchangers = "active_global_exchangers"
5757
5858 let kDiscounts = "discounts"
5959
6060 let kDiscountValues = "discount_values"
6161
6262 let kUserGSwopInGov = "_GSwop_amount"
6363
6464 let kUserSwopInGov = "_SWOP_amount"
6565
6666 let kOraclePool = "pool_"
6767
6868 let kAdminPubKey1 = "admin_pub_1"
6969
7070 let kAdminPubKey2 = "admin_pub_2"
7171
7272 let kAdminPubKey3 = "admin_pub_3"
7373
7474 let kAdminInvokePubKey = "admin_invoke_pub"
7575
7676 let kMoneyBoxAddress = "money_box_address"
7777
7878 let kVotingAddress = "voting_address"
7979
8080 let kGovAddress = "governance_address"
8181
8282 let kFarmingAddress = "farming_address"
8383
8484 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
8585
8686 func getBase58FromOracle (key) = match getString(oracle, key) {
8787 case string: String =>
8888 fromBase58String(string)
8989 case nothing =>
9090 throw((key + "is empty"))
9191 }
9292
9393
9494 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
9595
9696 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
9797
9898 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
9999
100100 let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
101101
102102 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
103103
104104 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
105105
106106 let govAddress = Address(getBase58FromOracle(kGovAddress))
107107
108108 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
109109
110110 let USDN = getBase58FromOracle(kUSDNAssetId)
111111
112112 let EURN = getBase58FromOracle(kEURNAssetId)
113113
114114 let stakingAssets = getStringValue(oracle, kStakingAssets)
115115
116116 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
117117
118118 let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
119119
120120 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
121121
122122 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
123123
124124 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
125125
126126 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
127127
128128 let active = if (getBooleanValue(oracle, kOracleActive))
129129 then getBooleanValue(oracle, kOracleActiveExchangers)
130130 else false
131131
132132 let feeScale6 = 1000000
133133
134134 let scale8 = 100000000
135135
136136 func accountBalance (assetId,pool) = match assetId {
137137 case id: ByteVector =>
138138 assetBalance(pool, id)
139139 case waves: Unit =>
140140 wavesBalance(pool).available
141141 case _ =>
142142 throw("Match error")
143143 }
144144
145145
146146 func stakedAmount (assetId,pool) = {
147147 let stakedAmountCalculated = match assetId {
148148 case aId: ByteVector =>
149149 if ((aId == USDN))
150150 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(pool)))
151151 else if ((aId == EURN))
152152 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(pool)))
153153 else 0
154154 case _: Unit =>
155155 valueOrElse(getInteger(pool, kLeasingAmount), 0)
156156 case _ =>
157157 throw("Match error")
158158 }
159159 match stakedAmountCalculated {
160160 case i: Int =>
161161 i
162162 case _ =>
163163 0
164164 }
165165 }
166166
167167
168168 func getAssetInfo (assetId) = match assetId {
169169 case id: String|ByteVector =>
170170 let $t040054177 = match id {
171171 case aId: ByteVector =>
172172 $Tuple2(toBase58String(aId), aId)
173173 case aId: String =>
174174 $Tuple2(aId, fromBase58String(aId))
175175 case _ =>
176176 throw("Match error")
177177 }
178178 let stringId = $t040054177._1
179179 let bytesId = $t040054177._2
180180 let info = valueOrErrorMessage(assetInfo(bytesId), (("Asset " + stringId) + " doesn't exist"))
181181 $Tuple3(stringId, info.name, info.decimals)
182182 case waves: Unit =>
183183 $Tuple3("WAVES", "WAVES", 8)
184184 case _ =>
185185 throw("Match error")
186186 }
187187
188188
189189 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
190190
191191
192192 func calculateFeeDiscount (userAddr) = {
193193 let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
194194 let gSwopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserGSwopInGov)), 0)
195195 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
196196 let discounts = split(getStringValue(oracle, kDiscounts), ",")
197197 if (if ((gSwopAmount >= parseIntValue(discountValues[0])))
198198 then (parseIntValue(discountValues[1]) > gSwopAmount)
199199 else false)
200200 then (feeScale6 - parseIntValue(discounts[0]))
201201 else if (if ((gSwopAmount >= parseIntValue(discountValues[1])))
202202 then (parseIntValue(discountValues[2]) > gSwopAmount)
203203 else false)
204204 then (feeScale6 - parseIntValue(discounts[1]))
205205 else if (if ((gSwopAmount >= parseIntValue(discountValues[2])))
206206 then (parseIntValue(discountValues[3]) > gSwopAmount)
207207 else false)
208208 then (feeScale6 - parseIntValue(discounts[2]))
209209 else if (if ((gSwopAmount >= parseIntValue(discountValues[3])))
210210 then (parseIntValue(discountValues[4]) > gSwopAmount)
211211 else false)
212212 then (feeScale6 - parseIntValue(discounts[3]))
213213 else if ((gSwopAmount >= parseIntValue(discountValues[4])))
214214 then (feeScale6 - parseIntValue(discounts[4]))
215215 else feeScale6
216216 }
217217
218218
219219 func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo,fee,feeGovernance) = {
220220 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
221221 let amountWithFee = fraction(amountWithoutFee, (feeScale6 - fee), feeScale6)
222222 let governanceReward = fraction(amountWithoutFee, feeGovernance, feeScale6)
223223 if ((minAmountToReceive > amountWithFee))
224224 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
225225 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
226226 }
227227
228228
229229 func calculateVirtGet (pmtAmount,balance,fee) = {
230230 let a = 1
231231 let b = (((balance + fraction(balance, (feeScale6 - fee), feeScale6)) + fraction(pmtAmount, (feeScale6 - fee), feeScale6)) - pmtAmount)
232232 let c = (-(toBigInt(balance)) * toBigInt(pmtAmount))
233233 let D = ((toBigInt(b) * toBigInt(b)) - ((toBigInt(4) * toBigInt(a)) * c))
234234 (toInt(((-(toBigInt(b)) + pow(D, 0, toBigInt(5), 1, 0, DOWN)) / toBigInt(2))) * a)
235235 }
236236
237237
238238 func parsePaymentAsset (assetId) = if ((assetId == base58''))
239239 then unit
240240 else assetId
241241
242242
243243 func suspendSuspicious (accountBalanceA,accountBalanceB,balanceA,balanceB,assetIdA,assetIdB) = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceA)) + " ") + assetIdA) + ", ") + toString(accountBalanceB)) + " ") + assetIdB) + ". State: ") + toString(balanceA)) + " ") + assetIdA) + ", ") + toString(balanceB)) + " ") + assetIdB))
244244
245245
246246 func isActive () = if (active)
247247 then unit
248248 else throw("DApp is inactive at this moment")
249249
250250
251251 func isOraclePool (poolAddress) = if (isDefined(getString(oracle, (kOraclePool + poolAddress))))
252252 then unit
253253 else throw("DApp is not registered pool")
254254
255255
256256 func getPoolBalances (pool,assetIdA,assetIdB) = {
257257 let balanceA = getIntegerValue(pool, kBalanceA)
258258 let balanceB = getIntegerValue(pool, kBalanceB)
259259 let stakedAmountA = stakedAmount(assetIdA, pool)
260260 let stakedAmountB = stakedAmount(assetIdB, pool)
261261 let accountBalanceA = (accountBalance(assetIdA, pool) + stakedAmountA)
262262 let accountBalanceB = (accountBalance(assetIdB, pool) + stakedAmountB)
263263 let shareSupply = getIntegerValue(pool, kShareAssetSupply)
264264 $Tuple5(balanceA, balanceB, accountBalanceA, accountBalanceB, shareSupply)
265265 }
266266
267267
268268 func getPoolAssets (pool) = {
269269 let strAssetIdA = getStringValue(pool, kAssetIdA)
270270 let strAssetIdB = getStringValue(pool, kAssetIdB)
271271 let assetIdA = if ((strAssetIdA == "WAVES"))
272272 then unit
273273 else fromBase58String(strAssetIdA)
274274 let assetIdB = if ((strAssetIdB == "WAVES"))
275275 then unit
276276 else fromBase58String(strAssetIdB)
277277 let shareAssetId = fromBase58String(getStringValue(pool, kShareAssetId))
278278 $Tuple5(strAssetIdA, strAssetIdB, assetIdA, assetIdB, shareAssetId)
279279 }
280280
281281
282282 func getFeeParams (pool,caller) = {
283283 let feeDiscount = calculateFeeDiscount(caller)
284284 let fee = fraction(getIntegerValue(pool, kFee), feeDiscount, feeScale6, CEILING)
285285 let govFee = fraction(fraction(fee, 40, 100), feeDiscount, feeScale6, CEILING)
286286 $Tuple2(fee, govFee)
287287 }
288288
289289
290290 @Callable(i)
291291 func init (callerBytes,args,pAmounts,pAssetIds) = {
292292 let caller = Address(callerBytes)
293293 let $t089969074 = $Tuple2(pAmounts[0], parsePaymentAsset(pAssetIds[0]))
294294 let pmtAmountA = $t089969074._1
295295 let pmtAssetIdA = $t089969074._2
296296 let $t090799157 = $Tuple2(pAmounts[1], parsePaymentAsset(pAssetIds[1]))
297297 let pmtAmountB = $t090799157._1
298298 let pmtAssetIdB = $t090799157._2
299299 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
300300 then throw("Only admin can call this function")
301301 else if (isDefined(getBoolean(caller, kActive)))
302302 then throw("DApp is already active")
303303 else if ((pmtAssetIdA == pmtAssetIdB))
304304 then throw("Assets must be different")
305305 else {
306306 let $t095279604 = getAssetInfo(pmtAssetIdA)
307307 let pmtStrAssetIdA = $t095279604._1
308308 let pmtAssetNameA = $t095279604._2
309309 let pmtDecimalsA = $t095279604._3
310310 let $t096139690 = getAssetInfo(pmtAssetIdB)
311311 let pmtStrAssetIdB = $t096139690._1
312312 let pmtAssetNameB = $t096139690._2
313313 let pmtDecimalsB = $t096139690._3
314314 let firstHarvest = (args[0] == "true")
315315 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
316316 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
317317 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
318318 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
319319 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
320320 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
321321 let shareInitialSupply = fraction(arg1, arg2, arg3)
322322 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
323323 let shareIssueId = calculateAssetId(shareIssue)
324324 let stake1 = if (contains(stakingAssets, pmtStrAssetIdA))
325325 then invoke(i.caller, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
326326 else 0
327327 if ((stake1 == stake1))
328328 then {
329329 let stake2 = if (contains(stakingAssets, pmtStrAssetIdB))
330330 then invoke(i.caller, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
331331 else 0
332332 if ((stake2 == stake2))
333333 then {
334334 let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(caller, shareInitialSupply, shareIssueId)]
335335 if (firstHarvest)
336336 then $Tuple2(nil, $Tuple2((baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]), nil))
337337 else $Tuple2(nil, $Tuple2(baseEntry, nil))
338338 }
339339 else throw("Strict value is not equal to itself.")
340340 }
341341 else throw("Strict value is not equal to itself.")
342342 }
343343 }
344344
345345
346346
347347 @Callable(i)
348348 func initWithInitRatio (callerBytes,args,pAmounts,pAssetIds) = {
349349 let caller = Address(callerBytes)
350350 let $t01193512135 = $Tuple5(parseIntValue(args[0]), parseIntValue(args[1]), args[2], args[3], (args[4] == "true"))
351351 let amtAssetA = $t01193512135._1
352352 let amtAssetB = $t01193512135._2
353353 let assetIdAStr = $t01193512135._3
354354 let assetIdBStr = $t01193512135._4
355355 let firstHarvest = $t01193512135._5
356356 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
357357 then throw("Only admin can call this function")
358358 else if (isDefined(getBoolean(caller, kActive)))
359359 then throw("DApp is already active")
360360 else if ((assetIdAStr == assetIdBStr))
361361 then throw("Assets must be different")
362362 else {
363363 let $t01250512582 = getAssetInfo(assetIdAStr)
364364 let pmtStrAssetIdA = $t01250512582._1
365365 let pmtAssetNameA = $t01250512582._2
366366 let pmtDecimalsA = $t01250512582._3
367367 let $t01259112668 = getAssetInfo(assetIdBStr)
368368 let pmtStrAssetIdB = $t01259112668._1
369369 let pmtAssetNameB = $t01259112668._2
370370 let pmtDecimalsB = $t01259112668._3
371371 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
372372 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
373373 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
374374 let shareInitialSupply = 0
375375 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
376376 let shareIssueId = calculateAssetId(shareIssue)
377377 let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceInitA, amtAssetA), IntegerEntry(kBalanceInitB, amtAssetB), IntegerEntry(kBalanceA, 0), IntegerEntry(kBalanceB, 0), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply)]
378378 if (firstHarvest)
379379 then $Tuple2(nil, $Tuple2((baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]), nil))
380380 else $Tuple2(nil, $Tuple2(baseEntry, nil))
381381 }
382382 }
383383
384384
385385
386386 @Callable(i)
387387 func keepLimitForFirstHarvest (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
388388 then throw("Only admin can call this function")
389389 else {
390390 let shareLimit = parseIntValue(args[0])
391391 $Tuple2(nil, $Tuple2([IntegerEntry(kShareLimit, shareLimit)], nil))
392392 }))
393393
394394
395395
396396 @Callable(i)
397397 func exchange (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
398398 let caller = Address(callerBytes)
399399 let $t01499315069 = $Tuple2(pAmounts[0], parsePaymentAsset(pAssetIds[0]))
400400 let pmtAmount = $t01499315069._1
401401 let pmtAssetId = $t01499315069._2
402402 let minAmountToReceive = parseIntValue(args[0])
403403 let $t01514215218 = getPoolAssets(i.caller)
404404 let strAssetIdA = $t01514215218._1
405405 let strAssetIdB = $t01514215218._2
406406 let assetIdA = $t01514215218._3
407407 let assetIdB = $t01514215218._4
408408 let $t01523115337 = getPoolBalances(i.caller, assetIdA, assetIdB)
409409 let balanceA = $t01523115337._1
410410 let balanceB = $t01523115337._2
411411 let accountBalanceA = $t01523115337._3
412412 let accountBalanceB = $t01523115337._4
413413 if (if ((balanceA == 0))
414414 then true
415415 else (balanceB == 0))
416416 then throw("Can't exchange with zero balance")
417417 else if ((0 >= minAmountToReceive))
418418 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
419419 else if ((size(pAmounts) != 1))
420420 then throw("One attached payment expected")
421421 else if (!(containsElement([assetIdA, assetIdB], pmtAssetId)))
422422 then throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
423423 else if (if ((balanceA > accountBalanceA))
424424 then true
425425 else (balanceB > accountBalanceB))
426426 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
427427 else {
428428 let $t01622216280 = getFeeParams(i.caller, i.originCaller)
429429 let fee = $t01622216280._1
430430 let govFee = $t01622216280._2
431431 let $t01629716634 = if ((pmtAssetId == assetIdA))
432432 then calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB, fee, govFee)
433433 else calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA, fee, govFee)
434434 let amountWithoutFee = $t01629716634._1
435435 let amountWithFee = $t01629716634._2
436436 let governanceReward = $t01629716634._3
437437 let $t01665216977 = if ((pmtAssetId == assetIdA))
438438 then $Tuple3((balanceA + pmtAmount), ((balanceB - amountWithFee) - governanceReward), assetIdB)
439439 else $Tuple3(((balanceA - amountWithFee) - governanceReward), (balanceB + pmtAmount), assetIdA)
440440 let newBalanceA = $t01665216977._1
441441 let newBalanceB = $t01665216977._2
442442 let assetIdSend = $t01665216977._3
443443 let $t01699517245 = if ((pmtAssetId == assetIdA))
444444 then $Tuple2(pmtAmount, (amountWithFee + governanceReward))
445445 else $Tuple2((amountWithFee + governanceReward), pmtAmount)
446446 let stakeAmountA = $t01699517245._1
447447 let stakeAmountB = $t01699517245._2
448448 let stake1 = if (contains(stakingAssets, strAssetIdA))
449449 then invoke(i.caller, "stakeUnstake", [(pmtAssetId == assetIdA), stakeAmountA, strAssetIdA], nil)
450450 else 0
451451 if ((stake1 == stake1))
452452 then {
453453 let stake2 = if (contains(stakingAssets, strAssetIdB))
454454 then invoke(i.caller, "stakeUnstake", [(pmtAssetId == assetIdB), stakeAmountB, strAssetIdB], nil)
455455 else 0
456456 if ((stake2 == stake2))
457457 then $Tuple2(nil, $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], [amountWithFee, assetIdSend]))
458458 else throw("Strict value is not equal to itself.")
459459 }
460460 else throw("Strict value is not equal to itself.")
461461 }
462462 }))
463463
464464
465465
466466 @Callable(i)
467467 func replenishWithTwoTokens (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
468468 let caller = Address(callerBytes)
469469 let pmtAssetIdA = parsePaymentAsset(pAssetIds[0])
470470 let pmtAssetIdB = parsePaymentAsset(pAssetIds[1])
471471 let stakeFarming = (args[0] == "true")
472472 let lockType = parseIntValue(args[1])
473473 let $t01850818598 = getPoolAssets(i.caller)
474474 let strAssetIdA = $t01850818598._1
475475 let strAssetIdB = $t01850818598._2
476476 let assetIdA = $t01850818598._3
477477 let assetIdB = $t01850818598._4
478478 let shareAssetId = $t01850818598._5
479479 let $t01861118735 = getPoolBalances(i.caller, assetIdA, assetIdB)
480480 let balanceA = $t01861118735._1
481481 let balanceB = $t01861118735._2
482482 let accountBalanceA = $t01861118735._3
483483 let accountBalanceB = $t01861118735._4
484484 let shareAssetSupply = $t01861118735._5
485485 if (if ((size(pAmounts) != 2))
486486 then (size(pAmounts) != 3)
487487 else false)
488488 then throw("Two or three payments expected")
489489 else if (if ((pmtAssetIdA != assetIdA))
490490 then true
491491 else (pmtAssetIdB != assetIdB))
492492 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
493493 else if (if ((balanceA > accountBalanceA))
494494 then true
495495 else (balanceB > accountBalanceB))
496496 then $Tuple2(nil, ([ScriptTransfer(caller, pAmounts[0], pmtAssetIdA), ScriptTransfer(caller, pAmounts[1], pmtAssetIdB)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
497497 else {
498498 let $t01943319510 = getAssetInfo(pmtAssetIdA)
499499 let pmtStrAssetIdA = $t01943319510._1
500500 let pmtAssetNameA = $t01943319510._2
501501 let pmtDecimalsA = $t01943319510._3
502502 let $t01952719604 = getAssetInfo(pmtAssetIdB)
503503 let pmtStrAssetIdB = $t01952719604._1
504504 let pmtAssetNameB = $t01952719604._2
505505 let pmtDecimalsB = $t01952719604._3
506506 let initial = ((balanceA + balanceB) == 0)
507507 let $t01967920522 = if (initial)
508508 then $Tuple5(pAmounts[0], pAmounts[1], 0, pmtAssetIdA, 1)
509509 else {
510510 let ratioShareTokensInA = fraction(scale8, pAmounts[0], balanceA)
511511 let ratioShareTokensInB = fraction(scale8, pAmounts[1], balanceB)
512512 if ((ratioShareTokensInB > ratioShareTokensInA))
513513 then {
514514 let pmt = fraction(pAmounts[0], balanceB, balanceA)
515515 $Tuple5(pAmounts[0], pmt, (pAmounts[1] - pmt), pmtAssetIdB, ratioShareTokensInA)
516516 }
517517 else {
518518 let pmt = fraction(pAmounts[1], balanceA, balanceB)
519519 $Tuple5(pmt, pAmounts[1], (pAmounts[0] - pmt), pmtAssetIdA, ratioShareTokensInB)
520520 }
521521 }
522522 let pmtAmountA = $t01967920522._1
523523 let pmtAmountB = $t01967920522._2
524524 let change = $t01967920522._3
525525 let changeAssetId = $t01967920522._4
526526 let shareTokenRatio = $t01967920522._5
527527 let shareTokenToPayAmount = if (initial)
528528 then {
529529 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
530530 fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
531531 }
532532 else fraction(shareTokenRatio, shareAssetSupply, scale8)
533533 if ((shareTokenToPayAmount == 0))
534534 then throw("Too small amount to replenish")
535535 else if ((0 > change))
536536 then throw("Change < 0")
537537 else {
538538 let stake1 = if (contains(stakingAssets, pmtStrAssetIdA))
539539 then invoke(i.caller, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
540540 else 0
541541 if ((stake1 == stake1))
542542 then {
543543 let stake2 = if (contains(stakingAssets, pmtStrAssetIdB))
544544 then invoke(i.caller, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
545545 else 0
546546 if ((stake2 == stake2))
547547 then {
548548 let shareTokenST = if (stakeFarming)
549549 then {
550550 let stPayments = ([AttachedPayment(shareAssetId, shareTokenToPayAmount)] ++ (if ((size(pAmounts) == 3))
551551 then [AttachedPayment(pAssetIds[2], pAmounts[2])]
552552 else nil))
553553 let reissue = invoke(i.caller, "reissueShareToken", [shareTokenToPayAmount], nil)
554554 if ((reissue == reissue))
555555 then {
556556 let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller), lockType], stPayments)
557557 if ((stake3 == stake3))
558558 then nil
559559 else throw("Strict value is not equal to itself.")
560560 }
561561 else throw("Strict value is not equal to itself.")
562562 }
563563 else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(caller, shareTokenToPayAmount, shareAssetId)]
564564 $Tuple2(nil, $Tuple2(([IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(caller, change, changeAssetId)] ++ shareTokenST), nil))
565565 }
566566 else throw("Strict value is not equal to itself.")
567567 }
568568 else throw("Strict value is not equal to itself.")
569569 }
570570 }
571571 }))
572572
573573
574574
575575 @Callable(i)
576576 func replenishWithOneToken (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
577577 let caller = Address(callerBytes)
578578 let pmtAssetId = parsePaymentAsset(pAssetIds[0])
579579 let pmtAmount = pAmounts[0]
580580 let virtGetMinAmount = parseIntValue(args[0])
581581 let stakeFarming = (args[1] == "true")
582582 let lockType = parseIntValue(args[1])
583583 let $t02336323453 = getPoolAssets(i.caller)
584584 let strAssetIdA = $t02336323453._1
585585 let strAssetIdB = $t02336323453._2
586586 let assetIdA = $t02336323453._3
587587 let assetIdB = $t02336323453._4
588588 let shareAssetId = $t02336323453._5
589589 let $t02346623590 = getPoolBalances(i.caller, assetIdA, assetIdB)
590590 let balanceA = $t02346623590._1
591591 let balanceB = $t02346623590._2
592592 let accountBalanceA = $t02346623590._3
593593 let accountBalanceB = $t02346623590._4
594594 let shareAssetSupply = $t02346623590._5
595595 let initial = ((balanceA + balanceB) == 0)
596596 if (if ((size(pAmounts) != 1))
597597 then (size(pAmounts) != 2)
598598 else false)
599599 then throw("Two or one attached assets expected")
600600 else if (if ((pmtAssetId != assetIdA))
601601 then (pmtAssetId != assetIdB)
602602 else false)
603603 then throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
604604 else if (initial)
605605 then throw("For initial exchanger you need to use two tokens")
606606 else if (if ((balanceA > accountBalanceA))
607607 then true
608608 else (balanceB > accountBalanceB))
609609 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
610610 else {
611611 let $t02437524433 = getFeeParams(i.caller, i.originCaller)
612612 let fee = $t02437524433._1
613613 let govFee = $t02437524433._2
614614 let $t02445026336 = if ((pmtAssetId == assetIdA))
615615 then {
616616 let virtPayAmount = calculateVirtGet(pmtAmount, balanceA, fee)
617617 let $t02472924866 = calculateFees(virtPayAmount, virtGetMinAmount, balanceA, balanceB, fee, govFee)
618618 let amountWithoutFee = $t02472924866._1
619619 let amountWithFee = $t02472924866._2
620620 let governanceReward = $t02472924866._3
621621 let newBalanceA = (balanceA + pmtAmount)
622622 let newBalanceB = (balanceB - governanceReward)
623623 let ratioShareTokensInA = fraction((pmtAmount - virtPayAmount), scale8, newBalanceA)
624624 let ratioShareTokensInB = fraction(amountWithFee, scale8, newBalanceB)
625625 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
626626 $Tuple7(newBalanceA, newBalanceB, shareTokenToPayAmount, governanceReward, assetIdB, strAssetIdB, strAssetIdA)
627627 }
628628 else {
629629 let virtPayAmount = calculateVirtGet(pmtAmount, balanceB, fee)
630630 let $t02560125738 = calculateFees(virtPayAmount, virtGetMinAmount, balanceB, balanceA, fee, govFee)
631631 let amountWithoutFee = $t02560125738._1
632632 let amountWithFee = $t02560125738._2
633633 let governanceReward = $t02560125738._3
634634 let newBalanceA = (balanceA - governanceReward)
635635 let newBalanceB = (balanceB + pmtAmount)
636636 let ratioShareTokensInA = fraction(amountWithFee, scale8, newBalanceA)
637637 let ratioShareTokensInB = fraction((pmtAmount - virtPayAmount), scale8, newBalanceB)
638638 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
639639 $Tuple7(newBalanceA, newBalanceB, shareTokenToPayAmount, governanceReward, assetIdA, strAssetIdA, strAssetIdB)
640640 }
641641 let newBalanceA = $t02445026336._1
642642 let newBalanceB = $t02445026336._2
643643 let shareTokenToPayAmount = $t02445026336._3
644644 let govReward = $t02445026336._4
645645 let govRewardAsset = $t02445026336._5
646646 let govRewardAssetStr = $t02445026336._6
647647 let pmtAssetIdStr = $t02445026336._7
648648 if ((shareTokenToPayAmount == 0))
649649 then throw("Too small amount to replenish")
650650 else {
651651 let stake1 = if (contains(stakingAssets, pmtAssetIdStr))
652652 then invoke(i.caller, "stakeUnstake", [true, pmtAmount, pmtAssetIdStr], nil)
653653 else 0
654654 if ((stake1 == stake1))
655655 then {
656656 let stake2 = if (contains(stakingAssets, govRewardAssetStr))
657657 then invoke(i.caller, "stakeUnstake", [false, govReward, govRewardAssetStr], nil)
658658 else 0
659659 if ((stake2 == stake2))
660660 then {
661661 let shareTokenST = if (stakeFarming)
662662 then {
663663 let stPayments = ([AttachedPayment(shareAssetId, shareTokenToPayAmount)] ++ (if ((size(pAmounts) == 2))
664664 then [AttachedPayment(pAssetIds[1], pAmounts[1])]
665665 else nil))
666666 let reissue = invoke(i.caller, "reissueShareToken", [shareTokenToPayAmount], nil)
667667 if ((reissue == reissue))
668668 then {
669669 let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller), lockType], stPayments)
670670 if ((stake3 == stake3))
671671 then nil
672672 else throw("Strict value is not equal to itself.")
673673 }
674674 else throw("Strict value is not equal to itself.")
675675 }
676676 else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(caller, shareTokenToPayAmount, shareAssetId)]
677677 $Tuple2(nil, $Tuple2(([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(moneyBoxAddress, govReward, govRewardAsset)] ++ shareTokenST), nil))
678678 }
679679 else throw("Strict value is not equal to itself.")
680680 }
681681 else throw("Strict value is not equal to itself.")
682682 }
683683 }
684684 }))
685685
686686
687687
688688 @Callable(i)
689689 func withdraw (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
690690 let caller = Address(callerBytes)
691691 let $t02838328473 = getPoolAssets(i.caller)
692692 let strAssetIdA = $t02838328473._1
693693 let strAssetIdB = $t02838328473._2
694694 let assetIdA = $t02838328473._3
695695 let assetIdB = $t02838328473._4
696696 let shareAssetId = $t02838328473._5
697697 let $t02848628610 = getPoolBalances(i.caller, assetIdA, assetIdB)
698698 let balanceA = $t02848628610._1
699699 let balanceB = $t02848628610._2
700700 let accountBalanceA = $t02848628610._3
701701 let accountBalanceB = $t02848628610._4
702702 let shareAssetSupply = $t02848628610._5
703703 let $t02862329031 = if ((size(pAmounts) == 1))
704704 then {
705705 let pAsset = parsePaymentAsset(pAssetIds[0])
706706 if ((pAsset != shareAssetId))
707707 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
708708 else $Tuple2(pAmounts[0], pAsset)
709709 }
710710 else $Tuple2(0, shareAssetId)
711711 let pmtAmount = $t02862329031._1
712712 let pmtAssetId = $t02862329031._2
713713 if ((size(pAmounts) > 1))
714714 then throw("One attached payment expected")
715715 else if (if ((balanceA > accountBalanceA))
716716 then true
717717 else (balanceB > accountBalanceB))
718718 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
719719 else {
720720 let unlockAmount = parseIntValue(valueOrElse(args[0], "0"))
721721 let unlock = if ((unlockAmount > 0))
722722 then invoke(farmingAddress, "withdrawShareTokens", [toString(i.caller), unlockAmount], nil)
723723 else 0
724724 if ((unlock == unlock))
725725 then {
726726 let withdrawAmount = (pmtAmount + unlockAmount)
727727 let amountToPayA = fraction(withdrawAmount, balanceA, shareAssetSupply)
728728 let amountToPayB = fraction(withdrawAmount, balanceB, shareAssetSupply)
729729 let stake1 = if (contains(stakingAssets, strAssetIdA))
730730 then invoke(i.caller, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
731731 else 0
732732 if ((stake1 == stake1))
733733 then {
734734 let stake2 = if (contains(stakingAssets, strAssetIdB))
735735 then invoke(i.caller, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
736736 else 0
737737 if ((stake2 == stake2))
738738 then $Tuple2([ScriptTransfer(i.caller, unlockAmount, shareAssetId)], $Tuple2([IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - withdrawAmount)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(caller, amountToPayA, assetIdA), ScriptTransfer(caller, amountToPayB, assetIdB)], nil))
739739 else throw("Strict value is not equal to itself.")
740740 }
741741 else throw("Strict value is not equal to itself.")
742742 }
743743 else throw("Strict value is not equal to itself.")
744744 }
745745 }))
746746
747747
748748
749749 @Callable(i)
750750 func withdrawOneToken (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
751751 let caller = Address(callerBytes)
752752 let withdrawAsset = if ((args[0] == ""))
753753 then unit
754754 else fromBase58String(args[0])
755755 let $t03123931329 = getPoolAssets(i.caller)
756756 let strAssetIdA = $t03123931329._1
757757 let strAssetIdB = $t03123931329._2
758758 let assetIdA = $t03123931329._3
759759 let assetIdB = $t03123931329._4
760760 let shareAssetId = $t03123931329._5
761761 let $t03134231466 = getPoolBalances(i.caller, assetIdA, assetIdB)
762762 let balanceA = $t03134231466._1
763763 let balanceB = $t03134231466._2
764764 let accountBalanceA = $t03134231466._3
765765 let accountBalanceB = $t03134231466._4
766766 let shareAssetSupply = $t03134231466._5
767767 let $t03147931859 = if ((size(pAmounts) == 1))
768768 then {
769769 let pAsset = parsePaymentAsset(pAssetIds[0])
770770 if ((pAsset != shareAssetId))
771771 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
772772 else $Tuple2(pAmounts[0], pAsset)
773773 }
774774 else $Tuple2(0, shareAssetId)
775775 let pmtAmount = $t03147931859._1
776776 let pmtAssetId = $t03147931859._2
777777 let virtMinToRecive = parseIntValue(args[1])
778778 if ((size(pAmounts) != 1))
779779 then throw("One attached payment expected")
780780 else if ((pmtAssetId != shareAssetId))
781781 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
782782 else if (!(containsElement([assetIdA, assetIdB], withdrawAsset)))
783783 then throw("Incorrect withdraw asset.")
784784 else if (if ((balanceA > accountBalanceA))
785785 then true
786786 else (balanceB > accountBalanceB))
787787 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
788788 else {
789789 let unlockAmount = parseIntValue(valueOrElse(args[2], "0"))
790790 let unlock = if ((unlockAmount > 0))
791791 then invoke(farmingAddress, "withdrawShareTokens", [toString(i.caller), unlockAmount], nil)
792792 else 0
793793 if ((unlock == unlock))
794794 then {
795795 let withdrawAmount = (pmtAmount + unlockAmount)
796796 let amountToPayA = fraction(withdrawAmount, balanceA, shareAssetSupply)
797797 let amountToPayB = fraction(withdrawAmount, balanceB, shareAssetSupply)
798798 let $t03310433162 = getFeeParams(i.caller, i.originCaller)
799799 let fee = $t03310433162._1
800800 let govFee = $t03310433162._2
801- let $t03317933519 = if ((withdrawAsset == assetIdA))
802- then calculateFees(amountToPayB, virtMinToRecive, balanceB, balanceA, fee, govFee)
803- else calculateFees(amountToPayA, virtMinToRecive, balanceA, balanceB, fee, govFee)
804- let amountWithoutFee = $t03317933519._1
805- let amountWithFee = $t03317933519._2
806- let governanceReward = $t03317933519._3
807- let $t03353634882 = if ((withdrawAsset == assetIdA))
801+ let $t03317933579 = if ((withdrawAsset == assetIdA))
802+ then calculateFees(amountToPayB, virtMinToRecive, (balanceB - amountToPayB), (balanceA - amountToPayA), fee, govFee)
803+ else calculateFees(amountToPayA, virtMinToRecive, (balanceA - amountToPayA), (balanceB - amountToPayB), fee, govFee)
804+ let amountWithoutFee = $t03317933579._1
805+ let amountWithFee = $t03317933579._2
806+ let governanceReward = $t03317933579._3
807+ let $t03359634942 = if ((withdrawAsset == assetIdA))
808808 then {
809809 let unstake = if (contains(stakingAssets, strAssetIdA))
810810 then invoke(i.caller, "stakeUnstake", [false, ((amountToPayA + amountWithFee) + governanceReward), strAssetIdA], nil)
811811 else 0
812812 if ((unstake == unstake))
813813 then $Tuple4((((balanceA - amountToPayA) - amountWithFee) - governanceReward), balanceB, assetIdA, [ScriptTransfer(caller, (amountToPayA + amountWithFee), assetIdA)])
814814 else throw("Strict value is not equal to itself.")
815815 }
816816 else {
817817 let unstake = if (contains(stakingAssets, strAssetIdB))
818818 then invoke(i.caller, "stakeUnstake", [false, ((amountToPayB + amountWithFee) + governanceReward), strAssetIdB], nil)
819819 else 0
820820 if ((unstake == unstake))
821821 then $Tuple4(balanceA, (((balanceB - amountToPayB) - amountWithFee) - governanceReward), assetIdB, [ScriptTransfer(caller, (amountToPayB + amountWithFee), assetIdB)])
822822 else throw("Strict value is not equal to itself.")
823823 }
824- let newBalanceA = $t03353634882._1
825- let newBalanceB = $t03353634882._2
826- let govRewardAssetId = $t03353634882._3
827- let userTransfer = $t03353634882._4
824+ let newBalanceA = $t03359634942._1
825+ let newBalanceB = $t03359634942._2
826+ let govRewardAssetId = $t03359634942._3
827+ let userTransfer = $t03359634942._4
828828 $Tuple2([ScriptTransfer(i.caller, unlockAmount, shareAssetId)], $Tuple2(([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply - withdrawAmount)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceReward, govRewardAssetId)] ++ userTransfer), nil))
829829 }
830830 else throw("Strict value is not equal to itself.")
831831 }
832832 }))
833833
834834
835835
836836 @Callable(i)
837837 func takeIntoAccountExtraFunds (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
838- let $t03560735683 = getPoolAssets(i.caller)
839- let strAssetIdA = $t03560735683._1
840- let strAssetIdB = $t03560735683._2
841- let assetIdA = $t03560735683._3
842- let assetIdB = $t03560735683._4
843- let $t03569635802 = getPoolBalances(i.caller, assetIdA, assetIdB)
844- let balanceA = $t03569635802._1
845- let balanceB = $t03569635802._2
846- let accountBalanceA = $t03569635802._3
847- let accountBalanceB = $t03569635802._4
838+ let $t03566735743 = getPoolAssets(i.caller)
839+ let strAssetIdA = $t03566735743._1
840+ let strAssetIdB = $t03566735743._2
841+ let assetIdA = $t03566735743._3
842+ let assetIdB = $t03566735743._4
843+ let $t03575635862 = getPoolBalances(i.caller, assetIdA, assetIdB)
844+ let balanceA = $t03575635862._1
845+ let balanceB = $t03575635862._2
846+ let accountBalanceA = $t03575635862._3
847+ let accountBalanceB = $t03575635862._4
848848 let amountEnrollA = (accountBalanceA - balanceA)
849849 let amountEnrollB = (accountBalanceB - balanceB)
850850 if ((moneyBoxAddress != i.originCaller))
851851 then throw("Only the wallet can call this function")
852852 else if (if ((0 > amountEnrollA))
853853 then true
854854 else (0 > amountEnrollB))
855855 then suspend("Enroll amount negative")
856856 else if (if ((amountEnrollA == 0))
857857 then (amountEnrollB == 0)
858858 else false)
859859 then throw("No money to take")
860860 else {
861861 let stake1 = if (if (contains(stakingAssets, strAssetIdA))
862862 then (amountEnrollA > 0)
863863 else false)
864864 then invoke(i.caller, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
865865 else 0
866866 if ((stake1 == stake1))
867867 then {
868868 let stake2 = if (if (contains(stakingAssets, strAssetIdB))
869869 then (amountEnrollB > 0)
870870 else false)
871871 then invoke(i.caller, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
872872 else 0
873873 if ((stake2 == stake2))
874874 then $Tuple2(nil, $Tuple2([IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB))], nil))
875875 else throw("Strict value is not equal to itself.")
876876 }
877877 else throw("Strict value is not equal to itself.")
878878 }
879879 }))
880880
881881
882882 @Verifier(tx)
883883 func verify () = {
884884 let multiSignedByAdmins = {
885885 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
886886 then 1
887887 else 0
888888 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
889889 then 1
890890 else 0
891891 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
892892 then 1
893893 else 0
894894 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
895895 }
896896 multiSignedByAdmins
897897 }
898898

github/deemru/w8io/873ac7e 
207.86 ms